Voicebot auf Schweizerdeutsch: Latenzbudget bis zur Antwort

Ein praxistaugliches Ziel für einen Voicebot auf Schweizerdeutsch: Die anrufende Person hört das erste Wort der Antwort etwa 1,5 Sekunden, nachdem sie ihren Satz beendet hat, bei einer Antwort in Mundart nach etwa 2 Sekunden. Diese Zeit verteilt sich auf fünf Etappen: Sprecherwechsel erkennen, finales Transkript, Ihr Sprachmodell, erstes Audio der Antwort und die Telefonleitung. Spracherkennung und Sprachausgabe beanspruchen davon rund 0,6 Sekunden, mit Mundart-Antwort bis etwa 1,2 Sekunden; den Rest bestimmen Ihre Erkennung des Sprecherwechsels und Ihr LLM.

Wohin die Zeit geht

Im Gespräch zwischen Menschen liegen zwischen zwei Wortbeiträgen meist nur wenige hundert Millisekunden; Pausen eines Bots fallen deshalb schnell auf. Zwischen dem letzten Wort der anrufenden Person und dem ersten Wort des Bots geschehen nacheinander fünf Dinge:

  1. Sprecherwechsel erkennen. Ihre Anwendung entscheidet, dass die Person fertig gesprochen hat, meist nach einer kurzen Stille, und beendet das Audio für diesen Beitrag.
  2. Finales Transkript. Die Spracherkennung liefert den finalen Text des Beitrags.
  3. Ihr LLM. Ihr Sprachmodell liest das Transkript und beginnt, die Antwort zu schreiben.
  4. Erstes Audio. Die Sprachausgabe macht aus dem ersten Satz Klang.
  5. Die Leitung. Das Audio läuft durch Ihre Telefonie und einen Wiedergabepuffer zur anrufenden Person.

Ein Latenzbudget mit Messwerten

Etappe Verantwortlich Beispielbudget Grundlage
1. Sprecherwechsel erkennen Ihre Anwendung 0,40 s Ihre Stille-Schwelle
2. Finales Transkript Spracherkennung 0,15 s Gemessen, p95
3. Erster Satz Ihres LLM Ihr LLM 0,50 s Hängt von Modell und Prompt ab
4. Erstes Audio Sprachausgabe 0,60 s, im Dialekt 1,00 s Gemessen p95 0,58 s; im Dialekt unter 1 s
5. Netz, Telefonie, Wiedergabe Ihre Infrastruktur 0,15 s Hängt von Carrier und Puffer ab
Total 1,80 s, im Dialekt 2,20 s

Die Werte für Spracherkennung und Sprachausgabe stammen aus unserem Produktivbetrieb, gemessen am 3. September 2026 bei warmem Dienst:

Messung p50 p95
Sprachausgabe, erstes Audio (Echtzeit) 0,48 s 0,58 s
Spracherkennung, Verzögerung der Zwischenresultate 0,07 s 0,13 s
Spracherkennung, finales Transkript nach Sprechende 0,13 s 0,15 s

Wird die Antwort in schweizerdeutschen Dialekt umgesetzt, kommt das erste Audio in unter einer Sekunde. Die übrigen Zeilen des Budgets gehören Ihnen: Sie hängen von Ihrer Erkennung des Sprecherwechsels, Ihrem LLM und Ihrer Telefonie ab. Planen Sie mit p95-Werten statt mit Durchschnitten, denn die langsamen Wechsel sind es, die den Anrufenden auffallen.

So aufgestellt, verfehlt das Budget das Ziel. Der nächste Abschnitt schliesst die Lücke.

Unter das Ziel kommen

Sprecherwechsel und LLM überlappen

Zwischenresultate kommen alle 250 ms und hinken dem Audio im Median weniger als eine Zehntelsekunde hinterher. Wenn Ihre Erkennung des Sprecherwechsels auslöst, deckt das letzte Zwischenresultat fast alles ab, was die Person gesagt hat. Starten Sie Ihr LLM damit: Stimmt das finale Transkript überein, hat das LLM bereits gearbeitet, während noch auf die Stille gewartet wurde; weicht es ab, verwerfen Sie den Entwurf und beginnen neu.

Antwort streamen, erster Satz kurz

Warten Sie nicht auf die vollständige Antwort. Geben Sie die Ausgabe des LLM laufend in den Synthese-Socket; die Sprachausgabe arbeitet Abschnitt für Abschnitt an Satzgrenzen, sodass die anrufende Person den ersten Satz hört, während das Modell noch am dritten schreibt. Bitten Sie Ihr LLM um einen kurzen ersten Satz wie Gern, das schaue ich nach. und senden Sie text.flush, wenn ein angefangener Satz sofort ausgegeben werden soll.

Vorbereiten, was sich nie ändert

