Sprachgesteuertes Dokumenten-Editing mit Gemini Live: Architektur & Kompromisse
Die meisten Demos zu "sprachgesteuerten Editoren", die du gesehen hast, machen im Stillen etwas Aufwendiges: Das Audio lÀuft durch ein Transkriptionsmodell, das Transkript lÀuft durch ein Anweisungsmodell, und das Anweisungsmodell sendet Tool-Aufrufe an den Editor. Drei Roundtrips, zwei LLMs, und die OberflÀche, die das Sprachmodell sieht, ist nicht die OberflÀche, die der Editor bereitstellt.
AgentDoc geht einen anderen Weg. Wir verbinden Gemini 3.1 Flash Live â die native-audio-Variante â direkt mit demselben MCP-Server, den auch der Text-Agent nutzt. Es gibt keinen Transkriptions-Proxy, kein zweites LLM und keine separate Tool-OberflĂ€che fĂŒr Sprache. Dieser Beitrag erklĂ€rt, warum wir uns fĂŒr dieses Design entschieden haben, was es kostet und wo die rauen Kanten noch sind.
Das naive Design (und warum es verliert)
Das Transkriptions-Proxy-Muster sieht so aus:
mic â STT â transcript â text-LLM â tool-call â MCP â editor
â
(instructions, tool list, history)
Es hat drei echte Probleme. Erstens ist die Latenz die Summe von drei aufeinanderfolgenden Modellaufrufen; du spĂŒrst die Pause jedes Mal, wenn du zu Ende gesprochen hast. Zweitens wirft der STT-Schritt die Prosodie weg â also genau das Signal, das "kursives 'wirklich'" von "wirklich, kursiv" unterscheidet. Drittens pflegst du zwei voneinander abweichende Prompt-OberflĂ€chen: die Tool-Dokumentation des Text-Agenten und die des Sprach-Agenten, die mit der Zeit auseinanderdriften.
Das native-audio-Design
Der native-audio-Pfad von Gemini Live nimmt rohes Audio entgegen, fĂŒhrt Tool-Aufrufe gegen ein typisiertes Schema aus und streamt Audio zurĂŒck. Das Diagramm reduziert sich auf:
mic â Gemini Live â tool-call â MCP â editor
â
(same tool list as text agent)
Daraus ergeben sich zwei Konsequenzen:
- Eine einzige Quelle der Wahrheit fĂŒr die Tool-OberflĂ€che. Der
Sprach-Agent ruft
insert_textmit demselben Schema auf, das der Text-Agent verwendet. Wir pflegen keine parallele "Sprach-Tool-Liste". - Die Prosodie bleibt erhalten. Das Modell erhĂ€lt das Audio direkt, sodass Betonung und Pausen die Auswahl der Tool-Aufrufe beeinflussen, ohne dass wir Regeln dafĂŒr schreiben mĂŒssen.
Was wir bauen mussten
Drei Integrationspunkte mussten bearbeitet werden:
- WebSocket-Bridging. Gemini Live spricht ein WS-Protokoll; der Editor verwendet ein anderes fĂŒr die Echtzeit-Dokumentensynchronisation. Der Agent-Dienst betreibt beide und ĂŒbersetzt Tool-Aufruf-Ergebnisse in Editor-Render-Events. Siehe [agent/](agent/).
- Tool-Aufruf-Beobachtbarkeit. Das Sprachmodell braucht strukturiertes Feedback, um Index-Drift nach Mutationen zu vermeiden. Wir geben dieselben Dirty-Range-Deskriptoren zurĂŒck, die auch der Text-Agent erhĂ€lt (behandelt im Beitrag zur Tool-GranularitĂ€t).
- FSM-Gating, Sprach-Variante. Der State-Constrained-ReAct-FSM kĂŒmmert sich nicht um die ModalitĂ€t â die Sperre auf Schreib-Tools nach einer Mutation funktioniert fĂŒr Sprache identisch. Wir mussten nur sicherstellen, dass der Audio-Ausgabekanal nicht blockiert, wenn der FSM ein erneutes Lesen erzwingt.
Latenz: der erwartete Gewinn und der unerwartete
Die Ende-zu-Ende-Latenz "Ich höre auf zu sprechen â Dokument mutiert" sinkt von etwa 2,4 s im Proxy-Design auf ~700 ms mit native audio. Der erwartete Gewinn.
Der unerwartete Gewinn ist das, was wĂ€hrend mehrstufiger AblĂ€ufe passiert. Weil wir den STT-Roundtrip pro Runde nicht bezahlen, kann das Modell einen lĂ€ngeren Kontext der gesprochenen Unterhaltung kostengĂŒnstig halten. Zusammengesetzte Anweisungen ("mach den Titel fett, dann den nĂ€chsten Absatz kursiv, dann exportieren"), die wir frĂŒher in separate LLM-Aufrufe zerlegen mussten, laufen jetzt als eine einzige Tool-Aufruf-Sequenz in einer einzigen Live-Sitzung.
Wie die rauen Kanten aussehen
Drei Dinge machen noch Ărger:
- Live-API-Kontingent. Native-audio-Sitzungen zÀhlen gegen ein anderes
Kontingent als Text-Completions, und eine lange Sprachsitzung kann es schneller
aufbrauchen, als ein Tippender erwarten wĂŒrde. Unser Kontingent-Status-Pill (das neue
quota_status.js-Modul) ist die fĂŒr Nutzer sichtbare Antwort. - Unterscheidung von Homophonen. "Insert here" und "insert hear" klingen fĂŒr ein Mikrofon in einem lauten Raum nicht unterschiedlich. Wir haben eine kleine Reihe von BestĂ€tigungsabfragen bei nicht umkehrbaren Operationen hinzugefĂŒgt â laut gesprochen "Absatz 3 wird gelöscht, bestĂ€tigen?" â die die tatsĂ€chliche Mutation absichern.
- Neuverbindungen. Der Live-WebSocket kann in instabilen Netzwerken abbrechen, und der Zustand des Audiopuffers im Moment des Abbruchs ist nicht immer wiederherstellbar. Wir spielen derzeit die letzten ~3 Sekunden des bestĂ€tigten Texts in eine frische Sitzung ein, was fĂŒr die meisten Nutzer gut genug ist, aber das nĂ€chste Element auf der Politur-Liste darstellt.
Warum das fĂŒr die Barrierefreiheit wichtig ist
Die ursprĂŒngliche Motivation fĂŒr den voice-first-Build steht auf der Barrierefreiheit-Seite: AgentDoc soll fĂŒr Menschen nutzbar sein, die keine Maus und Tastatur verwenden können oder wollen. Das Transkriptions-Proxy-Design fĂŒhlte sich fĂŒr dieses Publikum immer falsch an, weil es jeder ĂuĂerung eine 2-Sekunden-Strafe auferlegte, die sich ĂŒber eine lange Schreibsitzung ĂŒbel summiert.
Native audio ist nicht nur eine technische Vorliebe. Es ist der Unterschied zwischen Sprache als einer Neuheits-Eingabe und Sprache als einer primÀren.
Was als NĂ€chstes kommt
Laufende Arbeit: bessere Handhabung von Neuverbindungen, ein kontingentbewusster RĂŒckfall auf den Textmodus, wenn das Live-Budget niedrig ist, und eine Studie, die die Bearbeitungszeiten von Nur-Sprache vs. Nur-Text ĂŒber die 13 Benchmark-Szenarien vergleicht. Diese letzte bekommt hier ihren eigenen Beitrag, sobald die Daten vorliegen.