The text to be synthesized into speech. To steer delivery on inworld-tts-2, prefix the text with an inline instruction, such as [say excitedly] how do you do. See Steering for details. The non-streaming endpoint accepts up to 2,000 UTF-16 code units (JavaScript text.length). The HTTP streaming endpoint accepts up to 4,000; see its text field.
TextToSpeech
Synthesize speech
Inworld TTS API reference: convert text to speech in one request and get the complete audio when all of the text is processed.
/tts/v1/voiceRequest and response
Send POST https://api.inworld.ai/tts/v1/voice with
Authorization: Basic <INWORLD_API_KEY> and Content-Type: application/json.
Use the Base64 credentials copied from the Portal without encoding them again.
{
"text": "Hello, world!",
"voiceId": "Ashley",
"modelId": "inworld-tts-2",
"audioConfig": { "audioEncoding": "MP3" }
}text accepts up to 2,000 UTF-16 code units (JavaScript text.length).
Choose a modelId from Models and a voiceId from
List voices. Set the model
explicitly. SDK defaults may refer to older models.
The response is a single JSON object. It includes audioContent (Base64-encoded audio),
usage.processedCharactersCount, usage.modelId, and optional timestampInfo.
Unlike HTTP streaming, these fields are not wrapped in result.
{
"audioContent": "<base64-audio>",
"usage": { "processedCharactersCount": 13, "modelId": "inworld-tts-2" }
}For PCM, decoded bytes are headerless PCM16. LINEAR16 includes a WAV header.
For playback before generation completes or text up to 4,000 code units, use
HTTP streaming.
Its response format and per-chunk header rules differ from this endpoint.
Using saved pronunciations? See the pronunciation dictionaries guide.
The ID of the voice to use for synthesizing speech. Set either voiceId or voiceDesign, not both.
Configurations to use when synthesizing speech.
Show child attributes
audioEncodingenum<string>default: "MP3"
The desired output format of the synthesized audio. Defaults to MP3.
LINEAR16: Uncompressed 16-bit signed little-endian samples (Linear PCM). For non-streaming, the WAV header is included in the response. For streaming, the WAV header is included in every audio chunk.MP3: MP3 audio.OGG_OPUS: Opus encoded audio wrapped in an ogg container. The result will be a file which can be played natively on Android, and in browsers (at least Chrome and Firefox). The quality of the encoding is considerably higher than MP3 while using approximately the same bitrate.ALAW: ALAW encoded audio. 8-bit companded PCM.MULAW: MULAW encoded audio. 8-bit companded PCM.FLAC: FLAC encoded audio. Lossless audio format.PCM: PCM audio. Uncompressed 16-bit signed little-endian samples with no WAV header.WAV: WAV audio. Uncompressed 16-bit signed little-endian samples. For non-streaming, the WAV header is included in the response. For streaming, the WAV header is included in the first audio chunk only.
Available options:LINEAR16MP3OGG_OPUSALAWMULAWFLACPCMWAV
Bits per second of the audio. Only for compressed audio formats (MP3, OGG_OPUS). The default is 128,000.
The synthesis sample rate (in hertz) for this audio. Accepts values within the range [8000, 48000]. Common sample rates include: 8000, 16000, 22050, 24000, 32000, 44100, 48000.
If you request a supported rate that differs from the model's native output rate, the service converts the audio to that rate. Conversion may reduce audio quality. The request fails if the chosen encoding does not support the rate, or if the rate exceeds a known native output rate.
When omitted, the default is 8,000 Hz for MULAW and ALAW. For other encodings, it is 48,000 Hz, capped at the model's native output rate when known.
The ID of the model to use for synthesizing speech. See Models for available models.
BCP-47 language tag (e.g., en-US, fr-FR, ja-JP) specifying the language that the given voice should speak the text in. Matching is case- and separator-insensitive for standard two-part tags (en-gb, EN_GB, and en-GB are equivalent); longer tags with extension subtags must match a catalog entry exactly. If a localized voice prompt exists for the language, it will be used. When omitted, the original voice prompt will be used and the language will be auto-detected from the input text. If an invalid language code is provided, an error will be returned.
See Languages for more details.
deliveryModeenum<string>default: "DELIVERY_MODE_UNSPECIFIED"
Only supported by `inworld-tts-2`. The field is ignored on other models.
Controls how varied the output is.
DELIVERY_MODE_UNSPECIFIED: Defaults toBALANCEDbehavior.STABLE: Optimizes for more consistent, predictable output.BALANCED: Balanced between stability and diversity.CREATIVE: Optimizes for increased emotional range and variation.
Available options:DELIVERY_MODE_UNSPECIFIEDSTABLEBALANCEDCREATIVE
Ignored on `inworld-tts-2`. Use [`deliveryMode`](#body-delivery-mode) instead.
Determines the degree of randomness when sampling audio tokens to generate the response.
Defaults to 1.0. Accepts values between 0 (exclusive) and 2 (inclusive). Higher values will make the output more random and can lead to more expressive results. Lower values will make it more deterministic. If 0 is provided, the default value will be used.
For the most stable results, we recommend using the default value.
timestampTypeenum<string>default: "TIMESTAMP_TYPE_UNSPECIFIED"
Controls timestamp metadata returned with the audio. When enabled, the response includes timing arrays, which can be useful for word-highlighting, karaoke-style captions, and lipsync.
- WORD: Output arrays under
timestampInfo.wordAlignment(words, wordStartTimeSeconds, wordEndTimeSeconds). - CHARACTER: Output arrays under
timestampInfo.characterAlignment(characters, characterStartTimeSeconds, characterEndTimeSeconds). - TIMESTAMPTYPEUNSPECIFIED: Do not compute alignment; timestamp arrays will be empty or omitted.
Phonetic details: phoneticDetails is currently only returned for WORD alignment (not CHARACTER).
Latency note: Alignment adds additional computation. Enabling alignment can increase latency.
Available options:TIMESTAMP_TYPE_UNSPECIFIEDWORDCHARACTER
applyTextNormalizationenum<string>default: "APPLY_TEXT_NORMALIZATION_UNSPECIFIED"
When enabled, text normalization automatically expands and standardizes things like numbers, dates, times, and abbreviations before converting them to speech. For example, Dr. Smith becomes Doctor Smith, and 3/10/25 is spoken as March tenth, twenty twenty-five. Turning this off may reduce latency, but the speech output will read the text exactly as written. Defaults to automatically deciding whether to apply text normalization.
Available options:APPLY_TEXT_NORMALIZATION_UNSPECIFIEDONOFF
enhanceGenerationbooleandefault: false
When true, applies denoising to the synthesized audio to reduce background noise and artifacts, improving the overall audio quality of the generation. Defaults to false (no denoising).
Context for the current synthesis request. Supplying the text of earlier requests from the same session or conversation gives the model additional context and can improve the quality of the generation, especially for short or ambiguous input text. Context text is not billed. At most 5 previous requests, and their texts combined must not exceed 2,000 characters.
Show child attributes
Previous requests from the same session or conversation, in the order they were synthesized.
reasoningenum<string>default: "REASONING_UNSPECIFIED"
Supported by `inworld-tts-2` on Synthesize speech, Synthesize speech (streaming) and Synthesize speech (async). Support for Synthesize speech (batch) is coming soon.
Turns on Reasoning: before synthesis, a language model reads the text and writes a short steering instruction for it, or writes none when the text needs no direction. The instruction it applied is returned in reasoningInstruction. An inline [tag] in the text takes over from where it appears.
REASONING_UNSPECIFIED: Default. Reasoning doesn't run.REASONING_ON: Write an instruction for this request.
Available options:REASONING_UNSPECIFIEDREASONING_ON
Notes for Reasoning about what the text alone can't carry, such as the scene of an audiobook passage or the character in a roleplay. Read only when Reasoning runs. Never spoken and not billed. At most 600 characters; longer is rejected with INVALID_ARGUMENT. Put earlier lines of the conversation in previousRequests, not here.
Preview. Design a voice for this synthesis request without creating or saving a voice. Supported by inworld-tts-2 on unary, server-streaming, async, and batch synthesis. Omit voiceId. Each request or batch item designs its own voice; repeating a description does not guarantee the same voice. See Ad-hoc voice design.
enableCustomPronunciationboolean
When true, applies the workspace pronunciations saved on the Portal Custom Pronunciations page. No dictionary ID is needed: the API key identifies the workspace. Requires inworld-tts-2; set language to match the saved entries. If the saved pronunciations cannot be loaded, synthesis continues without them. Omit this field, even as false, when sending pronunciationDictionarySettings. See Custom pronunciations.
pronunciationDictionarySettingsobject
Selects saved pronunciation dictionaries for this request. Requires inworld-tts-2 and an explicit language matching the entries. When two selected dictionaries define the same word and language, the earlier one wins. Do not combine with enableCustomPronunciation, even when it is false.
Show child attributes
One to three distinct dictionaries in priority order.
Requests viseme (mouth-shape) timing for lip-sync, returned in timestampInfo.lipsyncAlignment. Its presence turns lip-sync on; an empty object is enough. Visemes are computed from the synthesized audio, so they add no latency and work with every model and language. Independent of timestampType: request them on their own or together with word or character timestamps.
Show child attributes
Base64-encoded audio bytes in the requested encoding. PCM is headerless signed 16-bit little-endian audio. LINEAR16 includes a WAV header in the non-streaming response and in every HTTP streaming audio chunk; WAV includes a header only in the first streaming audio chunk. Decode each audioContent value separately before playback or concatenation.
Maximum output audio size of 16MB. To avoid errors with longer texts, please use a compressed audio format with an appropriate bit rate, or use the streaming endpoint.
Usage information for the request.
Show child attributes
processedCharactersCountinteger
Number of input UTF-16 code units processed. For HTTP streaming, the first response message carries the full count and subsequent messages report zero. Sum across messages rather than reading only the last message. Cancelling after the request is metered does not reduce the count to the audio played.
Timestamp alignment information (present when alignment or lip-sync is enabled).
Show child attributes
Word-level alignment when timestampType is WORD.
Show child attributes
Detailed phoneme-level timing and viseme information, useful for precise lip-sync animation.
Show child attributes
Array of phonemes that make up this word.
Show child attributes
Character-level alignment when timestampType is CHARACTER.
Show child attributes
Viseme spans for lip-sync, present when the request set lipsyncConfig. If lip-sync is temporarily unavailable, synthesis still succeeds without this field, so check for it rather than assuming it is present. The spans tile the audio with no gaps, and adjacent identical visemes are merged. In streaming responses, every message that carries audio includes the spans for that audio. A span that continues across two messages is split at the boundary. Times are measured from the start of the stream.
The steering instruction Reasoning wrote and applied to this request. Absent when Reasoning didn't run or wrote no instruction. On Synthesize speech (streaming), set on the first message only. To keep the same delivery on a later request, put it in brackets at the start of the text and leave synthesisContext.reasoning unset.