Dies ist PocketSphinx, eine der sprecherunabhängigen Open-Source-Engines zur kontinuierlichen Spracherkennung mit großem Vokabular der Carnegie Mellon University.
Obwohl es sich einst um ein Forschungssystem handelte, wurde die aktive Entwicklung weitgehend eingestellt und es ist sehr, sehr weit vom Stand der Technik entfernt. Ich mache eine Veröffentlichung, weil die Leute es trotzdem verwenden und es eine Reihe historischer Fehler im Build-System und in der API gibt, die korrigiert werden mussten.
Die Versionsnummer ist seltsam groß, da es eine von den Leuten verwendete „Version“ namens 5prealpha gab und wir von nun an die richtige semantische Versionierung verwenden werden.
Die Nutzungsbedingungen finden Sie in der LIZENZ-Datei.
Wir verwenden jetzt CMake zum Erstellen, was unter Linux und Windows zu vernünftigen Ergebnissen führen sollte. Bei Mac OS X bin ich mir nicht sicher, da ich keines davon habe. Darüber hinaus wurde die Audiobibliothek, die auf keiner Plattform wirklich funktionierte oder funktionierte, einfach entfernt.
Es besteht keine Abhängigkeit mehr von SphinxBase. Es gibt keine SphinxBase mehr. Dies ist nicht die SphinxBase, die Sie suchen. Alle Ihre SphinxBase gehören uns.
Um das Python-Modul in einer virtuellen Umgebung zu installieren (ersetzen Sie ~/ve_pocketsphinx
durch die virtuelle Umgebung, die Sie erstellen möchten), aus dem Verzeichnis der obersten Ebene:
python3 -m venv ~/ve_pocketsphinx . ~/ve_pocketsphinx/bin/activate pip install .
So installieren Sie die C-Bibliothek und Bindungen (vorausgesetzt, Sie haben Zugriff auf /usr/local – andernfalls verwenden Sie -DCMAKE_INSTALL_PREFIX
, um im ersten cmake
-Befehl unten ein anderes Präfix festzulegen):
cmake -S . -B build cmake --build build cmake --build build --target install
Das Befehlszeilenprogramm pocketsphinx
liest einkanaliges 16-Bit-PCM-Audio aus der Standardeingabe oder einer oder mehreren Dateien und versucht, darin Sprache mithilfe des standardmäßigen Akustik- und Sprachmodells zu erkennen. Es akzeptiert eine große Anzahl von Optionen, die Sie wahrscheinlich nicht interessieren, einen Befehl , der standardmäßig live
ist, und eine oder mehrere Eingaben (außer im align
) oder -
zum Lesen von der Standardeingabe.
Wenn Sie eine einkanalige WAV-Datei mit dem Namen „speech.wav“ haben und Sprache darin erkennen möchten, können Sie Folgendes versuchen (die Ergebnisse sind möglicherweise nicht besonders gut):
pocketsphinx single speech.wav
Wenn Ihre Eingabe in einem anderen Format vorliegt, empfehle ich, sie wie unten beschrieben mit sox
zu konvertieren.
Die Befehle lauten wie folgt:
help
: Drucken Sie eine lange Liste der Optionen aus, die Sie nicht interessieren.
config
: Konfiguration als JSON in die Standardausgabe ausgeben (kann mit der Option -config
geladen werden).
live
: Erkennen Sie Sprachsegmente in jeder Eingabe, führen Sie eine Erkennung für sie durch (mit den Optionen, die Sie nicht interessieren) und schreiben Sie die Ergebnisse in zeilengetrenntem JSON in die Standardausgabe. Mir ist klar, dass dies nicht das schönste Format ist, aber es übertrifft XML auf jeden Fall. Jede Zeile enthält ein JSON-Objekt mit diesen Feldern, die kurze Namen haben, um die Zeilen besser lesbar zu machen:
b
: Startzeit in Sekunden, ab Beginn des Streams
d
: Dauer in Sekunden
p
: Geschätzte Wahrscheinlichkeit des Erkennungsergebnisses, dh eine Zahl zwischen 0 und 1, die die Wahrscheinlichkeit der Eingabe gemäß dem Modell darstellt
t
: Vollständiger Text des Erkennungsergebnisses
w
: Liste von Segmenten (normalerweise Wörter), von denen jedes wiederum die Felder b
, d
, p
und t
für Anfang, Ende, Wahrscheinlichkeit und den Worttext enthält. Wenn -phone_align yes
übergeben wurde, ist ein w
Feld vorhanden, das Telefonsegmentierungen im gleichen Format enthält.
single
: Erkennen Sie jede Eingabe als einzelne Äußerung und schreiben Sie ein JSON-Objekt im gleichen Format wie oben beschrieben.
align
: Richten Sie eine einzelne Eingabedatei (oder -
für die Standardeingabe) an einer Wortsequenz aus und schreiben Sie ein JSON-Objekt im gleichen Format wie oben beschrieben. Das erste Positionsargument ist die Eingabe, und alle folgenden werden zu dem Text verkettet, um Überraschungen zu vermeiden, wenn Sie vergessen, ihn zu zitieren. Sie sind dafür verantwortlich, den Text zu normalisieren, um Satzzeichen, Großbuchstaben, Tausendfüßler usw. zu entfernen. Zum Beispiel:
pocketsphinx align goforward.wav "go forward ten meters"
Standardmäßig wird nur die Ausrichtung auf Wortebene durchgeführt. Um Telefonausrichtungen zu erhalten, übergeben Sie -phone_align yes
in den Flags, z. B.:
pocketsphinx -phone_align yes align audio.wav $text
Dadurch wird die Ausgabe nicht besonders lesbar, aber Sie können sie mit jq bereinigen. Sie können beispielsweise nur die Wortnamen und Startzeiten wie folgt abrufen:
pocketsphinx align audio.wav $text | jq '.w[]|[.t,.b]'
Oder Sie könnten die Telefonnamen und -dauern wie folgt erhalten:
pocketsphinx -phone_align yes align audio.wav $text | jq '.w[]|.w[]|[.t,.d]'
Es gibt natürlich noch viele, viele andere Möglichkeiten.
soxflags
: Gibt Argumente an sox
zurück, wodurch das entsprechende Eingabeformat erstellt wird. Beachten Sie, dass diese immer nach dem Dateinamen oder -d
stehen müssen, da die sox
-Befehlszeile etwas eigenartig ist (was sox
anweist, vom Mikrofon zu lesen). Sie können die Live-Erkennung wie folgt ausführen:
sox -d $(pocketsphinx soxflags) | pocketsphinx -
oder aus einer Datei mit dem Namen „audio.mp3“ wie folgt dekodieren:
sox audio.mp3 $(pocketsphinx soxflags) | pocketsphinx -
Standardmäßig werden nur Fehler als Standardfehler ausgegeben. Wenn Sie jedoch weitere Informationen wünschen, können Sie -loglevel INFO
übergeben. Teilergebnisse werden nicht gedruckt, vielleicht werden sie es in der Zukunft sein, aber halten Sie nicht den Atem an.
Zur Programmierung finden Sie im Beispielverzeichnis eine Reihe von Beispielen für die Verwendung der Bibliothek von C und Python. Sie können auch die Dokumentation für die Python-API oder die C-API lesen
PocketSphinx basiert letztlich auf Sphinx-II
, das wiederum auf einigen älteren Systemen der Carnegie Mellon University basierte, die dank der Bemühungen von Kevin Lenzo als freie Software unter einer BSD-ähnlichen Lizenz veröffentlicht wurden. Ein großer Teil des Decoders wurde insbesondere von Ravishankar Mosur geschrieben (suchen Sie in den Kommentaren nach „rkm“), aber auch verschiedene andere Personen haben dazu beigetragen, weitere Einzelheiten finden Sie in der AUTHORS-Datei.
David Huggins-Daines (der Autor dieses Dokuments) ist für die Entwicklung von PocketSphinx
verantwortlich, das verschiedene Geschwindigkeits- und Speicheroptimierungen, Festkommaberechnung, JSGF-Unterstützung, Portabilität auf verschiedene Plattformen und eine einigermaßen kohärente API hinzufügte. Anschließend verschwand er für eine Weile.
Nickolay Shmyrev übernahm danach lange Zeit die Wartung und eine Menge Code wurde von Alexander Solovets, Vyacheslav Klimkov und anderen beigesteuert.
Derzeit wird dies wieder von David Huggins-Daines vertreten.