One request can alternate characters, route each line through its native language, direct pace and expression, add deliberate pauses, and return one finished audio file or stream.
Two voices, one request
Morning model meeting
Heart + Michael
Heart
Good morning, Michael! Did you remember to warm up the speech model?
Michael
I did! But it started talking before I finished my coffee.
Heart
That sounds less like a bug and more like enthusiasm!
Michael
So our synthetic colleague is officially the most productive one here!
The complete script
Dialogue SSML
<speak>
<voice name="af_heart">
<prosody speed="0.95" pitch="+1st">
Good morning, Michael! Did you remember to warm up the speech model?
</prosody>
</voice>
<break time="140ms"/>
<voice name="am_michael">
<prosody speed="0.9" pitch="-1st" tempo="0.98">
I did! But it started talking before I finished my coffee.
</prosody>
</voice>
<break time="140ms"/>
<voice name="af_heart">
<prosody speed="1.05" pitch="+1.5st">
That sounds less like a bug and more like enthusiasm!
</prosody>
</voice>
<break time="140ms"/>
<voice name="am_michael">
<prosody speed="0.92" pitch="-1st" volume="0.95">
So our synthetic colleague is officially the most productive one here!
</prosody>
</voice>
</speak>
More performances
Same engine, different direction
Four more one-request examples
British English
The privileged sign
Emma + George
EmmaGeorge! The deployment says it is waiting for a sign.
GeorgeI gave it one! It said the sign needed administrator privileges.
EmmaDid you try turning the sign off and on again?
GeorgeYes! We are now running two signs.
View exact SSML
<speak>
<voice name="bf_emma"><prosody speed="0.98" pitch="+0.5st">George! The deployment says it is waiting for a sign.</prosody></voice>
<break time="110ms"/>
<voice name="bm_george"><prosody speed="0.92" pitch="-1st">I gave it one! It said the sign needed administrator privileges.</prosody></voice>
<break time="110ms"/>
<voice name="bf_emma"><prosody tempo="1.06" pitch="+1st">Did you try turning the sign off and on again?</prosody></voice>
<break time="110ms"/>
<voice name="bm_george"><prosody speed="0.88" pitch="-1.5st" volume="0.95">Yes! We are now running two signs.</prosody></voice>
</speak>
American English
Turn left at the moon
Bella + Fenrir
BellaBeep-beep! Recalculating. In three hundred thousand kilometers, turn left at the moon.
FenrirHmm? There is no road at the moon!
BellaOh! That explains why traffic is unusually light.
FenrirCan we please find a route with oxygen?
View exact SSML
<speak>
<voice name="af_bella"><prosody speed="1.05" pitch="+1st">Beep-beep! Recalculating. In three hundred thousand kilometers, turn left at the moon.</prosody></voice>
<break time="120ms"/>
<voice name="am_fenrir"><prosody speed="0.88" pitch="-2st">Hmm? There is no road at the moon!</prosody></voice>
<break time="120ms"/>
<voice name="af_bella"><prosody tempo="1.08" pitch="+1.5st">Oh! That explains why traffic is unusually light.</prosody></voice>
<break time="120ms"/>
<voice name="am_fenrir"><prosody speed="0.92" volume="0.95">Can we please find a route with oxygen?</prosody></voice>
</speak>
One voice, two characters
The shopping negotiation
Isabella x2
DaughterMommy mommy I want this
MotherIsabel this is not for you. Put it down please!
DaughterBut, I... I... But, I really really want it. I spotted it first!
MotherNo, put it down right now. This is the end of this discussion.
View exact SSML
<speak>
<voice name="bf_isabella">
<prosody speed="1" pitch="+4st" tempo="1.05" volume="0.9">Mommy mommy I want this</prosody>
<prosody speed="0.9" pitch="-1st" tempo="1.1" volume="0.9">Isabel this is not for you</prosody>
<prosody speed="1.3" pitch="-1st" tempo="1.1" volume="0.9">Put it down please !</prosody>
<break time="500ms"/>
<prosody speed="1" pitch="+4st" tempo="1.05" volume="0.9"> But, I </prosody>
<break time="200ms"/>
<prosody speed="1" pitch="+4st" tempo="1.05" volume="0.9"> I </prosody>
<break time="200ms"/>
<prosody speed="1" pitch="+4st" tempo="1.05" volume="0.9"> But, I really really want it. I spotted it first !</prosody>
<break time="400ms"/>
<prosody speed="0.8" pitch="-1st" tempo="1.1" volume="0.9">No, put it down right now.</prosody>
<prosody speed="1.3" pitch="-1st" tempo="1.1" volume="0.9"> This is the end of this discussion.</prosody>
</voice>
</speak>
Chinese + English + German
The coffee-machine incident
Xiaoxiao + Heart + Martin
Xiaoxiao我发现了一个错误!咖啡机拒绝连接服务器。
HeartWait! That is not a bug. The coffee machine has boundaries.
MartinDann geben wir der Kaffeemaschine ein eigenes Passwort!
Xiaoxiao好主意!现在它要求管理员权限?
View exact SSML
<speak>
<voice name="zf_xiaoxiao"><prosody speed="0.96" pitch="+0.5st">我发现了一个错误!咖啡机拒绝连接服务器。</prosody></voice>
<break time="130ms"/>
<voice name="af_heart"><prosody speed="1.02" pitch="+1st">Wait! That is not a bug. The coffee machine has boundaries.</prosody></voice>
<break time="130ms"/>
<voice name="dm_martin"><prosody speed="0.94" pitch="-1st">Dann geben wir der Kaffeemaschine ein eigenes Passwort!</prosody></voice>
<break time="130ms"/>
<voice name="zf_xiaoxiao"><prosody tempo="1.05" pitch="+1st">好主意!现在它要求管理员权限?</prosody></voice>
</speak>
Direct the performance
Choose the performer, language, and delivery
<lang> keeps the voice
Route a phrase through another language frontend while keeping the selected voice. This preserves character identity, including the accent and limitations of that voice.
<speak>
你好,
<lang xml:lang="en-US">
Kokoro text to speech
</lang>
很高兴认识你。
</speak>
<voice> changes the performer
Select an enabled voice for each segment. Its native language frontend and matching model family are used automatically for more reliable multilingual dialogue.
Set any combination of model speed, pitch in semitones, post-synthesis tempo, and volume. Omitted or blank attributes inherit unchanged, so each dialogue turn only needs the direction that matters.
<speak>
Calm and neutral.
<prosody speed="0.9" pitch="-1st">
Slower and lower.
</prosody>
<prosody tempo="1.1" volume="0.85">
Quicker and quieter.
</prosody>
</speak>
SSML is explicit and experimental. Adjacent turns use a compact 100 ms handoff; add <break> to choose the complete pause, including 0ms for no gap. Plain text remains the default, and the OpenAI-compatible endpoint continues to accept plain text only.