Begrüssungen, Menüansagen und Warteformeln brauchen keine Echtzeit-Synthese. Erzeugen Sie sie einmal in Studioqualität per Batch-Anfrage und spielen Sie sie aus Ihrem eigenen Speicher ab. Suisse Speech bewahrt keine Kopien auf und synthetisiert identische Texte jedes Mal neu; eine Datei, die Sie selbst speichern, ist das schnellste Audio überhaupt.

Das Format der Leitung verlangen

Verlangen Sie direkt G.711 µ-law oder A-law mit 8 kHz ("format": "mulaw" oder "alaw"), damit das Umkodieren entfällt, und ergänzen Sie "transport": "binary": Das Audio kommt dann als rohe Binär-Frames, ohne die rund 36 % Overhead von Base64 in JSON. In der Gegenrichtung erwartet die Echtzeit-Erkennung 16 kHz mono PCM16; das 8-kHz-Telefonaudio rechnen Sie also vorher um.

Verbindungen bereithalten

Öffnen Sie die Erkennungssitzung für den nächsten Beitrag und den Synthese-Socket kurz bevor Sie sie brauchen, damit kein Verbindungsaufbau im kritischen Pfad liegt. Für das Öffnen von Echtzeit-Sitzungen gilt ein eigenes Limit von 600 pro Minute und Key, getrennt von gewöhnlichen Anfragen.

Gleichzeitigkeit einplanen

Ihr Plan legt eine Obergrenze für gleichzeitige Anfragen fest. Darüber antwortet der Dienst mit 429 und Retry-After, statt Anfragen in eine Warteschlange zu stellen; so behalten die angenommenen Sitzungen ihre Latenz. In unseren Messungen liefen 25 und 30 gleichzeitige Echtzeit-Sitzungen ohne Ablehnung, mit einem p95 bis zum ersten Audio von 0,78 und 0,85 Sekunden. Ihre Obergrenze lesen Sie aus GET /v1/capabilities; bei 429 warten Sie die in Retry-After genannte Zeit ab, statt sofort neu zu versuchen (Limits).

Schweizer Details, die das Design prägen

Dialekt pro Linie oder Region wählen

Die Erkennung schreibt Schweizerdeutsch als Hochdeutsch und meldet die Sprache, nicht den Dialekt. Den Dialekt der Antwort bestimmen deshalb Sie: pro Einsatz, Telefonlinie oder Region oder aus dem Kundendatensatz, etwa Berndeutsch für eine Hotline in Bern. Führen Sie ihn in den Kandidaten der Erkennung auf, zum Beispiel de-CH-bern,fr-CH,en: Der Code kommt genau so zurück und geht unverändert an die Sprachausgabe. Wer auf Französisch wechselt, erhält fr-CH in derselben Stimme, denn jede Stimme spricht jede Sprache.

Zahlen auf Schweizer Art lesen

Telefonnummern, Referenznummern und Beträge muss die anrufende Person exakt verstehen. Zeichnen Sie sie aus: <say-as interpret-as="telephone"> liest eine Nummer in der Schweizer Gruppierung 3-3-2-2 im gewählten Dialekt, digits liest Codes Ziffer für Ziffer, und currency macht aus CHF 1250.50 Franken und Rappen. Markup funktioniert auch im Stream: Ein text.append mit einem vollständigen <speak>-Dokument wird sofort umgesetzt.

Unterbrechen erlauben

Lassen Sie die Erkennung laufen, während der Bot spricht. Zeigen Zwischenresultate, dass die Person zu reden beginnt, stoppen Sie die Wiedergabe und schliessen den Synthese-Socket. Echtzeit-Sitzungen lassen sich nicht fortsetzen; die nächste Antwort öffnet einfach eine neue.

Eine minimale Pipeline

Die Skizze behandelt einen Beitrag der anrufenden Person: Sie streamt deren Audio in die Erkennung und die Antwort in die Sprachausgabe. Für den nächsten Beitrag öffnen Sie eine neue Erkennungssitzung. yourLlm.stream() steht für die gestreamte Ausgabe Ihres Sprachmodells, call für Ihre Telefonieverbindung.

import WebSocket from 'ws';

const API = 'wss://api.suisse-speech.ch/v1';
const headers = { 'X-API-Key': process.env.SUISSE_SPEECH_KEY };

// Zuhören: 16 kHz mono PCM16 als Binär-Frames senden, am Ende des Beitrags {"type":"audio.end"}.
function listen(onFinal) {
  const stt = new WebSocket(`${API}/stt/stream`, { headers });
  stt.on('open', () => stt.send(JSON.stringify({
    type: 'config',
    lang: 'de-CH-bern,fr-CH,en',          // der Dialekt reist im Code mit
    vocabulary: ['Halbtax', 'Wankdorf'],
  })));
  stt.on('message', (data) => {
    const msg = JSON.parse(data.toString());
    if (msg.type === 'transcript.final') onFinal(msg.text, msg.lang);
  });
  return stt;
}

