Inworld Realtime TTS-2

Inworld Realtime TTS-2 is a conversational text-to-speech model built for realtime voice interaction rather than static narration. It supports free-form voice direction, carries tone and pacing forward from prior audio in a session, preserves one voice identity across 100+ languages, and is designed for expressive, low-latency speech in assistants, characters, support agents, and interactive products.

Complete technical specification for integration
Ready-to-use code snippets for common workflows
Step-by-step tutorials for advanced use cases
text-to-audio
Immersive Greenhouse Warning Cue$0.00154~2s午前2時17分、温室の北扉が開きます。合図が3回鳴るまで、ガラスには触れないでください。
import { createClient } from '@runware/sdk'
const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()
const [result] = await client.run({
model: 'inworld:tts@2',
speech: {
text: '午前2時17分、温室の北扉が開きます。合図が3回鳴るまで、ガラスには触れないでください。',
voice: 'Asuka',
language: 'ja'
},
settings: {
textNormalization: true
}
})import asyncio
import os
from runware import Runware
async def main():
async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
results = await client.run({
"model": "inworld:tts@2",
"speech": {
"text": "午前2時17分、温室の北扉が開きます。合図が3回鳴るまで、ガラスには触れないでください。",
"voice": "Asuka",
"language": "ja"
},
"settings": {
"textNormalization": True
}
})
asyncio.run(main())curl https://api.runware.ai/v1 \
-H "Authorization: Bearer $RUNWARE_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"taskType": "audioInference",
"taskUUID": "cd886dcc-0f8e-4c33-a720-ff922d31671d",
"model": "inworld:tts@2",
"speech": {
"text": "午前2時17分、温室の北扉が開きます。合図が3回鳴るまで、ガラスには触れないでください。",
"voice": "Asuka",
"language": "ja"
},
"settings": {
"textNormalization": true
}
}
]'runware run inworld:tts@2 \
speech.text=午前2時17分、温室の北扉が開きます。合図が3回鳴るまで、ガラスには触れないでください。 \
speech.voice=Asuka \
speech.language=ja \
settings.textNormalization=true{
"taskType": "audioInference",
"taskUUID": "cd886dcc-0f8e-4c33-a720-ff922d31671d",
"model": "inworld:tts@2",
"speech": {
"text": "午前2時17分、温室の北扉が開きます。合図が3回鳴るまで、ガラスには触れないでください。",
"voice": "Asuka",
"language": "ja"
},
"settings": {
"textNormalization": true
}
}Response
{
"taskType": "audioInference",
"taskUUID": "cd886dcc-0f8e-4c33-a720-ff922d31671d",
"audioUUID": "50379b8f-945a-4b8e-9efe-e40bfc333c0f",
"audioURL": "https://am.runware.ai/audio/os/a09dlim3/ws/5/ai/50379b8f-945a-4b8e-9efe-e40bfc333c0f.mp3",
"cost": 0.00154
}text-to-audio
Italian Heritage Podcast Intro$0.00577~4sBenvenuti a Tracce di Restauro, il podcast che entra nei laboratori dove rinascono gli strumenti scientifici. Oggi, un astrolabio del 1683 torna a misurare il cielo.
import { createClient } from '@runware/sdk'
const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()
const [result] = await client.run({
model: 'inworld:tts@2',
speech: {
text: 'Benvenuti a Tracce di Restauro, il podcast che entra nei laboratori dove rinascono gli strumenti scientifici. Oggi, un astrolabio del 1683 torna a misurare il cielo.',
voice: 'Orietta',
language: 'it'
},
settings: {
textNormalization: true
}
})import asyncio
import os
from runware import Runware
async def main():
async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
results = await client.run({
"model": "inworld:tts@2",
"speech": {
"text": "Benvenuti a Tracce di Restauro, il podcast che entra nei laboratori dove rinascono gli strumenti scientifici. Oggi, un astrolabio del 1683 torna a misurare il cielo.",
"voice": "Orietta",
"language": "it"
},
"settings": {
"textNormalization": True
}
})
asyncio.run(main())curl https://api.runware.ai/v1 \
-H "Authorization: Bearer $RUNWARE_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"taskType": "audioInference",
"taskUUID": "36fc3509-2caf-4de0-b0fd-0af342ee1fd6",
"model": "inworld:tts@2",
"speech": {
"text": "Benvenuti a Tracce di Restauro, il podcast che entra nei laboratori dove rinascono gli strumenti scientifici. Oggi, un astrolabio del 1683 torna a misurare il cielo.",
"voice": "Orietta",
"language": "it"
},
"settings": {
"textNormalization": true
}
}
]'runware run inworld:tts@2 \
speech.text="Benvenuti a Tracce di Restauro, il podcast che entra nei laboratori dove rinascono gli strumenti scientifici. Oggi, un astrolabio del 1683 torna a misurare il cielo." \
speech.voice=Orietta \
speech.language=it \
settings.textNormalization=true{
"taskType": "audioInference",
"taskUUID": "36fc3509-2caf-4de0-b0fd-0af342ee1fd6",
"model": "inworld:tts@2",
"speech": {
"text": "Benvenuti a Tracce di Restauro, il podcast che entra nei laboratori dove rinascono gli strumenti scientifici. Oggi, un astrolabio del 1683 torna a misurare il cielo.",
"voice": "Orietta",
"language": "it"
},
"settings": {
"textNormalization": true
}
}Response
{
"taskType": "audioInference",
"taskUUID": "36fc3509-2caf-4de0-b0fd-0af342ee1fd6",
"audioUUID": "b347e704-e706-41ba-93c3-84e3676d1cbe",
"audioURL": "https://am.runware.ai/audio/os/a01d21/ws/5/ai/b347e704-e706-41ba-93c3-84e3676d1cbe.mp3",
"cost": 0.005775
}text-to-audio
Roller Derby Livestream Vocal Stinger$0.00263~2s¡Esto es Pista Brava, en vivo desde Monterrey! La final arranca a las 8:30.
import { createClient } from '@runware/sdk'
const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()
const [result] = await client.run({
model: 'inworld:tts@2',
speech: {
text: '¡Esto es Pista Brava, en vivo desde Monterrey! La final arranca a las 8:30.',
voice: 'Lupita',
language: 'es'
},
settings: {
textNormalization: true
}
})import asyncio
import os
from runware import Runware
async def main():
async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
results = await client.run({
"model": "inworld:tts@2",
"speech": {
"text": "¡Esto es Pista Brava, en vivo desde Monterrey! La final arranca a las 8:30.",
"voice": "Lupita",
"language": "es"
},
"settings": {
"textNormalization": True
}
})
asyncio.run(main())curl https://api.runware.ai/v1 \
-H "Authorization: Bearer $RUNWARE_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"taskType": "audioInference",
"taskUUID": "81c07469-6a90-4e5d-abf3-1f85cab87aee",
"model": "inworld:tts@2",
"speech": {
"text": "¡Esto es Pista Brava, en vivo desde Monterrey! La final arranca a las 8:30.",
"voice": "Lupita",
"language": "es"
},
"settings": {
"textNormalization": true
}
}
]'runware run inworld:tts@2 \
speech.text="¡Esto es Pista Brava, en vivo desde Monterrey! La final arranca a las 8:30." \
speech.voice=Lupita \
speech.language=es \
settings.textNormalization=true{
"taskType": "audioInference",
"taskUUID": "81c07469-6a90-4e5d-abf3-1f85cab87aee",
"model": "inworld:tts@2",
"speech": {
"text": "¡Esto es Pista Brava, en vivo desde Monterrey! La final arranca a las 8:30.",
"voice": "Lupita",
"language": "es"
},
"settings": {
"textNormalization": true
}
}Response
{
"taskType": "audioInference",
"taskUUID": "81c07469-6a90-4e5d-abf3-1f85cab87aee",
"audioUUID": "9f835dee-cf31-4827-8a5d-06ac4432a105",
"audioURL": "https://am.runware.ai/audio/os/a10dlim3/ws/5/ai/9f835dee-cf31-4827-8a5d-06ac4432a105.mp3",
"cost": 0.002625
}text-to-audio
Polish Numbers Station Voice Loop$0.00507~4sStacja Wisła, próba nocna. O 02:17 otwórz kopertę 6B i odczytaj trzeci wiersz. Jeśli częstotliwość spadnie poniżej 104,2 MHz, zakończ transmisję.
import { createClient } from '@runware/sdk'
const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()
const [result] = await client.run({
model: 'inworld:tts@2',
speech: {
text: 'Stacja Wisła, próba nocna. O 02:17 otwórz kopertę 6B i odczytaj trzeci wiersz. Jeśli częstotliwość spadnie poniżej 104,2 MHz, zakończ transmisję.',
voice: 'Szymon',
language: 'pl'
},
settings: {
textNormalization: true
}
})import asyncio
import os
from runware import Runware
async def main():
async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
results = await client.run({
"model": "inworld:tts@2",
"speech": {
"text": "Stacja Wisła, próba nocna. O 02:17 otwórz kopertę 6B i odczytaj trzeci wiersz. Jeśli częstotliwość spadnie poniżej 104,2 MHz, zakończ transmisję.",
"voice": "Szymon",
"language": "pl"
},
"settings": {
"textNormalization": True
}
})
asyncio.run(main())curl https://api.runware.ai/v1 \
-H "Authorization: Bearer $RUNWARE_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"taskType": "audioInference",
"taskUUID": "68c87fbc-7003-4931-8c57-4708910a9cb8",
"model": "inworld:tts@2",
"speech": {
"text": "Stacja Wisła, próba nocna. O 02:17 otwórz kopertę 6B i odczytaj trzeci wiersz. Jeśli częstotliwość spadnie poniżej 104,2 MHz, zakończ transmisję.",
"voice": "Szymon",
"language": "pl"
},
"settings": {
"textNormalization": true
}
}
]'runware run inworld:tts@2 \
speech.text="Stacja Wisła, próba nocna. O 02:17 otwórz kopertę 6B i odczytaj trzeci wiersz. Jeśli częstotliwość spadnie poniżej 104,2 MHz, zakończ transmisję." \
speech.voice=Szymon \
speech.language=pl \
settings.textNormalization=true{
"taskType": "audioInference",
"taskUUID": "68c87fbc-7003-4931-8c57-4708910a9cb8",
"model": "inworld:tts@2",
"speech": {
"text": "Stacja Wisła, próba nocna. O 02:17 otwórz kopertę 6B i odczytaj trzeci wiersz. Jeśli częstotliwość spadnie poniżej 104,2 MHz, zakończ transmisję.",
"voice": "Szymon",
"language": "pl"
},
"settings": {
"textNormalization": true
}
}Response
{
"taskType": "audioInference",
"taskUUID": "68c87fbc-7003-4931-8c57-4708910a9cb8",
"audioUUID": "74f1dc3d-a9ce-4379-a41a-258c6ee4bb3d",
"audioURL": "https://am.runware.ai/audio/os/a02d21/ws/5/ai/74f1dc3d-a9ce-4379-a41a-258c6ee4bb3d.mp3",
"cost": 0.005075
}