Text-to-Speech in Agentenantworten
OpenAI-TTS-, ElevenLabs- und Google-TTS-APIs in Agenten-Pipelines.
Text-to-Speech in Agentenantworten ist eine kostenlose AI Agents-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 Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Warum Agenten TTS benötigen
Ein Sprachagent, der nur zuhört, aber mit Text antwortet, ist kein echter Sprachagent. Text-to-Speech (TTS) wandelt die Textantworten des Agenten in gesprochene Audiodaten um und vervollständigt damit den gesamten Sprachzyklus.
Zwei führende APIs sind: OpenAI TTS (schnell, kostengünstig, 6 Stimmen) und ElevenLabs (äußerst realistische Stimmen, Streaming, Stimmenklonen).
Grundlagen von OpenAI TTS
Die TTS-API von OpenAI wandelt Text innerhalb weniger Sekunden in Sprache um. Sechs integrierte Stimmen: alloy, echo, fable, onyx, nova, shimmer. Unterstützt MP3, opus, AAC und FLAC als Ausgabeformate.
import openai
import os
client = openai.OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
def text_to_speech(text, voice='alloy', output_path='response.mp3'):
response = client.audio.speech.create(
model='tts-1', # tts-1 (fast) or tts-1-hd (higher quality)
voice=voice, # alloy, echo, fable, onyx, nova, shimmer
input=text,
response_format='mp3' # mp3, opus, aac, flac
)
with open(output_path, 'wb') as f:
f.write(response.content)
print(f'Audio saved to: {output_path}')
return output_path
# Available voices:
# alloy - neutral, balanced
# echo - warm, conversational
# fable - expressive
# onyx - deep, authoritative
# nova - friendly, upbeat
# shimmer - soft, clearTTS-Streaming mit OpenAI
Um die wahrgenommene Latenz zu verringern, streamen Sie Audiodaten während ihrer Generierung, statt auf die vollständige Datei zu warten. Der Anrufer kann mit der Wiedergabe beginnen, während der restliche Text noch synthetisiert wird.
import openai
import os
client = openai.OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
def stream_tts_to_file(text, output_path, voice='nova'):
with client.audio.speech.with_streaming_response.create(
model='tts-1',
voice=voice,
input=text
) as response:
response.stream_to_file(output_path)
return output_path
def stream_tts_to_bytes(text, voice='nova'):
audio_chunks = []
with client.audio.speech.with_streaming_response.create(
model='tts-1',
voice=voice,
input=text
) as response:
for chunk in response.iter_bytes(chunk_size=4096):
audio_chunks.append(chunk)
return b''.join(audio_chunks)ElevenLabs SDK: Hochwertiges TTS
ElevenLabs erzeugt die realistischsten verfügbaren Stimmen. Es unterstützt Stimmenklonen, die Steuerung der emotionalen Tonalität und Streaming.
Installieren Sie es mit pip install elevenlabs.
from elevenlabs import ElevenLabs, VoiceSettings
import os
client = ElevenLabs(api_key=os.getenv('ELEVENLABS_API_KEY'))
def elevenlabs_tts(text, voice_id='pNInz6obpgDQGcFmaJgB', output_path='response.mp3'):
# Common voice IDs:
# Rachel: 21m00Tcm4TlvDq8ikWAM
# Adam: pNInz6obpgDQGcFmaJgB
# Bella: EXAVITQu4vr4xnSDxMaL
audio = client.generate(
text=text,
voice=voice_id,
model='eleven_multilingual_v2', # supports 29 languages
voice_settings=VoiceSettings(
stability=0.5, # 0.0-1.0: lower = more expressive
similarity_boost=0.8, # 0.0-1.0: higher = closer to original voice
style=0.3 # 0.0-1.0: style exaggeration
)
)
with open(output_path, 'wb') as f:
for chunk in audio:
f.write(chunk)
return output_pathElevenLabs-Streaming-TTS
ElevenLabs unterstützt Streaming: Sie erhalten Audio-Chunks, bevor der vollständige Text synthetisiert wurde. Das ist für Sprachagenten, bei denen es auf Latenz ankommt, von entscheidender Bedeutung.
from elevenlabs import ElevenLabs
import os
client = ElevenLabs(api_key=os.getenv('ELEVENLABS_API_KEY'))
def streaming_tts(text, voice_id='pNInz6obpgDQGcFmaJgB'):
audio_stream = client.generate(
text=text,
voice=voice_id,
model='eleven_turbo_v2', # fastest model, optimized for streaming
stream=True
)
return audio_stream # yields audio chunks as they are generated
def stream_to_file(text, output_path, voice_id='pNInz6obpgDQGcFmaJgB'):
stream = streaming_tts(text, voice_id)
with open(output_path, 'wb') as f:
for chunk in stream:
if chunk:
f.write(chunk)
print(f'Streaming TTS complete: {output_path}')Audio mit sounddevice abspielen
Spielen Sie das TTS-Audio nach seiner Generierung auf dem lokalen Gerät ab. sounddevice zusammen mit soundfile ist die einfachste plattformübergreifende Option für einen Agenten, der auf einem lokalen Computer ausgeführt wird.
Installieren Sie es mit pip install sounddevice soundfile.
import sounddevice as sd
import soundfile as sf
import numpy as np
import tempfile
import os
def play_audio_file(audio_path):
data, sample_rate = sf.read(audio_path)
sd.play(data, sample_rate)
sd.wait() # block until playback finishes
def play_mp3_bytes(audio_bytes):
# Write to temp file then play (soundfile needs a file)
with tempfile.NamedTemporaryFile(suffix='.mp3', delete=False) as f:
f.write(audio_bytes)
tmp_path = f.name
try:
play_audio_file(tmp_path)
finally:
os.unlink(tmp_path)
def say(text, voice='nova'):
audio_bytes = stream_tts_to_bytes(text, voice=voice)
play_mp3_bytes(audio_bytes)
# Usage
say('Hello! How can I help you today?')Audio mit pygame abspielen
pygame bietet mehr Kontrolle: Sie können prüfen, ob noch Audio abgespielt wird, die Wiedergabe vorzeitig stoppen und mehrere Töne abspielen. Das ist für die Verarbeitung von Unterbrechungen in Sprachagenten nützlich.
Installieren Sie es mit pip install pygame.
import pygame
import io
import tempfile
import os
pygame.mixer.init(frequency=44100, size=-16, channels=1, buffer=512)
def play_audio_pygame(audio_bytes):
with tempfile.NamedTemporaryFile(suffix='.mp3', delete=False) as f:
f.write(audio_bytes)
tmp_path = f.name
try:
pygame.mixer.music.load(tmp_path)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
pygame.time.wait(50) # check every 50ms
finally:
pygame.mixer.music.stop()
os.unlink(tmp_path)
def stop_audio():
if pygame.mixer.music.get_busy():
pygame.mixer.music.stop()
print('Audio stopped (interrupt)')TTS-Antworten zwischenspeichern
Häufige Formulierungen wie Begrüßungen, Fehlermeldungen und Menüansagen werden wiederholt synthetisiert. Speichern Sie deren Audiodateien im Cache, damit Sie die Synthese pro Formulierung nur einmal bezahlen.
import hashlib
import os
TTS_CACHE_DIR = '/tmp/tts_cache'
os.makedirs(TTS_CACHE_DIR, exist_ok=True)
def cached_tts(text, voice='nova'):
cache_key = hashlib.md5(f'{voice}:{text}'.encode()).hexdigest()
cache_path = os.path.join(TTS_CACHE_DIR, f'{cache_key}.mp3')
if os.path.exists(cache_path):
print('TTS cache hit')
return cache_path
# Generate and save
audio_bytes = stream_tts_to_bytes(text, voice=voice)
with open(cache_path, 'wb') as f:
f.write(audio_bytes)
print(f'TTS cached: {cache_path}')
return cache_path
# Pre-warm cache for common phrases on startup
COMMON_PHRASES = [
'Hello! How can I help you today?',
'I did not catch that. Could you repeat?',
'Let me look that up for you.',
'Thank you, goodbye!'
]
def prewarm_tts_cache():
for phrase in COMMON_PHRASES:
cached_tts(phrase)
print(f'Pre-warmed {len(COMMON_PHRASES)} phrases')Satzweises TTS für Streaming
Teilen Sie lange LLM-Antworten in Sätze auf und synthetisieren und spielen Sie diese nacheinander ab. Der Benutzer hört den ersten Satz innerhalb von etwa 500 ms, während der Rest noch generiert wird.
import re
def split_into_sentences(text):
sentences = re.split(r'(?<=[.!?])\s+', text.strip())
return [s.strip() for s in sentences if s.strip()]
def stream_response_as_voice(llm_response_text, voice='nova'):
sentences = split_into_sentences(llm_response_text)
print(f'Speaking {len(sentences)} sentences')
for i, sentence in enumerate(sentences):
if not sentence:
continue
print(f'Speaking ({i+1}/{len(sentences)}): {sentence[:60]}')
cache_path = cached_tts(sentence, voice=voice)
play_audio_file(cache_path)
# Example
response = 'The weather today is sunny and 22 degrees. Perfect for outdoor activities. Bring sunscreen if you plan to be outside for more than an hour.'
stream_response_as_voice(response)Stimme und Modell auswählen
Stimmen Sie die Wahl der Stimme auf die Persönlichkeit des Agenten ab. Tiefere Stimmen (onyx, echo) eignen sich für formelle oder professionelle Agenten, wärmere Stimmen (nova, shimmer) für freundliche Assistenten.
VOICE_PROFILES = {
'assistant': {'service': 'openai', 'voice': 'nova', 'model': 'tts-1'},
'professional': {'service': 'openai', 'voice': 'onyx', 'model': 'tts-1-hd'},
'narrator': {'service': 'openai', 'voice': 'fable', 'model': 'tts-1-hd'},
'premium': {'service': 'elevenlabs', 'voice_id': '21m00Tcm4TlvDq8ikWAM', 'model': 'eleven_multilingual_v2'}
}
def speak(text, persona='assistant'):
profile = VOICE_PROFILES.get(persona, VOICE_PROFILES['assistant'])
if profile['service'] == 'openai':
audio_bytes = stream_tts_to_bytes(text, voice=profile['voice'])
play_mp3_bytes(audio_bytes)
elif profile['service'] == 'elevenlabs':
output_path = elevenlabs_tts(text, voice_id=profile['voice_id'])
play_audio_file(output_path)
speak('Your meeting has been rescheduled.', persona='professional')Sprechgeschwindigkeit und Tonhöhe anpassen
Je nach Kontext sind unterschiedliche Spracheigenschaften sinnvoll. Benachrichtigungen sollten etwas schneller gesprochen werden; beim Geschichtenerzählen sollte die Stimme langsamer und ausdrucksstärker sein. Verarbeiten Sie TTS-Audio nach, um die Geschwindigkeit anzupassen, ohne die Tonhöhe zu verändern.
from pydub import AudioSegment
from pydub.effects import speedup
import os
def adjust_speech_speed(audio_path, speed_factor=1.0, output_path=None):
if speed_factor == 1.0:
return audio_path
audio = AudioSegment.from_file(audio_path)
if speed_factor > 1.0:
# Speed up without changing pitch
audio = speedup(audio, playback_speed=speed_factor)
else:
# Slow down: overlay with silence (simple method)
# For production: use ffmpeg with atempo filter
slow_factor = 1.0 / speed_factor
audio = audio._spawn(
audio.raw_data,
overrides={'frame_rate': int(audio.frame_rate / slow_factor)}
).set_frame_rate(audio.frame_rate)
if output_path is None:
base = os.path.splitext(audio_path)[0]
output_path = f'{base}_speed{speed_factor}.mp3'
audio.export(output_path, format='mp3')
return output_path
# Usage
path = text_to_speech('Your meeting starts in 5 minutes.')
fast_path = adjust_speech_speed(path, speed_factor=1.2) # 20% faster for alertsWissensüberprüfung
Was ist der wichtigste Vorteil der satzweisen TTS-Synthese in einem Sprachagenten?
Zusammenfassung: Text-to-Speech in Agentenantworten
OpenAI TTS (tts-1, tts-1-hd) bietet 6 Stimmen, schnelle Synthese und Streaming-Unterstützung und eignet sich damit ideal für die meisten Sprachagenten. ElevenLabs bietet hochwertigere, realistische Stimmen mit eleven_turbo_v2 für Streaming mit niedriger Latenz.
Spielen Sie Audio mit sounddevice (einfach) oder pygame (Unterbrechungen möglich) ab. Speichern Sie häufige Formulierungen im Cache, um wiederholte API-Kosten zu vermeiden. Verwenden Sie für lange Antworten eine satzweise Synthese, um die wahrgenommene Latenz zu minimieren. Durch das Caching von TTS mit MD5-Hashes wird identischer Text immer aus dem Cache bereitgestellt.
Häufig gestellte Fragen
Ist die Lektion „Text-to-Speech in Agentenantworten“ kostenlos?
Ja — der vollständige Text von „Text-to-Speech in Agentenantworten“ 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 Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Text-to-Speech in Agentenantworten“?
OpenAI-TTS-, ElevenLabs- und Google-TTS-APIs in Agenten-Pipelines. Du übst AI Agents 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 Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents 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 „Text-to-Speech in Agentenantworten“?
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 Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-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
- Speech-to-Text mit Whisper und Deepgram
- Text-to-Speech in Agentenantworten
- Eine Sprachkonversationsschleife erstellen
- Latenzoptimierung für Sprachagenten