PROJEKTEINBLICK ·
Er konnte sprechen. Aber er ließ sich Zeit.
Die ersten Worte aus meinen Lautsprechern waren ein großartiger Moment. Danach fiel mir auf, wie lange ich auf sie gewartet hatte. Mein Assistent konnte sprechen. Für ein Gespräch war er allerdings noch viel zu langsam.

Meine erste Erklärung lag nahe: Natürlich dauert das. Das Sprachmodell läuft lokal, auf meinem eigenen Rechner. Vielleicht musste ich mich einfach damit abfinden.
Aber die Wartezeit störte mich. Ich gab etwas ein und wartete auf eine Reaktion. Für einen technischen Versuch war das in Ordnung. Bei einem Assistenten, mit dem ich mich unterhalten wollte, fühlte es sich nicht richtig an.
Also begann ich, genauer hinzusehen. Wo ging die Zeit verloren? Was musste tatsächlich nacheinander passieren? Und an welchen Stellen wartete die Anwendung, obwohl sie schon etwas tun könnte?
Dabei wurde aus einer vermeintlichen Hardwaregrenze eine ziemlich interessante Entwicklungsaufgabe.
Warum auf die ganze Antwort warten?
Bis dahin wartete ich auf die vollständige Antwort des Sprachmodells, bevor daraus Sprache wurde. Erst musste der Text fertig sein. Dann konnte die Sprachausgabe anfangen.
Bei einer längeren Antwort hieß das: Der erste Satz war längst vorhanden, aber ich hörte noch nichts. Die Anwendung wartete auch auf den zweiten, dritten und letzten Satz. Manchmal dauerte es acht Sekunden, bis ich etwas hörte. Das war viel zu lang.
Ich stellte die Verarbeitung deshalb auf Streaming um. Der Antworttext kam nun Stück für Stück an. Sobald ein vollständiger Satz vorlag, konnte ich ihn an die Sprachausgabe übergeben.
Während mein Assistent den ersten Satz aussprach, erzeugte das Sprachmodell bereits den nächsten. Die fertigen Sätze wurden der Reihe nach weiterverarbeitet und ausgegeben.
| Vorher | Danach |
|---|---|
| Die gesamte Antwort erzeugen, danach mit der Sprachausgabe beginnen. | Den ersten Satz erzeugen und aussprechen, während der nächste bereits entsteht. |
Ich hatte damit nicht plötzlich eine schnellere Grafikkarte. Ich nutzte die vorhandene Zeit besser. Textgenerierung und Sprachausgabe konnten sich überlappen, statt sich vollständig hintereinander einzureihen.
Das machte einen enormen Unterschied. Ich musste nicht mehr auf den kompletten Text warten, um die erste Reaktion zu hören. Aus einer langen Pause vor der Antwort wurde ein Ablauf, der sich wesentlich unmittelbarer anfühlte.
Jetzt musste er mir zuhören
Die Sprachausgabe lief inzwischen rund genug, um den nächsten Schritt anzugehen. Ich wollte meine Fragen nicht mehr eintippen. Ich wollte das angeschlossene Mikrofon benutzen.
Damit kam die andere Hälfte des Gesprächs dazu: Speech-to-Text, kurz STT. Whisper sollte meine Aufnahme in Text umwandeln. Diesen Text konnte ich anschließend an das lokale Sprachmodell weitergeben. Ab dort stand der Weg zurück zu den Lautsprechern bereits.
Die ersten Versuche waren ernüchternd. Die Transkribierung dauerte lange, und das Ergebnis war nicht zuverlässig genug. Wenn schon die erkannte Frage nicht stimmte, konnte auch die Antwort des Assistenten am eigentlichen Anliegen vorbeigehen.
Ich wechselte deshalb auf ein größeres Whisper-Modell. Mir war wichtig, dass mein Assistent mich vernünftig verstand. Eine schnelle Verarbeitung half wenig, wenn ich danach erst den falsch erkannten Text korrigieren musste.
Mit der Wahl des Modells war das Geschwindigkeitsproblem allerdings noch nicht gelöst.
Vor jedem Gespräch erst einmal aufwachen
Besonders unangenehm war der Cold Start. Ich rief Whisper auf, und bevor die eigentliche Transkribierung beginnen konnte, musste das Modell erst geladen werden.
Dabei gingen etliche Sekunden verloren. Ich hatte gesprochen, aber auf dem Bildschirm tat sich zunächst nichts. Noch bevor mein Anliegen beim Sprachmodell angekommen war, hatte ich bereits gewartet.
Für ein Werkzeug, das gelegentlich eine Audiodatei verarbeitet, kann ein solcher Start vertretbar sein. In meinem Assistenten unterbrach er den Gesprächsfluss.
Ich stellte Whisper deshalb auf einen dauerhaft laufenden Server um. Das Modell sollte geladen bleiben und auf die nächste Aufnahme warten, statt bei jeder Verarbeitung wieder von vorn anzufangen.
Zusätzlich ließ ich die Anwendung diesen Server schon beim eigenen Start hochfahren und seine Bereitschaft prüfen. Der nötige Vorlauf verschwand dadurch nicht vollständig. Er fand aber beim Start der Anwendung statt und nicht erst in dem Moment, in dem ich eine Antwort erwartete.
Das war für mich eine wichtige Unterscheidung: Ein Assistent darf sich vorbereiten. Wenn er bereit ist und ich mit ihm spreche, möchte ich diese Vorbereitung nicht jedes Mal erneut abwarten.
Viele kleine Schritte bis zum richtigen Gefühl
Auch danach war die STT-Pipeline nicht einfach fertig. Ich beschäftigte mich tagelang, über längere Phasen auch wochenlang damit, sie weiter zu verbessern.
Ich probierte aus, hörte zu, sprach erneut ins Mikrofon und achtete darauf, wo sich der Ablauf noch zäh anfühlte. Es ging um das Zusammenspiel: die Aufnahme, die Erkennung, die Weitergabe des Textes und schließlich den Beginn der gesprochenen Antwort.
Für mich war die Frage irgendwann nicht mehr nur, ob jede Komponente für sich funktionierte. Ich wollte wissen, ob ich mit dem gesamten System ein Gespräch führen mochte.
Die Stimme war noch nicht die, die ich mir vorgestellt hatte
Parallel dazu probierte ich etliche frei verfügbare Stimmen aus. Mit keiner war ich wirklich zufrieden. Für meine Ohren klangen sie noch zu roboterhaft.
Nach der Vorstellung aus dem Film hatte ich natürlich etwas anderes im Kopf. Aber zu diesem Zeitpunkt genügte es mir, dass mein Assistent überhaupt mit mir sprechen konnte und ich nicht mehr so lange auf eine Antwort warten musste.
Die perfekte Stimme konnte später kommen. Erst einmal wollte ich einen brauchbaren Gesprächspartner auf meinem Rechner haben.
Von einer Antwort zu einer Handlung
Und sobald das besser funktionierte, wollte ich mehr.
Ich wollte nicht nur Fragen stellen. Ich wollte mit meiner Stimme etwas auslösen. Soweit ich mich erinnere, war der erste Auftrag: „Öffne den Taschenrechner.“ Danach kamen Dinge wie: „Öffne den Browser.“ Oder: „Navigiere zu dieser Webseite.“ Zunächst ganz einfache Dinge, deren Ergebnis ich direkt sehen konnte, weil sie auf meinem Computer passierten.
Damit entstand eine neue Aufgabe. Mein Assistent musste erkennen, ob ich eine Antwort erwartete oder eine konkrete Handlung meinte. Und aus meinen Worten musste ein Aufruf werden, den die Anwendung tatsächlich ausführen konnte.
Eine gesprochene Antwort war jetzt möglich. Als Nächstes sollte daraus eine Aktion werden.













