Realtime TTS-2 is live. Built for realtime conversation that feels human. Read the Realtime TTS-2 announcement

TextToSpeech

Synthesize speech (async)

Inworld TTS API reference: submit a text-to-speech job that runs in the background, then download the audio when it finishes.

POST/tts/v1/voice:synthesizeAsync

Results document

When results are packaged as a zip archive, the operation's response uses resultsUri to identify the archive and resultsPath to identify this JSON document inside it. This applies to results delivered to your storage with outputConfig.resultsUri, and to hosted results requested with outputConfig.packaging: ZIP. Every path in the document is relative to the document, so it resolves within the same archive.

audioPathstring

For COMBINED output, the path of the synthesized audio in the format set by audioConfig.audioEncoding, for example audio.mp3.

timestampsPathstring

Path of the timestamp alignment JSON, for example timestamps.json. Present only for COMBINED output when the request set timestampType or lipsyncConfig. See Reading the timestamps document for its format.

scriptResultobject

Present for PER_UTTERANCE output in the ZIP results document. Its utterances array lists utteranceIndex, audioPath, and optional timestampsPath for each utterance, in script order. Paths are relative to this results document; timestamps start at zero for each utterance. See Script synthesis.

Using saved pronunciations? See the pronunciation dictionaries guide.

Authorizations

Authorizationstringrequired

Your authentication credentials. For Basic authentication, please populate Basic $INWORLD_API_KEY. You can create a key in one command with the Inworld CLI: inworld workspace add-key.

Body

application/json

textstring

The text to be synthesized into speech. Maximum input of 100,000 characters. On-Demand accounts are capped at 10,000 characters per job. Required without script; omit it when sending a script. For scripts, the limit applies to the sum of the utterance texts.

voiceIdstring

The ID of the voice to use for synthesizing speech. Set either voiceId or voiceDesign, not both. Omit this field when sending script; select a stored voice in each utterance’s voiceConfig instead.

audioConfigobject

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

bitRateinteger

Bits per second of the audio. Only for compressed audio formats (MP3, OGG_OPUS). The default is 128,000.

sampleRateHertzinteger

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.

speakingRatenumber

Speaking rate/speed, in the range [0.5, 1.5]. The default is 1.0, which is the normal native speed supported by the specific voice. We recommend using values above 0.8 to ensure high quality.

modelIdstringrequired

The ID of the model to use for synthesizing speech. See Models for available models.

languagestring

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 to BALANCED behavior.
  • 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

temperaturenumberdefault: 1

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).

synthesisContextobject

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

previousRequestsobject[]

Previous requests from the same session or conversation, in the order they were synthesized.

Show child attributes

textstring

The text that was synthesized in the previous request.

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

reasoningContextstring

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.

voiceDesignobject

Omit this field when sending script; select a stored voice in each utterance’s voiceConfig instead.

Show child attributes

designPromptstringrequired

A description of the desired voice, such as its accent, pitch, timbre, and delivery. Use 7–1,024 characters; leading and trailing whitespace does not count toward the minimum. This describes the voice; put the words to speak in text.

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

dictionariesobject[]required

One to three distinct dictionaries in priority order.

Show child attributes

dictionarystringrequired

The complete name returned when the dictionary was created, listed, or retrieved: workspaces/{workspace_id}/pronunciationDictionaries/{dictionary_id}. The workspace must be the one your API key belongs to. The display name is not accepted.

lipsyncConfigobject

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. See the Lip-sync guide.

Show child attributes

visemeSetenum<string>default: "OPENXR"

The viseme vocabulary of lipsyncAlignment.visemes. OPENXR, the default and the only supported value, is the 15-shape OpenXR set: sil, PP, FF, TH, DD, kk, CH, SS, nn, RR, aa, E, ih, oh, ou. Other values are rejected with INVALID_ARGUMENT.

Available options:OPENXR

scriptobject

Ordered utterances for TTS-2. Replaces top-level text, voiceId, and voiceDesign. The endpoint’s text limit applies to the sum of the utterance texts. See Script synthesis.

Show child attributes

utterancesobject[]required

Utterances in playback order. The endpoint’s text limit applies to the sum of their texts.

Show child attributes

textstringrequired

