- transcribe.cpp ist eine auf ggml basierende Bibliothek, die entwickelt wurde, um mehrere moderne Spracherkennungsmodelle einfach in Mac-, Windows- und Linux-Apps einzubetten und per GPU zu beschleunigen
- 16 ASR-Familien und mehr als 60 Modelle laufen auf Vulkan, Metal, CUDA und TinyBLAS; sowohl Streaming- als auch Batch-Transkription werden unterstützt
- Alle Modelle wurden numerisch mit den Referenzimplementierungen verglichen und mit Tausenden von Äußerungen per WER-Tests geprüft; die Validierungsergebnisse sind im Repository und auf Hugging Face veröffentlicht
- Bestehende
.bin-Dateien für whisper.cpp können ausgeführt werden und lassen sich für die meisten Einsatzzwecke bei ähnlicher Leistung ersetzen; außerdem gibt es offizielle Bindings für Python, JavaScript/TypeScript, Rust und ObjC/Swift - Selbst auf einem stromsparenden RK3566 kann schneller als in Echtzeit transkribiert werden, sodass sich lokales ASR auf verschiedensten Geräten bereitstellen lässt, ohne Sprache in die Cloud zu senden
Einschränkungen bei plattformübergreifender ASR-Bereitstellung
- Die bestehenden Optionen für plattformübergreifende ASR-Inferenz waren faktisch auf whisper.cpp und ONNX beschränkt
- Für Apple-Geräte ließe sich MLX ergänzen, doch dann müssten zwei Engines unterstützt und Modelle für jede Engine portiert werden
- ONNX war nützlich, um Modelle schnell zu Handy hinzuzufügen, aber bei rein CPU-basierter Ausführung ließ sich die Leistung nur schwer voll ausschöpfen
- Bei einigen Bibliotheken mit Unterstützung für mehrere Modelle waren Autorenschaft, Testniveau und Wartungspläne unklar
- Es war schwer zu erkennen, ob es Bindings für echte Desktop- und Mobile-Apps gibt, ob sie über Demo-Code hinausgehen, Benchmarks vorhanden sind oder sie schneller als ONNX sind
- Auf Basis der Erfahrung mit der plattformübergreifenden Bereitstellung von Spracheingabe in Handy wurde eine Engine benötigt, die folgende Bedingungen erfüllt
- Dateien müssen heruntergeladen und sofort für Inferenz nutzbar sein
- Die Inferenzqualität muss sich als gleichwertig zur Referenzimplementierung validieren lassen
- Für maximale Leistung muss die Ausführung auf der GPU erfolgen
- Sie muss sich ohne große PyTorch-Bibliotheken leicht in Handy einbetten lassen
- Sie muss auf Mac, Windows und Linux laufen
- ggml wurde wegen seiner starken Community und des praktischen Deployment-Modells als Grundlage gewählt, um diese Anforderungen umzusetzen
Unterstützte Modelle und Beschleunigung
- transcribe.cpp zielt auf schnelle, präzise Inferenz und breite Modellunterstützung
- 16 ASR-Familien und mehr als 60 Modelle werden unterstützt; weitere Modelle sollen folgen
- Die meisten aktuellen öffentlich verfügbaren Transkriptionsmodelle werden unterstützt, einige fehlen jedoch noch
- Sowohl Streaming-Transkription als auch Batch-Transkription werden angeboten
- Alle unterstützten Modelle können mit den folgenden Beschleunigungs-Backends ausgeführt werden
- Vulkan
- Metal
- CUDA
- TinyBLAS
- Modellspezifische Benchmarks wurden unter Fedora mit Ryzen-4750U-CPU und Vulkan sowie auf einem M4 Max durchgeführt
- Vulkan-Support gilt als Mindestvoraussetzung für die Bereitstellung lokaler Inferenzanwendungen
Referenzimplementierung und Genauigkeitsvalidierung
- Ausgehend von der Erfahrung, dass sich die Inferenzgenauigkeit von auf Hugging Face bezogenen
.onnx-Modellen nur schwer sicher beurteilen ließ, wurden alle Modelle numerisch gegen die Referenzimplementierung validiert - Zusätzlich zu numerischen Vergleichen wurden vollständige WER-Prüfungen durchgeführt, um zu bestätigen, dass dieselben Ausgaben wie bei der Referenzimplementierung entstehen
- Pro Modell wurden Tausende von Äußerungen verarbeitet
- Die Ergebnisse sind der Referenzimplementierung sehr ähnlich oder identisch
- Die Validierungsdaten sind im transcribe.cpp-Repository sowie auf den einzelnen Modellseiten der Hugging Face-Organisation handy-computer veröffentlicht
whisper.cpp-Kompatibilität
- Damit sich whisper.cpp, das in Handy verwendet wurde, ersetzen lässt, wurde eine nahezu Drop-in-kompatible Ersetzung umgesetzt
- Die mit Handy ausgelieferten
.bin-Modelldateien für whisper.cpp lassen sich auch in transcribe.cpp ausführen - Einige Flags und Funktionen von whisper.cpp werden noch nicht unterstützt
- Für die meisten Einsatzzwecke ist die whisper-Implementierung ausreichend stabil und kann whisper.cpp bei ungefähr ähnlicher Leistung ersetzen
Sprach-Bindings und Wartung
- Die Bibliothek ist in C/C++ geschrieben und bietet offiziell gepflegte Bindings, um lokale Transkription in verschiedene Umgebungen zu bringen
- Python
- JavaScript/TypeScript
- Rust
- ObjC/Swift
- Beiträge für weitere Sprach-Bindings sind willkommen, allerdings müssen Beitragende die Wartung des jeweiligen Bindings übernehmen
- Die tatsächlichen Anforderungen von Handy sind in das Bibliotheksdesign eingeflossen, und auf Basis der Wartungserfahrung mit Handy soll auch transcribe.cpp weiter gepflegt werden
- Erfahrungen aus der Unterstützung verschiedener ASR-Modelle und realer Einsatzfälle sind eingeflossen, aber es gibt noch nicht abgedeckte Fälle, weshalb externe Beiträge gesucht werden
- Die aktuelle Version ist v0.1.0; da noch Ecken und Kanten vorhanden sind, wird um Issue-Reports gebeten
Lokales ASR bis hin zu stromsparenden Geräten
- Ziel ist es, ASR direkt auf dem Gerät einfacher ausführbar zu machen und damit die Notwendigkeit zu verringern, Sprache an Cloud-Dienste zu senden
- Selbst auf einer leistungsschwachen RK3566-CPU können Modelle schneller als in Echtzeit laufen
- Transkriptionsgeschwindigkeiten oberhalb von Echtzeit mit modernen Modellen sind bei einer Leistungsaufnahme von nur wenigen Watt möglich
- Damit mehr Inferenz lokal verarbeitet werden kann, muss die Bereitstellung und Ausführung einer Inferenz-Engine in Anwendungen einfacher werden
- transcribe.cpp kann das gesamte Problem lokaler Inferenz-Bereitstellung nicht allein lösen, wurde aber als Schritt entwickelt, um die Einstiegshürde für lokales ASR zu senken
Unterstützung hinter dem Projekt
- Mozilla AI, das BiR-Programm und Davide von Mozilla AI unterstützten das Projekt schon in einer frühen Explorationsphase, als es noch keine konkrete Produktform gab
- ggml ist die zentrale Grundlage, die die Bereitstellung lokaler Inferenzanwendungen ermöglicht
- Modal stellte Credits für WER-Tests und CUDA-Validierung bereit
- Blacksmith unterstützte einen Teil der CI/CD zur Prüfung der Release-Artefakte
- Hugging Face stellte der Organisation handy-computer privaten Speicherplatz zur Verfügung, damit Modelle frei hochgeladen werden konnten
KI-Nutzung im Entwicklungsprozess
- Da es als schwierig eingeschätzt wurde, eine Engine dieser Größenordnung auf ggml-Basis innerhalb weniger Monate allein von Grund auf neu zu schreiben, wurde bei der Entwicklung KI-Unterstützung eingesetzt
- Der Projektvorstellungstext wurde nicht mit KI geschrieben, sondern besteht aus selbst gesprochenen oder eingegebenen Sätzen
1 Kommentare
Meinungen auf Hacker News
Sieht sehr cool aus. Allerdings habe ich in der Modelldokumentation keine Funktion gefunden, die nicht die Bedeutung einer unbekannten Sprache, sondern die Laute in Internationaler Lautschrift (IPA) transkribiert.
Für Minderheitensprachen mit weniger als 10.000 Sprechern könnten die Ressourcen, um sprachspezifische Modelle zu trainieren, dauerhaft fehlen. Ein Modell, das Sprache nicht identifiziert, sondern die Sprachsignale selbst in IPA überträgt, wäre für Linguisten, die Minderheitensprachen weltweit erforschen, eine große Hilfe.
Auch schriftliche Quellen sind rar, daher würde ich gern wie in „Project Hail Mary“ selbst ein Übersetzungssystem bauen.
Das dunkle und helle l im Englischen (ball/light) sowie aspiriertes p (pin/spin) können in anderen Sprachen Bedeutungen unterscheiden, im Englischen jedoch nicht. Ich frage mich, ob Linguisten zunächst eine möglichst getreue IPA-Transkription erhalten und sie anschließend manuell normalisieren möchten.
Glückwunsch zum Release. Ich nutze Handy gern auf dem Mac und dem Smartphone; es ist besonders nützlich, wenn die Apple-eigene Spracherkennung wie bei Fachbegriffen bestimmter Domänen danebenliegt.
Ich frage mich, ob man die Wartungskosten von einer Stiftung finanzieren lassen könnte. Wenn man für ein solches Projekt bezahlt werden wollte, würde mich auch interessieren, welche Organisationen man anspricht und auf welche Weise man Unterstützung anfragt.
Ich möchte weiter an Open Source mitarbeiten, daher ist jede Stelle willkommen, die das unterstützt; besonders gut passt es zu Organisationen, die an Open Source glauben und es voranbringen. Für detailliertere Gespräche geht contact@handy.computer.
Viele Speech-to-Text-Systeme erkennen die Äußerung selbst zwar korrekt, unterstützen aber nicht den gewünschten Workflow. Wenn man ein Dokument öffnet und spricht, sollte es an der Cursorposition mit minimaler Latenz kontinuierlich eingeben.
Ein Ansatz, bei dem nach dem Stoppen der Aufnahme alles auf einmal eingefügt wird, ist nicht nützlich; kontinuierliche Eingabe ist der Kern.
Es ist nützlicher, zu einem Thema 5–10 Minuten lang alles auszusprechen, was einem durch den Kopf geht, und es danach zu prüfen, ohne den Denkfluss zu unterbrechen.
Manche Apps nutzen sogar Inhalte, die man kopiert oder gerade ansieht, als Transkriptionskontext, um die Ergebnisse zu verbessern: https://superwhisper.com/docs/common-issues/context#types-of...
Ich frage mich, ob man wie bei Whisper.cpp Kontext eingeben kann, um die Genauigkeit stark zu erhöhen.
Das Python-Binding unter den vier vom Maintainer unterstützten Sprach-Bindings befindet sich unter https://github.com/handy-computer/transcribe.cpp/tree/main/b....
Es gibt noch kein binäres PyPI-Wheel mit Abhängigkeiten; die aktuelle PyPI-Library ruft eine separat installierte Library über ctypes auf, aber offenbar ist ein Release geplant.
Ich habe das genau zum richtigen Zeitpunkt entdeckt. Ich stoße häufig auf Gespräche darüber, Text-to-Speech (TTS) in Prompt-Tools einzubauen, und wollte es selbst ausprobieren.
Der Kreislauf, aufkommende Gedanken ausführlich auszusprechen, daraus ein Dokument zu machen, es zu bearbeiten und dann an eine AI zu schicken, wirkt reizvoll.
Das ist ein enormer Beitrag zur Community, und es ist erstaunlich, dass er von einer einzelnen Person gebaut wurde. Ich hätte am Ende fast eine Ankündigung einer Series-A-Finanzierung erwartet.
Man kann mit AI schnell minderwertige Ergebnisse ausspucken, aber das zeigt auch, dass man seine Ambitionen erweitern und etwas Strengeres und Langlebigeres als zuvor schaffen kann. Statt Transcribe.cpp direkt in eigene Apps einzubauen, sollten solche Funktionen meiner Meinung nach über das Betriebssystem oder Apps wie Handy überall verfügbar sein.
Eines Tages möchte ich libtranscribe ordentlich ausliefern und es zu etwas wie einer Systembibliothek machen. Die Stabilisierung wird Zeit brauchen, aber ich halte es für möglich.
Funktioniert deutlich besser als das bisherige transcribe-rs. Ich habe auch meine Offline-Spracheingabe-App aktualisiert, damit sie die neue Bibliothek nutzt, und dadurch wurde sie deutlich schneller: https://github.com/notune/android_transcribe_app
Die Einschätzung ist richtig, dass lokale Inferenz aus mehreren Gründen zunehmen wird und dass Ausführung und Bereitstellung einfacher werden müssen, damit mehr Apps sie nutzen können.
Dass kein einziges Wort des Textes von einer KI geschrieben wurde, sondern aus Mund oder Fingern stammt, macht das Projekt ebenfalls vertrauenswürdiger und zugänglicher.
Wenn man es häufig nutzt, lernt man, welche Wortfolgen korrekt transkribiert werden, und das wird Teil des Denkprozesses. Mit der Zeit verflechten sich LLM und Denken, sodass auch diese Art der KI-Nutzung den endgültigen Satz tatsächlich verändern kann.
Ich habe Ähnliches erlebt, als ich mich damit beschäftigt habe, lokal einen Transkriptions-API-Server zu betreiben. Am meisten fehlten mir Streaming-Unterstützung und Unterstützung für spezielle Wörter, die bei der Erkennung priorisiert werden sollen; schön, dass es hier Streaming gibt.
Seit whisper.cpp erschienen ist, betreibe ich es selbst auf einem 3090-Ti-Server. Selbst wenn inzwischen schnellere und bessere Alternativen erschienen sind, läuft es weiterhin problemlos, die Gewichte sind klein und es ist mehr als schnell genug für das, was ich brauche.
Wenn man es wie unten auf einem lokalen Homeserver bereitstellt, lässt sich daraus einfach eine lokale Transkriptions-API machen. Die Inferenzparameter muss man etwas anpassen, aber wenn sie einmal festgelegt sind, funktioniert es sehr gut.
MODEL="/home/user/projects/ggml-org/whisper.cpp/models/ggml-large-v3-turbo.bin"WHISPER_SERVER_BIN="/home/user/projects/ggml-org/whisper.cpp/build/bin/whisper-server""$WHISPER_SERVER_BIN" --model "$MODEL" --language en --host 127.0.0.1 --port 7812Anpassung von Wortgewichten wird wahrscheinlich erst deutlich später unterstützt, aber Streaming ist bereits verfügbar.
Ich hoffe, dass jemand ein gutes Serverbeispiel zur Codebasis beiträgt und auch bei der Fehlerbehebung hilft – oder mit transcribe.cpp bzw. Bindings einen robusten Server in einer anderen Sprache baut. Wenn er fertig ist, wäre ich auch bereit, ihn direkt im Hauptprojekt zu verlinken.