Define the cast.
Generate the conversation.
SSML-H adds request-scoped voice design to standard SSML. One document can create distinct characters, direct each turn, add pauses, and return one finished audio file without preparing voice profiles first.
The shopping negotiation
Mommy mommy I want this!
Isabel [sigh] [sigh] this is not for you. Put it down please !
But, I [sigh] ! ... I [sigh] ! ... But I, I really really want it. I spotted it first !
No, put it down right now. This is the end of this discussion !!!
View exact SSML-H
<speak version="1.1" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:h="https://hangrylabs.app/ns/ssml-h/1.0" xml:lang="en-US">
<metadata>
<h:extensions version="1.0">
<h:voice-definition name="Isabel" age="child" pitch="high" accent="british" scope="request" seed="1476293754"/>
<h:voice-definition name="Mother" gender="female" age="middle-aged" pitch="high" accent="british" scope="request" seed="998282591"/>
</h:extensions>
</metadata>
<voice name="Isabel"><prosody rate="100%" pitch="+4st" volume="-0.92dB">Mommy mommy I want this! </prosody></voice>
<voice name="Mother"><prosody rate="100%" pitch="-1st" volume="-0.92dB">Isabel [sigh] [sigh] this is not for you</prosody></voice>
<voice name="Mother"><prosody rate="100%" pitch="-1st" volume="-0.92dB">Put it down please !</prosody></voice>
<break time="500ms"/>
<voice name="Isabel"><prosody rate="100%" pitch="+4st" volume="-0.92dB"> But, I [sigh] !</prosody></voice>
<break time="600ms"/>
<voice name="Isabel"><prosody rate="100%" pitch="+4st" volume="-0.92dB"> I [sigh] ! </prosody></voice>
<break time="400ms"/>
<voice name="Isabel"><prosody rate="100%" pitch="+4st" volume="-0.92dB"> But I, I really really want it. I spotted it first ! </prosody></voice>
<break time="400ms"/>
<voice name="Mother"><prosody rate="100%" pitch="-1st" volume="-0.92dB">No, put it down right now.</prosody></voice>
<voice name="Mother"><prosody rate="100%" pitch="-1st" volume="-0.92dB"> This is the end of this discussion !!!</prosody></voice>
</speak>New voices created inside each document
Morning model meeting
BobGood morning, Elisabeth. Did you remember to warm up the speech model?
ElisabethI did, but it started talking before I finished my coffee.
BobThat sounds less like a bug and more like enthusiasm!
ElisabethThen our synthetic colleague is officially the most productive one here.
View exact SSML-H
<speak version="1.1" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:h="https://hangrylabs.app/ns/ssml-h/1.0" xml:lang="en-US">
<metadata>
<h:extensions version="1.0">
<h:voice-definition name="Bob" gender="male" age="elderly" pitch="low" accent="american" scope="request" seed="4242"/>
<h:voice-definition name="Elisabeth" gender="female" age="elderly" pitch="moderate" accent="american" scope="request" seed="8241"/>
</h:extensions>
</metadata>
<voice name="Bob">Good morning, Elisabeth. Did you remember to warm up the speech model?</voice>
<break time="250ms"/>
<voice name="Elisabeth"><prosody rate="slow">I did, but it started talking before I finished my coffee.</prosody></voice>
<break time="250ms"/>
<voice name="Bob"><prosody pitch="+1st">That sounds less like a bug and more like enthusiasm!</prosody></voice>
<break time="250ms"/>
<voice name="Elisabeth">Then our synthetic colleague is officially the most productive one here.</voice>
</speak>Turn left at the moon
NavigatorRecalculating. In three hundred thousand kilometers, turn left at the moon.
DriverThere is no road at the moon!
NavigatorThat explains why traffic is unusually light.
DriverCan we please find a route with oxygen?
View exact SSML-H
<speak version="1.1" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:h="https://hangrylabs.app/ns/ssml-h/1.0" xml:lang="en-US">
<metadata>
<h:extensions version="1.0">
<h:voice-definition name="Navigator" gender="female" age="young-adult" pitch="high" accent="british" scope="request" seed="2026"/>
<h:voice-definition name="Driver" gender="male" age="middle-aged" pitch="low" accent="british" scope="request" seed="5070"/>
</h:extensions>
</metadata>
<voice name="Navigator"><prosody rate="fast" pitch="+2st">Recalculating. In three hundred thousand kilometers, turn left at the moon.</prosody></voice>
<break time="200ms"/>
<voice name="Driver"><prosody rate="slow" pitch="-2st">There is no road at the moon!</prosody></voice>
<break time="200ms"/>
<voice name="Navigator"><prosody rate="fast">That explains why traffic is unusually light.</prosody></voice>
<break time="200ms"/>
<voice name="Driver">Can we please find a route with oxygen?</voice>
</speak>Portable characters on top of SSML
<h:voice-definition>
Describe gender, age, pitch, accent, style, seed, and lifetime. OmniVoiceTTS creates the voice before speaking the dialogue.
scope="request"
Keep generated characters private to one synthesis request. Use profile scope only when a reusable voice should be published after successful generation.
Standard SSML remains valid
Use voice turns, prosody, breaks, language changes, substitutions, and supported pronunciation controls alongside SSML-H metadata.
Generate your own cast
curl -X POST "http://localhost:7861/tts/generate" \
-H "Content-Type: application/json" \
-d '{"input_type":"ssml-h","text":"<speak version=\"1.1\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xmlns:h=\"https://hangrylabs.app/ns/ssml-h/1.0\" xml:lang=\"en-US\"><metadata><h:extensions version=\"1.0\"><h:voice-definition name=\"Bob\" gender=\"male\" age=\"elderly\" scope=\"request\" seed=\"4242\"/></h:extensions></metadata><voice name=\"Bob\">Hello from SSML-H.</voice></speak>","seed":24680,"randomize_seed":false,"output_format":"mp3"}' \
-o dialogue.mp3