// Sprechen: die Antwort in die Synthese streamen, während Ihr LLM noch schreibt.
async function speak(chunks, language, play) {
  const tts = new WebSocket(`${API}/tts/stream`, { headers });
  await new Promise((resolve) => tts.once('open', resolve));
  tts.on('message', (data, isBinary) => { if (isBinary) play(data); }); // G.711 µ-law, in Reihenfolge
  tts.send(JSON.stringify({
    type: 'session.start', voice: 'anna', language,
    format: 'mulaw', sample_rate_hz: 8000, transport: 'binary',
  }));
  for await (const text of chunks) tts.send(JSON.stringify({ type: 'text.append', text }));
  tts.send(JSON.stringify({ type: 'session.end' }));
  return tts; // schliessen, wenn die anrufende Person unterbricht
}

const stt = listen((text, lang) => speak(yourLlm.stream(text), lang, (audio) => call.play(audio)));
call.onAudio((pcm16k) => { if (stt.readyState === WebSocket.OPEN) stt.send(pcm16k); });

Alle Nachrichten und Felder beschreiben die Dokumentationen zu Text-to-Speech und Speech-to-Text, die vollständigen Schemas die API-Referenz, alle auf Englisch.

Das eigene Budget messen

Protokollieren Sie pro Beitrag an jeder Übergabe einen Zeitstempel: letztes Audio-Frame der anrufenden Person, audio.end gesendet, transcript.final erhalten, erstes LLM-Token, erstes text.append, erstes Audio-Frame erhalten und erstes Audio abgespielt. Werten Sie p50 und p95 pro Etappe aus. Unsere Werte sind ein Ausgangspunkt, kein Versprechen für Ihr Netz: Messen Sie neu, sobald Sie etwas am Audiopfad ändern.

Was es kostet

Die Echtzeit-Spracherkennung kostet CHF 2.20 und die Echtzeit-Sprachausgabe CHF 6.85 pro Stunde Audio, sekundengenau abgerechnet. Ein fünfminütiger Anruf mit durchgehender Erkennung und zwei Minuten Bot-Sprache kostet für die Sprache rund CHF 0.41 (5 × 0.037 + 2 × 0.114), dazu kommen Ihr LLM und die Telefonie (Preise). Jedes neue Konto erhält 60 Gratisminuten, und Sandbox-Keys werden nie verrechnet; Ihre automatisierten Tests kosten also nichts. Stimmen und Dialekte finden Sie unter Text-to-Speech.

FAQ

Wie schnell sollte ein Voicebot antworten?

Streben Sie das erste Audio etwa 1,5 Sekunden nach dem letzten Wort der anrufenden Person an, mit Mundart-Antwort etwa 2 Sekunden. Messen Sie jede Etappe mit p95, nicht im Durchschnitt.

Wie schnell ist Text-to-Speech auf Schweizerdeutsch?

In Echtzeit kommt das erste Audio einer Antwort typischerweise nach rund einer halben Sekunde (gemessen p50 0,48 s, p95 0,58 s), bei Umsetzung in schweizerdeutschen Dialekt in unter einer Sekunde.

Kann der Bot im Dialekt der anrufenden Person antworten?

Er antwortet im Dialekt, den Sie wählen. Die Erkennung meldet die Sprache, nicht den Dialekt; legen Sie ihn also pro Linie, Region oder Kundendatensatz fest. Die Sprachausgabe setzt Ihre hochdeutsche Antwort in Zürich-, Bern-, Basel- oder Luzernerdeutsch um oder in eine von 14 weiteren Regionen auf Best-Effort-Basis.

Welches Audioformat eignet sich für einen Telefonbot?

Für die Stimme des Bots G.711 µ-law oder A-law mit 8 kHz, je nach Leitung, mit binärem Transport. Für die Echtzeit-Erkennung 16 kHz mono PCM16.

Soll die LLM-Ausgabe in die Sprachausgabe gestreamt werden?

Ja. Senden Sie Text, sobald er entsteht. Die Sprachausgabe arbeitet Satz für Satz; die anrufende Person hört also den ersten Satz, während der Rest noch geschrieben wird.

Was passiert, wenn die anrufende Person unterbricht?

Lassen Sie die Erkennung während der Antwort des Bots weiterlaufen. Zeigen Zwischenresultate Sprache, stoppen Sie die Wiedergabe, schliessen die Synthese-Sitzung und beantworten den neuen Beitrag.

← Alle Artikel

Testen Sie es mit Ihren eigenen Aufnahmen

Holen Sie sich 60 Gratisminuten für Speech-to-Text und Text-to-Speech. Keine Kreditkarte nötig.