Das wahre Push-to-Talk
Ein Knopf, den man gedrückt hält, sollte die Sprachaufnahme so lange offen halten, wie man ihn gedrückt hält. Unserer tat das nicht wirklich: Das Problem lag nicht an unserem Code, sondern an einer Grenze, die wir nicht sehen konnten, bevor wir auf sie stießen.
Ein Knopf, der mehr versprach, als er hielt
Das Prinzip von Push-to-Talk ist einfach: Du drückst, du sprichst, du lässt los, es wird übertragen. Nur hat die in Android integrierte Spracherkennung ihren eigenen Timer, der von unserem Code aus unsichtbar ist: Nach etwa anderthalb Sekunden Stille geht sie davon aus, dass du fertig gesprochen hast, und beendet das Zuhören, egal ob dein Finger noch auf dem Knopf ist oder nicht. Ein Zögern, ein etwas längeres Atmen bei der Wortsuche, und der Satz wurde ohne Vorwarnung abgeschnitten. Schlimmer noch: Um trotz dieser Unterbrechung weiter zuzuhören, musste die Engine heimlich neu gestartet werden, was hörbare Pieptöne und Lücken in der Transkription verursachte. Der Knopf sagte „Ich höre dir zu, solange du mich gedrückt hältst“, aber tatsächlich unterbrach er dich nach einer etwas zu natürlichen Pause.
Eine Mauer, die man nicht verschieben kann
Wir versuchten zunächst, diesen Timer zu umgehen: ihn zu deaktivieren, zu verlängern, ihn hinter einem diskreteren Neustart zu verbergen. Nichts half. Es ist eine vom System festgelegte Grenze, die als solche dokumentiert ist und auf mehreren neueren Android-Telefonen identisch reproduziert wird. Ein Push-to-Talk, das seinen Namen verdient, muss so lange dauern können, wie der Benutzer es wünscht, Pausen inklusive: ein diktiertes Memo, eine laut überlegte Einkaufsliste, ein Gedanke, der zögert, bevor er formuliert wird. Keine Einstellung erlaubte es, dies mit dieser Engine zu erreichen. Wir mussten einen anderen Weg finden.
Aufnehmen, senden, woanders transkribieren
Wir haben unseren Ansatz daher grundlegend geändert. Anstatt die Stimme direkt auf dem Telefon erkennen zu lassen, nimmt XNeuronal nun rohes Audio in einem kompakten Format auf, solange der Knopf gedrückt gehalten wird, ohne jegliche vom System auferlegte Zeitbegrenzung. Beim Loslassen wird diese Datei zusammen mit deiner ID an den Server gesendet, um dort von unserer Spracherkennung in der Cloud transkribiert zu werden. Während der Aufnahme bleibt eine Blase „🎙 Ich höre zu…“ direkt im Konversationsverlauf angezeigt; beim Loslassen wird sie zu „Transkription…“ für die Dauer des Netzwerk-Roundtrips und verwandelt sich dann in deine endgültige Nachricht: ein und derselbe visuelle Anker von Anfang bis Ende, wo zuvor die Anzeige unter dem Orb schwebte, getrennt vom Verlauf.
Diese Umstellung war auch eine Gelegenheit, die Geste strenger zu gestalten: Solange der Knopf gedrückt gehalten wird, stört keine Fehlermeldung das Zuhören, und das Loslassen löst das Senden eindeutig aus, selbst wenn du deinen Finger einen Moment zu früh oder zu spät entfernt hast. Es ist diese gehaltene und zuverlässige Geste, die im Mittelpunkt der Sprache und Konversation mit XNeuronal steht. Das Senden einer Datei anstatt des direkten Zuhörens verlagert auch das Risiko: Der Fehler liegt nicht mehr im Mikrofon, er kann vom Netzwerk kommen. Ohne Netzwerk kann die Diktatfunktion einfach nicht transkribiert werden. Hinter den Kulissen fängt das Sprachmodul vorübergehende Verbindungsabbrüche ab: Wenn die Sitzung unterwegs unterbrochen wird, startet es sie mit einer zunehmenden Wartezeit bis zu acht Versuchen neu, damit eine einzelne Mikro-Unterbrechung nicht zu einem verlorenen Diktat wird.
Was wir gewinnen, was wir bezahlen
Der Gewinn ist klar: Die Transkription hängt nicht mehr von einer durch einen unkontrollierbaren Timer begrenzten Engine ab, und ihre Genauigkeit ist besser, auch bei langen, zögerlichen Sätzen oder Sätzen voller Eigennamen, die eine generische eingebettete Engine schlecht erkannte. Den Preis nehmen wir in Kauf: Da das Audio an einen Server gesendet wird, gibt es keine sofortige Rückmeldung mehr, während du sprichst, keine direkt angezeigten Wörter, nur das Versprechen einer genauen Transkription, sobald der Knopf losgelassen wird, und eine faktische Abhängigkeit vom Netzwerk, damit diese Transkription ankommt. Wir ziehen diese Ehrlichkeit einem Knopf vor, der an der Oberfläche reaktiv schien, dich aber ohne Vorwarnung unterbrach.
