SSML- und Prosodie-Steuerung
Speech Synthesis Markup Language: Pausen, Betonung, Sprechtempo und Tonhöhe.
SSML- und Prosodie-Steuerung ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Prompt Engineering-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Was ist SSML?
SSML (Speech Synthesis Markup Language) ist eine XML-basierte Sprache, mit der Sie genau steuern können, wie Text-to-Speech-Engines Text vorlesen. Sie wird von Google Cloud TTS, Amazon Polly, Microsoft Azure TTS und vielen anderen unterstützt.
Während Klartext Ihnen nur die Wörter vorgibt, können Sie mit SSML Pausen, Betonung, Geschwindigkeit, Tonhöhe, Aussprache und vieles mehr steuern.
Grundlegende SSML-Struktur
Alle SSML-Dokumente werden in ein <speak>-Tag eingeschlossen. Darin kombinieren Sie Klartext mit SSML-Markup-Elementen. TTS-Engines verarbeiten das SSML und erzeugen entsprechend Audio.
# SSML document structure
SSML_BASIC = """
<speak>
Welcome to the course.
<break time="500ms"/>
Today we will cover three topics.
First, we will discuss SSML basics.
<break time="300ms"/>
Second, we will explore prosody control.
<break time="300ms"/>
And third, we will look at advanced features.
</speak>
"""
# Send to Google Cloud TTS
from google.cloud import texttospeech
client_tts = texttospeech.TextToSpeechClient()
input_text = texttospeech.SynthesisInput(ssml=SSML_BASIC)
voice = texttospeech.VoiceSelectionParams(
language_code='en-US',
ssml_gender=texttospeech.SsmlVoiceGender.NEUTRAL
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.MP3
)
print('SSML document ready to synthesize')Das Element break
<break> fügt eine Sprechpause ein. Verwenden Sie es, um einen natürlichen Rhythmus zu erzeugen, Listeneinträge voneinander zu trennen oder einen dramatischen Effekt hinzuzufügen. Das Attribut time akzeptiert Millisekunden (ms) oder Sekunden (s).
# break element examples
BREAK_EXAMPLES = """
<speak>
Are you ready?
<break time="1s"/>
Let us begin.
The three rules are:
number one,
<break time="300ms"/>
always test your code.
<break time="200ms"/>
Number two,
<break time="300ms"/>
write clear documentation.
<break time="200ms"/>
And number three,
<break time="300ms"/>
review before you ship.
<break strength="x-strong"/>
That is all for today.
</speak>
"""
# break strength values: none, x-weak, weak, medium, strong, x-strong
# These map to approximate pause durations defined by the engine
print('break time: explicit duration (e.g. 500ms)')
print('break strength: semantic pause level (weak/medium/strong)')Das Element emphasis
<emphasis> betont Wörter, sodass die Engine sie lauter, langsamer oder mit höherer Tonlage spricht. Verwenden Sie es sparsam. Übermäßige Betonung klingt unnatürlich.
EMPHASIS_EXAMPLES = """
<speak>
This update is
<emphasis level="strong">critically important</emphasis>.
Please read it carefully.
The deadline is
<emphasis level="moderate">this Friday</emphasis>,
not next week.
We
<emphasis level="reduced">recommend</emphasis>
enabling this feature, but it is optional.
</speak>
"""
# emphasis level values:
# strong — much more stress (louder, slower, higher pitch)
# moderate — some additional stress (default if level omitted)
# reduced — less stress (quieter, faster)
print('Use strong for critical information')
print('Use reduced for parenthetical or secondary information')Das Element prosody: Sprechtempo
<prosody rate> steuert die Sprechgeschwindigkeit. Verlangsamen Sie wichtige Informationen und beschleunigen Sie nebensächliche Details oder Haftungsausschlüsse.
PROSODY_RATE_EXAMPLES = """
<speak>
<prosody rate="slow">
This is the most important thing to remember.
Take a moment to let it sink in.
</prosody>
<prosody rate="medium">
Now, for some context about how we got here.
</prosody>
<prosody rate="fast">
And now a quick summary of less critical details that you
can refer back to in the documentation.
</prosody>
</speak>
"""
# rate values:
# x-slow, slow, medium (default), fast, x-fast
# Or percentage: rate="75%" (75% of normal speed)
# Or absolute: rate="200 words per minute"
print('Slow: for emphasis, complex information, or pauses for thought')
print('Fast: for disclaimers, secondary info, rapid listing')Das Element prosody: Tonhöhe
<prosody pitch> passt die Grundfrequenz der Stimme an. Verwenden Sie es, um Tonänderungen zu signalisieren, etwa bei Fragen, Begeisterung oder ernsten Inhalten.
PROSODY_PITCH_EXAMPLES = """
<speak>
<prosody pitch="high" rate="medium">
Exciting news! We just launched a brand new feature!
</prosody>
<prosody pitch="low" rate="slow">
Unfortunately, this service will be discontinued.
We apologize for any inconvenience.
</prosody>
<prosody pitch="+20%">
Did you know that our users save three hours per week on average?
</prosody>
<prosody pitch="-15%">
Please review the terms and conditions carefully.
</prosody>
</speak>
"""
# pitch values:
# x-low, low, medium, high, x-high
# Or relative: +20%, -15%
# Or semitones: +2st, -4st
print('High pitch: excitement, questions, announcements')
print('Low pitch: serious, cautionary, or somber content')Das Element say-as
<say-as> teilt der TTS-Engine mit, wie sie Text interpretieren soll, etwa als Datum, Telefonnummer, Währung oder einzelne Zeichen. Dies ist die zuverlässige Lösung für Zahlen und Sonderwerte.
SAY_AS_EXAMPLES = """
<speak>
Your appointment is on
<say-as interpret-as="date" format="mdy">01/15/2025</say-as>.
Call us at
<say-as interpret-as="telephone">1-800-555-1234</say-as>.
Your confirmation code is
<say-as interpret-as="characters">XK7T9</say-as>.
The total is
<say-as interpret-as="currency" language="en-US">$47.50</say-as>.
This is version
<say-as interpret-as="characters">2.3.1</say-as>
of the software.
</speak>
"""
# interpret-as values:
# characters — spell out each character
# cardinal — number as cardinal ("forty-seven")
# ordinal — "forty-seventh"
# fraction — "three halves"
# date — format string controls order
# telephone — phone number formatting
# currency — monetary value with currency name
print('say-as is the most reliable way to control number pronunciation')Das Element phoneme
<phoneme> gibt eine eindeutige phonetische Aussprache für Wörter vor, die die TTS-Engine regelmäßig falsch ausspricht, etwa Markennamen, Fachbegriffe oder Wörter aus Fremdsprachen.
PHONEME_EXAMPLES = """
<speak>
Welcome to
<phoneme alphabet="ipa" ph="ent.ro.pi">Entropiq</phoneme>,
the leading analytics platform.
Our CEO,
<phoneme alphabet="ipa" ph="joo.serf">Josef</phoneme>,
will present the results.
This API uses
<phoneme alphabet="ipa" ph="kwer.i">GraphQL</phoneme>
for data fetching.
</speak>
"""
# IPA (International Phonetic Alphabet) is the most precise
# x-sampa is an alternative ASCII-friendly phonetic alphabet
# Use an IPA converter tool to find the right phonemes:
# - https://tophonetics.com
# - Dictionary.com pronunciation guides use IPA
print('Use phoneme for brand names, technical terms, proper nouns')
print('Test with multiple phoneme values until it sounds right')SSML mit Amazon Polly
Amazon Polly unterstützt Standard-SSML sowie Polly-spezifische Erweiterungen. Die API-Nutzung unterscheidet sich geringfügig von Google Cloud TTS, das SSML-Markup selbst ist jedoch identisch.
import boto3
polly = boto3.client('polly', region_name='us-east-1')
SSML_CONTENT = """
<speak>
<prosody rate="slow" pitch="low">
Welcome to our quarterly earnings call.
</prosody>
<break time="1s"/>
We are pleased to report
<emphasis level="strong">record revenue</emphasis>
of
<say-as interpret-as="currency" language="en-US">$4200000</say-as>
this quarter.
</speak>
"""
response = polly.synthesize_speech(
Text=SSML_CONTENT,
TextType='ssml', # Tell Polly this is SSML
OutputFormat='mp3',
VoiceId='Joanna', # US English female voice
)
if 'AudioStream' in response:
with open('output.mp3', 'wb') as f:
f.write(response['AudioStream'].read())
print('Audio saved to output.mp3')SSML mit LLMs generieren
Sie können ein LLM verwenden, um Klartext in SSML-markierte Sprachskripte umzuwandeln. So schreiben Sie Inhalte ganz normal und bearbeiten sie anschließend für eine optimale TTS-Ausgabe.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
SSML_GENERATION_PROMPT = (
'Convert the following text into an SSML document for Google Cloud TTS.\n\n'
'Rules:\n'
'- Wrap the entire output in <speak> tags\n'
'- Add <break time="500ms"/> between major points\n'
'- Add <emphasis level="strong"> around key terms or critical information\n'
'- Use <prosody rate="slow"> for important warnings or summaries\n'
'- Use <say-as interpret-as="date"> for all dates\n'
'- Use <say-as interpret-as="telephone"> for phone numbers\n'
'- Return only the SSML, no explanation\n\n'
'Text: {text}'
)
def text_to_ssml(text):
prompt = SSML_GENERATION_PROMPT.format(text=text)
r = client.messages.create(
model='claude-opus-4-5',
max_tokens=2000,
messages=[{'role': 'user', 'content': prompt}]
)
return r.content[0].textSSML validieren und testen
Fehlerhaftes SSML führt zu Fehlern der TTS-API oder dazu, dass die rohen XML-Tags vorgelesen werden. Validieren Sie Ihr SSML immer, bevor Sie es an eine Produktionsumgebung senden.
import xml.etree.ElementTree as ET
def validate_ssml(ssml_string):
"""
Basic SSML validation: checks XML is well-formed
and has a <speak> root element.
"""
try:
root = ET.fromstring(ssml_string)
if root.tag != 'speak':
return False, 'Root element must be <speak>'
# Check for common misuse patterns
warnings = []
for elem in root.iter():
if elem.tag == 'break' and 'time' not in elem.attrib and 'strength' not in elem.attrib:
warnings.append('<break> has no time or strength attribute')
return True, warnings if warnings else 'Valid'
except ET.ParseError as e:
return False, f'XML parse error: {e}'
# Test
valid_ssml = '<speak>Hello <break time="500ms"/> world.</speak>'
bad_ssml = '<speak>Hello <break> world.</speak>' # break not self-closed
print(validate_ssml(valid_ssml))
print(validate_ssml(bad_ssml))Wissensprüfung: SSML say-as
Was ist der wichtigste Zweck des SSML-Elements <say-as>?
Zusammenfassung: SSML- und Prosody-Steuerung
SSML ermöglicht eine präzise Steuerung der TTS-Ausgabe. Zu den wichtigsten Elementen gehören: <break> für zeit- oder stärkenbasierte Pausen, <emphasis> für Betonungsstufen wie strong, moderate und reduced, <prosody rate> für die Sprechgeschwindigkeit, <prosody pitch> für die Stimmfrequenz, <say-as> für die semantische Interpretation von Zahlen, Datumsangaben und Telefonnummern sowie <phoneme> für eine explizite IPA-Aussprache. Sowohl Google Cloud TTS als auch Amazon Polly unterstützen SSML mit demselben grundlegenden Tag-Satz. Verwenden Sie LLMs, um aus Klartext automatisch SSML zu erzeugen, und validieren Sie vor dem Senden an die Produktion immer, dass das XML wohlgeformt ist.
Häufig gestellte Fragen
Ist die Lektion „SSML- und Prosodie-Steuerung“ kostenlos?
Ja — der vollständige Text von „SSML- und Prosodie-Steuerung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Prompt Engineering-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „SSML- und Prosodie-Steuerung“?
Speech Synthesis Markup Language: Pausen, Betonung, Sprechtempo und Tonhöhe. Du übst AI Prompt Engineering mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Prompt Engineering zu starten?
Keine Vorkenntnisse erforderlich. AI Prompt Engineering auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „SSML- und Prosodie-Steuerung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Prompt Engineering-Lektion Code schreiben und ausführen?
Ja. Jede AI Prompt Engineering-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- TTS-Prompt-Muster für natürliche Sprache
- SSML- und Prosodie-Steuerung
- Persona-Design für Voice AI
- Multimodale Sprach- und Textagenten