Text to synthesize for this utterance.

voiceConfigobjectrequired

Show child attributes

voiceIdstringrequired

Stored voice identifier, resolved in your workspace.

speakingRatenumber

Speaking rate for this voice or utterance. Omission inherits the matching voice default, then audioConfig.speakingRate.

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 to BALANCED behavior.
  • 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

voicesobject[]

Optional defaults keyed by unique voiceId. Each utterance still requires its own voiceConfig.voiceId. Utterance settings override these defaults; omitted settings inherit request-level values.

Show child attributes

voiceIdstringrequired

Stored voice identifier, resolved in your workspace.

speakingRatenumber

Speaking rate for this voice or utterance. Omission inherits the matching voice default, then audioConfig.speakingRate.

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 to BALANCED behavior.
  • 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

outputModeenum<string>default: "COMBINED"

Select one combined recording or separate utterance recordings. Omitted or OUTPUT_MODE_UNSPECIFIED means COMBINED. PER_UTTERANCE requires script. Both modes retain generation history. Async and batch per-utterance results require ZIP packaging.

Available options:OUTPUT_MODE_UNSPECIFIEDCOMBINEDPER_UTTERANCE

outputConfigobject

Preview. Where the results go and how they are packaged. Omit it to have Inworld host them as per-file download URLs. See Results delivery.

Show child attributes

resultsUristring

A URL to an object in storage you own, pre-signed for an HTTP PUT: an Amazon S3 presigned URL, a Google Cloud Storage V4 signed URL, or an Azure SAS URL that grants write. The job uploads its results there as one zip archive, and nothing is retained by Inworld. The signature must stay valid for at least 12 hours after submit for an async job, and 48 hours for a batch. Omit it to have Inworld host the results for about 7 days. Required when the workspace has Zero Data Retention enabled: a job without it is refused with FAILED_PRECONDITION.

packagingenum<string>default: "PACKAGING_UNSPECIFIED"

How the results are packaged.

  • ZIP: One zip archive holding results.json beside every artifact it names, by paths relative to it. The response names the archive in resultsUri and the document in resultsPath.
  • FILES: Each artifact as its own pre-signed download URL. Only for results Inworld hosts: FILES together with resultsUri is rejected with INVALID_ARGUMENT.
  • PACKAGING_UNSPECIFIED: ZIP when resultsUri is set, FILES otherwise.

Available options:PACKAGING_UNSPECIFIEDZIPFILES

Response

200 - application/json

namestring

Server-assigned operation resource name, in the format workspaces/{workspace}/ttsAsyncJobs/{job}/operations/{operation}. Pass it verbatim as the path of the Get operation endpoint to poll for completion.

metadataobject

Always null. An async job is a single unit of work and carries no progress metadata: done already says everything there is to know.

doneboolean

If false, the job is still running. If true, the job has finished and exactly one of error or response is set.

errorobject

Show child attributes

codeinteger

The error code, as specified by gRPC status codes.

messagestring

A short description of the error.

detailsobject[]

Show child attributes

@typestring

responseobject

Set when the job succeeded: a SynthesizeSpeechAsyncResponse saying where the results are.

Show child attributes

@typestring

Type of the serialized message, always type.googleapis.com/ai.inworld.tts.v1.SynthesizeSpeechAsyncResponse.

audioUristring

Pre-signed download URL for the synthesized audio, in the format requested via audioConfig.audioEncoding. Set when the results are packaged as FILES, the default for results Inworld hosts.

timestampsUristring

Pre-signed download URL for the timestamp alignment JSON. Only present when the request set timestampType or lipsyncConfig and the results are packaged as FILES. The file is a JSON array of timestamp objects on one timeline from the start of the audio; see Reading the timestamps document.

resultsUristring

The zip archive holding the results, when they are packaged as ZIP. For results delivered to your storage, your outputConfig.resultsUri without its signature; for an archive Inworld hosts, a pre-signed download URL that expires at expireTime.

resultsPathstring

Path of the results document inside the archive at resultsUri. Read the name from here rather than assuming it.

expireTimestring

Time at which the download URLs expire, approximately 7 days after job completion. Absent when the results were delivered to outputConfig.resultsUri, where nothing is left with Inworld to expire.