Text to speech in Korean: send Hangul text with language ko
For Korean text to speech, send the script in Hangul with the language set to ko. How Sume's TTS API reads Korean, checks the voice, and bills it.

To get text to speech in Korean, send the script written in Hangul and set the language to Korean (ko) explicitly. With the Sume API that is one POST /v1/tts-1.0/generate request carrying a Hangul transcript, a voice, and language: "ko". It runs as a job and returns the Korean speech as a Sume-hosted audio file.
The request fields come from the TTS schema in the Sume API reference, the OpenAPI document behind the API reference docs, read on 2026-09-27. Checks described as current behavior are read from Sume's code, and the price from the code behind API pricing. For the request in general, see Text to speech API; to burn the Korean words onto a video afterwards, see Korean subtitles API.
How do I send a Korean text to speech request?
Put the Korean script in transcript, 1 to 20,000 characters, and name the language with its BCP-47 / ISO-639 code, ko. Pick the voice with the avatar_id or avatar_handle of an avatar whose voice is ready, or with a Sume voice.id you already hold: a voice UUID or a Voices library id (voi_ plus 32 hex characters).
The default async mode answers at once with status_url and result_url. As the Jobs and results docs describe, poll status_url until terminal is true, then read result_url; completed results expose the audio as media.sume.com artifacts.
curl -X POST https://api.sume.com/v1/tts-1.0/generate \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: tts-ko-welcome-001" \
-d '{
"transcript": "안녕하세요. 오늘은 새 기능을 소개합니다.",
"voice": { "id": "voi_0123456789abcdef0123456789abcdef" },
"language": "ko",
"output_format": { "container": "wav", "encoding": "pcm_s16le", "sample_rate": 44100 }
}'What happens if I leave out the language?
Omitted, language defaults to English at the provider, and Sume infers ko only as a fallback, from a Hangul-only transcript. In the current code that fallback counts characters and returns ko only when Hangul characters outnumber Latin letters, so a script crowded with English product names or URLs can fall back to English. Send language: "ko" with every Korean script.
The reverse mistake is refused. In the current code, language: "ko" with no Hangul syllable in the transcript fails with 400 tts_language_script_mismatch, so romanized Korean such as annyeonghaseyo is rejected. The error message asks you to check the original text and its encoding before retrying: Hangul garbled by a wrong encoding can lose every syllable, and then it fails the same way.
Which voice should read Korean?
The API reference publishes no list of Korean voices. What Sume checks is the voice's language. In the current code, when Sume has a primary language on record for the voice and it isn't Korean, the submit fails with 409 tts_voice_language_mismatch, and the message warns that pronunciation may sound unnatural. No job or charge has been created at that point.
- To keep that voice anyway, resend the same request and
Idempotency-Keywithconfirm_language_mismatch: true. Translate a video's voiceover by API walks through this double-check. - In the current code, a voice with no language on record is not checked, and an avatar's own voice is cloned with its language set to English. Listen to one short Korean line before you send a long script.
How is Korean text to speech billed?
Text to speech costs $0.0475 per 1,000 characters, plus a 5.5% agent fee by default. Usage counts transcript characters, spaces and punctuation included, and Korean has no rate of its own: in the current code the billed character count, like the result's character_count, is the transcript's length, where a Hangul syllable such as 한 is one character. Synthesized audio longer than 1,200 seconds fails with tts_duration_exceeded, and no credits are captured.
Why was my Korean TTS request refused?
Four checks can stop a Korean request. The first three answer at submit; the last fails the job without capturing credits.
| Response | Cause | Fix |
|---|---|---|
400 tts_language_script_mismatch | language: "ko" with no Hangul syllable in transcript (current code). | Send the script in Hangul and check its encoding. |
409 tts_voice_language_mismatch | The voice's primary language on record is not Korean (current code). | Pick another voice, or resend with confirm_language_mismatch: true. |
400 with invalid_voice_id | voice.id is neither a voice UUID nor a voi_ library id. | Copy the id verbatim, or send avatar_id or avatar_handle. |
Job fails with tts_duration_exceeded | The synthesized audio runs past 1,200 seconds. | Split the script; no credits are captured. |
Sources
Related posts
More in Models
- How to make a picture move with AI: pick the motion
Give the picture to an image-to-video model as its first frame and describe the motion. Motion control copies a dance; lip sync makes a face talk.
- Photo to painting AI: turn a photo into a painting
Turn a photo into a painting with AI: send it as a reference image, name the style in the prompt, and keep its shape with aspect_ratio auto.
- Seamless loop AI video: make a clip end where it starts
To loop an AI video, send one image as both its first and last frame, then compare the two ends before you loop it. Which models take an end frame.
- Seedance 2.5 API: 30-second clips, resolutions, references
Seedance 2.5 on Sume is seedance-2.5: 4–30 second clips at 480p, 720p, or 1080p. The documented limits, inputs, and billing for each Seedance id.
Written by Sume