Third-Party STT Models
Integration reference for third-party STT models on the Inworld STT API and Realtime session.update.
The Inworld STT API can route transcription to select third-party providers. This is offered for customers consolidating existing third-party STT workloads onto the Inworld platform, with the goal of transitioning to inworld/inworld-stt-1 over time. Third-party models use the same authentication, request format, and endpoints as inworld/inworld-stt-1. Switching models is a modelId change on the STT API, or audio.input.transcription.model in a Realtime session.update.
Before you integrate
- No capacity or SLA guarantees — while we'll work with the third-party model provider as your usage grows, we can't guarantee capacity or SLAs on their infrastructure.
- Latency and quality are vendor-dependent — third-party model performance characteristics are outside Inworld's control.
- Providers may deprecate models — we can't control third-party model lifecycles; a provider may deprecate or retire a model, and we'll pass along as much notice as we can.
- Data processing — audio sent to a third-party model is processed on the vendor's infrastructure under the vendor's terms. Inworld has Zero Data Retention agreements in place with these providers.
Model comparison
| Feature | inworld/inworld-stt-1 | groq/whisper-large-v3 | assemblyai/universal-3-5-pro | assemblyai/u3-rt-pro | soniox/stt-rt-v4 | soniox/stt-rt-v5 |
|---|---|---|---|---|---|---|
| Pricing (per hour) | $0.10/hr | $0.111/hr | $0.21/hr | $0.45/hr | $0.12/hr | $0.12/hr |
| Endpoint | Sync API + WebSocket | Sync API only | WebSocket only | WebSocket only | WebSocket only | WebSocket only |
Realtime API (session.update) | ||||||
| Real-time streaming | ||||||
| Languages | 30 (see list) | 100+ (Whisper) | 18 languages | 6 languages | 60+ languages | 60+ languages |
| Speaker diarization | (guide) | (0-based) | (0-based) | (1-based) | (1-based) | |
| Word timestamps | (streaming) | (sync) | ||||
Custom vocabulary (prompts) | ||||||
| Turn-taking controls | Automatic + tunable + manual (guide) | — (sync only) | assemblyaiConfig silence/VAD tuning | assemblyaiConfig silence/VAD tuning | Semantic endpointing (sonioxConfig) | Semantic endpointing (sonioxConfig) |
| Voice Profile (guide) |
Language coverage
| Provider | Models | Language documentation |
|---|---|---|
| Groq | groq/whisper-large-v3 | Whisper — supported languages |
| AssemblyAI | assemblyai/universal-3-5-pro, assemblyai/u3-rt-pro | AssemblyAI — supported languages |
| Soniox | soniox/stt-rt-v4, soniox/stt-rt-v5 | Soniox — supported languages |
Speaker diarization
AssemblyAI and Soniox models support speaker diarization on streaming. Set enableSpeakerDiarization: true together with includeWordTimestamps: true; speaker labels are returned on wordTimestamps[].speaker. These flags are STT API-only — they are not session.update fields.
Numbering varies by provider (AssemblyAI starts at 0, Soniox at 1) — don't hardcode a starting index. Some words may arrive without a label; treat those as unattributed. See the Speaker Diarization guide.
Voice Profile
Voice Profile (age, emotion, pitch, vocal style, accent) is an Inworld platform feature that works with every STT model on the API — including third-party models. Enable it with voiceProfileConfig: { "enableVoiceProfile": true } on the STT API, or providerData.stt.voice_profile: true on Realtime; migrating between models does not affect it.
Provider configuration
Every model accepts the standard transcribeConfig fields documented in the API reference — language hints, sample rate, custom vocabulary, turn-taking thresholds, diarization, and word timestamps all work the same way across models. The sections below cover only what is provider-specific: each provider's optional tuning block and a ready-to-use request example.
AssemblyAI (assemblyaiConfig)
WebSocket streaming only; audio must be LINEAR16.
{
"transcribeConfig": {
"modelId": "assemblyai/universal-3-5-pro",
"audioEncoding": "LINEAR16",
"sampleRateHertz": 16000,
"language": "en",
"assemblyaiConfig": {
"minEndOfTurnSilenceWhenConfident": 500,
"maxTurnSilence": 3000,
"vadThreshold": 0.5
}
}
}| Field | Type | Description |
|---|---|---|
minEndOfTurnSilenceWhenConfident | integer (ms) | Minimum silence duration when end-of-turn confidence is high |
maxTurnSilence | integer (ms) | Maximum allowed silence before forcing a turn boundary |
vadThreshold | float | Voice activity detection threshold. Range: 0.0–1.0. Default: 0.5 |
prompt | string | Custom transcription instructions for the model. Universal-3 Pro Streaming only |
Soniox (sonioxConfig)
WebSocket streaming only; audio must be LINEAR16.
{
"transcribeConfig": {
"modelId": "soniox/stt-rt-v5",
"audioEncoding": "LINEAR16",
"sampleRateHertz": 16000,
"sonioxConfig": {
"languageHints": ["en", "es"],
"languageHintsStrict": true,
"context": {
"general": { "domain": "healthcare" },
"text": "Patient intake call for a cardiology clinic.",
"terms": ["angioplasty", "pheochromocytoma"]
}
}
}
}| Field | Type | Description |
|---|---|---|
languageHints | string[] | Language hints to guide the model. If set, overrides the language field from the main config |
languageHintsStrict | boolean | If true, the model strongly prefers producing languages only from the languageHints list |
enableEndpointDetection | boolean | If true, enables intelligent semantic-based end-of-turn detection |
maxEndpointDelayMs | integer (ms) | Maximum delay between end of previous turn and start of next. Range: 500–5000. Default: 2000 |
context.general | map<string, string> | Structured key-value information (domain, topic, intent, etc.) |
context.text | string | Longer free-form background text or related documents |
context.terms | string[] | Domain-specific or uncommon words |
Groq (groqConfig)
Sync (file upload) only — no streaming. Accepts LINEAR16, MP3, OGG_OPUS, FLAC, and AUTO_DETECT, with files up to ~16 MB.
{
"transcribeConfig": {
"modelId": "groq/whisper-large-v3",
"audioEncoding": "AUTO_DETECT",
"language": "en",
"groqConfig": {
"temperature": 0.0
}
},
"audioData": { "content": "<base64-audio>" }
}| Field | Type | Description |
|---|---|---|
temperature | float | Controls randomness in predictions. Higher values produce more varied output. Range: 0.0–1.0 |
Equivalent on inworld-stt-1
When migrating to the Inworld model, these are the replacement configurations:
| Third-party feature | inworld/inworld-stt-1 equivalent |
|---|---|
assemblyaiConfig.minEndOfTurnSilenceWhenConfident | inworldSttV1Config.minEndOfTurnSilenceWhenConfident |
assemblyaiConfig.maxTurnSilence / sonioxConfig.maxEndpointDelayMs | inworldSttV1Config.maxTurnSilence |
assemblyaiConfig.vadThreshold | inworldSttV1Config.vadThreshold (set 0 for manual turn control — see Turn Detection) |
assemblyaiConfig.prompt, Soniox context.terms / context.text / context.general, Whisper-style prompt biasing | prompts (top-level array of key terms / context strings) |
Soniox languageHints | language (top-level) — a soft hint that also constrains output script for supported languages (Language Support) |
Soniox languageHintsStrict | No equivalent — the Inworld language field is a soft hint only; strict language enforcement is not available |
| Semantic endpointing / silence tuning | endOfTurnConfidenceThreshold + inworldSttV1Config — see Turn Detection |
| Speaker diarization | enableSpeakerDiarization + includeWordTimestamps on streaming — currently Experimental (Speaker Diarization) |
| Word timestamps | includeWordTimestamps on streaming |
| Groq sync file transcription | Supported directly — same endpoint, modelId: "inworld/inworld-stt-1" |
For example, a third-party streaming config with custom vocabulary, turn tuning, diarization, and word timestamps translates to:
{
"transcribeConfig": {
"modelId": "inworld/inworld-stt-1",
"audioEncoding": "LINEAR16",
"sampleRateHertz": 16000,
"language": "en",
"prompts": ["angioplasty", "pheochromocytoma"],
"endOfTurnConfidenceThreshold": 0.5,
"inworldSttV1Config": {
"minEndOfTurnSilenceWhenConfident": 500,
"maxTurnSilence": 1500,
"vadThreshold": 0.5
},
"enableSpeakerDiarization": true,
"includeWordTimestamps": true,
"voiceProfileConfig": { "enableVoiceProfile": true }
}
}For Inworld STT, minimum silence gates the first turn-completion check; maximum silence ends the turn even if confidence is insufficient, once the minimum is reached. Both fields accept 20–5000 ms. Keep the minimum less than or equal to the maximum, and test with your audio: equivalent configuration fields do not guarantee identical turn boundaries across models.
For migration support, contact your account team.
Realtime API
The Realtime API is a streaming surface of the same STT models. Send a session.update to pick the model and map provider knobs onto audio.input.transcription and providerData.stt. Partial updates merge. An unrecognized model rejects the whole update (invalid_request_error / invalid_value on session.audio.input.transcription.model).
Accepted here: assemblyai/universal-3-5-pro, assemblyai/u3-rt-pro, soniox/stt-rt-v4 (bare aliases like u3-rt-pro resolve). Not accepted: Groq (sync only) and soniox/stt-rt-v5.
Default turn detection is semantic_vad / eagerness: "medium", which already fills the four turn knobs. Explicit providerData.stt fields override that mapping. See providerData.stt.
| STT API | session.update |
|---|---|
modelId | audio.input.transcription.model |
language | audio.input.transcription.language |
prompts / assemblyaiConfig.prompt | audio.input.transcription.prompt (string; wins over providerData.stt.prompt). Third-party models only — Inworld STT does not support the singular field and takes audio.input.transcription.prompts (an array of terms) instead |
assemblyaiConfig.minEndOfTurnSilenceWhenConfident | providerData.stt.min_end_of_turn_silence |
assemblyaiConfig.maxTurnSilence / sonioxConfig.maxEndpointDelayMs | providerData.stt.max_turn_silence |
assemblyaiConfig.vadThreshold | providerData.stt.vad_threshold |
sonioxConfig.languageHints | providerData.stt.language_hints (ISO 639-1; Soniox only; non-strict) |
sonioxConfig.enableEndpointDetection | On when providerData.stt.end_of_turn_confidence_threshold > 0 — also on by default via semantic_vad |
Not exposed: languageHintsStrict, Soniox context.*, speaker diarization, word-timestamp flags.
Example: AssemblyAI
{
"type": "session.update",
"session": {
"audio": {
"input": {
"transcription": {
"model": "assemblyai/universal-3-5-pro",
"language": "en",
"prompt": "Patient intake call. Vocabulary: angioplasty, pheochromocytoma."
}
}
},
"providerData": {
"stt": {
"min_end_of_turn_silence": 500,
"max_turn_silence": 3000,
"vad_threshold": 0.5,
"voice_profile": true
}
}
}
}Example: Soniox
{
"type": "session.update",
"session": {
"audio": {
"input": {
"transcription": {
"model": "soniox/stt-rt-v4",
"prompt": "Patient intake call. Vocabulary: angioplasty, pheochromocytoma."
}
}
},
"providerData": {
"stt": {
"language_hints": ["en", "es"],
"end_of_turn_confidence_threshold": 0.7,
"max_turn_silence": 2000,
"voice_profile": true
}
}
}
}