0Pricing
AI Prompt Engineering · Ders

SSML ve Prozodi Denetimi

Konuşma Sentezleme Biçimlendirme Dili: duraklamalar, vurgu, hız ve perde.

SSML ve Prozodi Denetimi, CoddyKit'te ücretsiz bir AI Prompt Engineering dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Prompt Engineering öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Prompt Engineering kursu toplamda 4 dersten oluşur.

SSML Nedir?

SSML (Konuşma Sentezi İşaretleme Dili), metinden sese motorlarının metni nasıl okuyacağını ayrıntılı biçimde denetlemenizi sağlayan, Genişletilebilir İşaretleme Dili tabanlı bir dildir. Google Cloud TTS, Amazon Polly, Microsoft Azure TTS ve daha birçok hizmet tarafından desteklenir.

Düz metin size yalnızca sözcükleri sunarken SSML; duraklamaları, vurguyu, hızı, perdeyi, telaffuzu ve daha fazlasını denetlemenizi sağlar.

Temel SSML Yapısı

Tüm SSML belgeleri bir <speak> etiketiyle çevrelenir. İçinde düz metni SSML işaretleme öğeleriyle birleştirirsiniz. TTS motorları SSML'yi işler ve buna uygun ses üretir.

# 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')

break Öğesi

<break>, konuşmaya bir duraklama ekler. Doğal bir ritim oluşturmak, liste öğelerini birbirinden ayırmak veya dramatik bir etki katmak için kullanın. time özniteliği milisaniye (ms) veya saniye (s) kabul eder.

# 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)')

emphasis Öğesi

<emphasis>, sözcüklere vurgu ekler; motorun bu sözcükleri daha yüksek sesle, daha yavaş veya daha yüksek perdeden söylemesini sağlar. Ölçülü kullanın; aşırı vurgu doğal olmayan bir ses oluşturur.

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')

prosody Öğesi: Hız

<prosody rate>, konuşma hızını denetler. Önemli bilgilerde yavaşlayın; ikincil ayrıntılarda veya sorumluluk reddi bildirimlerinde hızlanın.

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')

prosody Öğesi: Perde

<prosody pitch>, sesin temel frekansını ayarlar. Ton değişikliklerini, örneğin soruları, heyecanı veya kasvetli içeriği belirtmek için kullanın.

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')

say-as Öğesi

<say-as>, TTS motoruna metni nasıl yorumlayacağını söyler: tarih, telefon numarası, para birimi, karakterler ve benzeri biçimlerde. Bu, sayılar ve özel değerler için güvenilir çözümdür.

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')

phoneme Öğesi

<phoneme>, TTS motorunun sürekli olarak yanlış telaffuz ettiği sözcükler için açık bir fonetik telaffuz sağlar; bunlar marka adları, teknik terimler veya yabancı sözcükler olabilir.

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')

Amazon Polly ile SSML

Amazon Polly, standart SSML'nin yanı sıra Polly'ye özgü uzantıları da destekler. Arayüz kullanımı Google Cloud TTS'den biraz farklıdır, ancak SSML işaretlemesinin kendisi aynıdır.

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')

LLM'lerle SSML Oluşturma

Düz metni SSML açıklamaları içeren konuşma metinlerine dönüştürmek için bir LLM kullanabilirsiniz. Böylece içeriği normal biçimde yazıp en iyi TTS sunumu için son işlemden geçirebilirsiniz.

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].text

SSML Doğrulama ve Sınama

Biçimi bozuk SSML, TTS arayüzü hatalarına neden olur veya ham XML etiketlerini sesli okumaya geçer. SSML'nizi üretim ortamına göndermeden önce daima doğrulayın.

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))

Bilgi Denetimi: SSML say-as

SSML'deki <say-as> öğesinin temel amacı nedir?

Özet: SSML ve Prosodi Denetimi

SSML, TTS çıktısı üzerinde ayrıntılı denetim sağlar. Temel öğeler şunlardır: <break> (süre veya güç düzeyine göre duraklamalar), <emphasis> (vurgu düzeyleri: güçlü, orta, azaltılmış), <prosody rate> (konuşma hızı), <prosody pitch> (ses frekansı), <say-as> (sayıların, tarihlerin ve telefon numaralarının anlamsal yorumu) ve <phoneme> (açık IPA telaffuzu). Google Cloud TTS ve Amazon Polly, aynı temel etiket kümesiyle SSML'yi destekler. Düz metinden otomatik olarak SSML oluşturmak için LLM'leri kullanın ve üretim ortamına göndermeden önce XML'nin iyi biçimlendirilmiş olduğunu daima doğrulayın.

Sıkça Sorulan Sorular

“SSML ve Prozodi Denetimi” dersi ücretsiz mi?

Evet — “SSML ve Prozodi Denetimi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Prompt Engineering kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Prompt Engineering kursu toplamda 4 dersten oluşur.

“SSML ve Prozodi Denetimi” dersinde ne öğreneceğim?

Konuşma Sentezleme Biçimlendirme Dili: duraklamalar, vurgu, hız ve perde. AI Prompt Engineering ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Prompt Engineering öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Prompt Engineering, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“SSML ve Prozodi Denetimi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Prompt Engineering dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Prompt Engineering dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Doğal Konuşma İçin TTS İstem Kalıpları
  2. SSML ve Prozodi Denetimi
  3. Sesli Yapay Zeka Persona Tasarımı
  4. Çok Modlu Ses ve Metin Aracıları
← AI Prompt Engineering Sayfasına Dön