PatientDesk Alania and Duyu (Turkish voice)
Alania and Duyu are two voice models built for Turkish by PatientDesk. Alania turns text into speech; Duyu transcribes recordings into text. The models' technical details and benchmark results are on the developer's own site: speech.patientdesk.ai.
Both models are free until October 25, 2026 and are retired on that date (see Retirement).
Models
Section titled “Models”| Model | Task | Endpoint |
|---|---|---|
patientdesk/alania-v1 |
Text to speech (TTS) | POST /v1/audio/speech |
patientdesk/duyu-1 |
Speech to text (STT) | POST /v1/audio/transcriptions |
Text to speech: Alania
Section titled “Text to speech: Alania”curl "$LLMTR_BASE_URL/v1/audio/speech" \ -H "Authorization: Bearer llmtr-your_key" \ -H "Content-Type: application/json" \ -d '{ "model": "patientdesk/alania-v1", "input": "Randevunuz yarın saat 14:05 için oluşturuldu. Lütfen on dakika önce gelin.", "voice": "alania", "response_format": "mp3" }' \ --output appointment.mp3| Field | Required | Description |
|---|---|---|
model |
Yes | patientdesk/alania-v1 |
input |
Yes | The text to speak, up to 5,000 characters. Split longer text across several requests. |
voice |
No | There is one voice: alania (the default). |
response_format |
No | wav (default; 24 kHz, mono, 16-bit), mp3, opus, flac, aac or pcm (headerless 16-bit; the sample rate comes in Content-Type: audio/L16; rate=24000). |
temperature |
No | Defaults to 0.30. Raising it varies the delivery and makes the voice less consistent. |
seed |
No | Passed to the provider. The same text with the same seed is not guaranteed to produce the same audio. |
The response is the audio file itself; Content-Type names the format you chose (audio/wav, audio/mpeg, and so on). The audio comes back in one piece once it has been generated; the stream field is ignored. The wait grows with the length of the text and can run to minutes for long texts, so set your client's read timeout accordingly.
Every response carries an X-Disclosure: ai-generated header. Telling your listeners that the audio is AI-generated is your responsibility.
Speech to text: Duyu
Section titled “Speech to text: Duyu”The audio is sent base64-encoded in a JSON body:
AUDIO_B64=$(base64 < recording.m4a | tr -d '\n')printf '{"model":"patientdesk/duyu-1","audio_format":"m4a","language":"tr","audio_base64":"%s"}' \ "$AUDIO_B64" > request.json
curl "$LLMTR_BASE_URL/v1/audio/transcriptions" \ -H "Authorization: Bearer llmtr-your_key" \ -H "Content-Type: application/json" \ --data @request.json{ "text": "Randevumuz yarın saat 14.05 için oluşturuldu. Lütfen 10 dakika önce gelin." }| Field | Required | Description |
|---|---|---|
model |
Yes | patientdesk/duyu-1 |
audio_base64 |
Yes | Base64-encoded audio. Limited to about 9 MB of audio per request. |
audio_format |
No | wav, mp3, m4a, webm, ogg or flac. When omitted it is detected from the file's first bytes; if it cannot be detected the request is rejected with 400. |
language |
No | tr (default) or auto. The model is built for Turkish. |
prompt |
No | A spelling hint: drug names, person names or the format of ID numbers improve accuracy. |
response_format |
No | json (default), text, verbose_json, srt or vtt. |
timestamp_granularities |
No | ["segment"], ["word"] or both. Only with verbose_json. |
temperature |
No | Between 0 and 1, defaults to 0. |
This model does not accept file_id, and the OpenAI SDK's file-upload (multipart) call does not work on this endpoint; send the request as JSON as shown above.
Output formats
Section titled “Output formats”verbose_json with timestamp_granularities: ["word"]:
{ "task": "transcribe", "language": "tr", "duration": 8.533, "text": "Randevumuz yarın saat 14.05 için oluşturuldu. Lütfen 10 dakika önce gelin.", "segments": [ { "id": 0, "start": 0.0, "end": 8.288, "text": "Randevumuz yarın saat 14.05 için oluşturuldu. Lütfen 10 dakika önce gelin." } ], "words": [ { "word": "Randevumuz", "start": 0.0, "end": 0.968, "probability": 0.872 }, { "word": "yarın", "start": 0.968, "end": 2.888, "probability": 0.995 } ]}srt:
100:00:00,000 --> 00:00:08,288Randevumuz yarın saat 14.05 için oluşturuldu. Lütfen 10 dakika önce gelin.text returns plain text and vtt returns WebVTT subtitles.
Free period and daily limit
Section titled “Free period and daily limit”Until October 25, 2026 both models run without charging your balance. During this period there is a daily limit per user:
| Model | Daily limit |
|---|---|
patientdesk/alania-v1 |
20,000 characters |
patientdesk/duyu-1 |
30 minutes of audio |
The limits reset every day at 00:00 (Istanbul). On Alania the length of the text is known up front, so a request that would exceed the limit is rejected before it is sent. On Duyu the length of a recording is known only after it has been processed: a request is accepted as long as the limit has not been reached and the whole recording is counted; requests after the limit is reached are rejected.
A rejected request returns 429. The Retry-After header and the error.details.resetAt field tell you when you can try again:
{ "error": { "message": "This request would exceed your free daily allowance for this model (20,000 characters). 1,200 characters remain today. It resets at 00:00 Europe/Istanbul (2026-09-26 21:00 UTC).", "type": "rate_limit_error", "details": { "reason": "free_quota_exhausted", "scope": "user", "resetAt": "2026-09-26T21:00:00.000Z", "retryAfterSeconds": 3600 } }}You can get a 429 before reaching your own limit: during the free period there is also a daily total shared by all users. In that case scope is pool and the reset time is the same.
Retirement
Section titled “Retirement”From October 25, 2026 00:00 (Istanbul), both models answer requests with 410 model_retired. The error body suggests a metered model on the same endpoint. Your requests are not silently routed to another model; nothing is charged to your account until you change the model id yourself.
- For text to speech,
xai/grok-voice-tts: thelanguagefield is required (for example"tr"), it reads the audio format fromoutput_formatrather thanresponse_format, and it has its own voices; thealaniavoice does not exist there. - For speech to text,
xai/grok-voice-stt: it accepts the sameaudio_base64request and always answers in JSON (notext,srtorvtt).
The text and audio in your request are sent to PatientDesk for processing. According to PatientDesk's privacy policy, audio is processed in memory and discarded right after the response, transcripts are not stored, and the model runs in the Netherlands (EU). The policy does not say whether the text sent to Alania to be read aloud is stored. For these models LLMTR does not write the text, the audio or the transcript to the usage log; the log keeps the character count and the audio duration.
Errors
Section titled “Errors”| Status | When |
|---|---|
400 invalid_request |
input is over 5,000 characters, unknown voice, unsupported audio_format / language / response_format, audio whose format cannot be detected or that cannot be decoded. |
400 unsupported_input |
file_id was sent to Duyu. |
413 |
The audio file is larger or longer (2 hours) than the model accepts. Split the recording. |
429 rate_limit_error |
The daily free limit is used up. Retry-After gives the seconds until the reset. |
503 model_unavailable |
The model is temporarily busy or unavailable. If Retry-After is present, retry after that many seconds. |
410 model_retired |
After October 25, 2026 00:00 (Istanbul). |
For the general error format see Errors.