Ich habe 2017 bei den Linuxtagen in Chemnitz einen Vortrag über Heimautomatisierung mit Open-Source-Komponenten besucht und als Teil dessen auch von der Spracherkennungssoftware Pocketsphinx gehört. Da es dafür auch ein Paket unter Debian gibt, habe ich die Spracherkennung ausprobiert.

Englische Sprache

Für Debian wird nur ein Paket mit dem Sprachmodell für Englisch angeboten, aber schon hiermit konnte ich erste Erfolge erzielen. Ich habe auf der Kommandozeile das Programm pocketsphinx_continuous (Version 0.8+5prealpha+1) gestartet und mein Satz »This is the first test« wurde auch erkannt.

% pocketsphinx_continuous -inmic yes
INFO: pocketsphinx.c(152): Parsed model-specific feature parameters from /usr/share/pocketsphinx/model/en-us/en-us/feat.params
Current configuration:
[NAME]                  [DEFLT]         [VALUE]
…

INFO: continuous.c(275): Ready....
INFO: continuous.c(261): Listening...
…
this is the first test

Allerdings sind die Ergebnisse nicht immer so gut und in der Mehrzahl der Fälle ist die Erkennung falsch. Im Vortrag wurde aber auch darauf hingewiesen, dass die Qualität der Erkennung sehr vom Mikrophon abhängt, welche bei dem meines Laptops nicht so besonders ist. Jedenfalls höre ich in einer Aufnahme mit arecord -d 4 -f cd -t wav /tmp/test.wav ein starkes Rauschen.

Eine andere Möglichkeit die Qualität der Ergebnisse zu beeinflussen sind die vielen Optionen von pocketsphinx_continuous, wobei sich deren Bedeutung mir auf den ersten Blick nicht erschlossen hat. Im Internet habe ich irgendwo die Optionen -maxwpf 10 -pl_window 2 gesehen, welche gefühlt bessere Ergebnisse liefern.

Deutsche Sprache

Ein Großteil meiner Texte, die ich gern diktieren würde, sind auf Deutsch, weshalb ich für Pocketsphinx ein deutsches Sprachmodell benötige. Über CMU Sphinx bei Source-Forge habe ich dieses dann auch unter http://goofy.zamia.org/voxforge/de/cmusphinx-cont-voxforge-de-r20171217.tar.xz gefunden.

Im Archiv befinden sich die notwendigen Datei, mit denen dann Pocketsphinx auch deutsche Texte erkennen kann. Die notwendigen Optionen sind -lm etc/voxforge.lm.bin -dict etc/voxforge.dic -hmm model_parameters/voxforge.cd_cont_6000.

Erste Versuche lieferten auch gute Ergebnisse und meine Worte wurden zum Teil super erkannt – leider war dies nur der geringe Teil und ich musste mich beim Sprechen bemühen.

Datenkanal

Um die Schwierigkeiten des Mikrophons am Laptop zu vermeiden und eine Reproduzierbarkeit der Ergebnisse je nach Kommandozeilenoption zu bekommen, habe ich die Januarsendung des Datenkanals genommen und damit experimentiert.

Da pocketsphinx_continuous eine Wave-Datei mit nur einem Kanal benötigt habe ich die Opus-Datei mit VLC bzw. die MP3-Datei mit ffmpeg umgewandelt:

% ffmpeg -i DK067-Meltdown-Spectre.mp3 -ac 1 DK067-Meltdown-Spectre.wav

% vlc -I dummy --play-and-exit '--sout=#transcode{acodec=s16l,ab=128,channels=1,samplerate=44100}:std{mux=wav,access=file,dst=DK067-Meltdown-Spectre.wav}' DK067-Meltdown-Spectre.opus

Damit habe ich pocketsphinx_continuous gefüttert und herzlich gelacht, was da so erkannt wurde:

% pocketsphinx_continuous -samprate 44100 -nfft 2048 -lm etc/voxforge.lm.bin \
  -dict etc/voxforge.dic -hmm model_parameters/voxforge.cd_cont_6000 \
  -infile /tmp/DK067-Meltdown-Spectre.wav 2>/dev/null
gut dass sie das internet zweitausendachtzehn wir nun
wir freuen uns dass sollte draußen grundsätzen jahren richtig dass wir auch werde so sein eine
von der haben nicht darum dass es ohne mühe bei ehren der dem sich die motivation gesellige mit
mir zusammen dessen bekanntlich hat berechtigt daher war es minister anfang dezember der ein
letzter daten keiner gewesen sein oder kann zum grab teil in bonn auch ganz offen sagen auf
alle fälle einer bitte ihre danken die diese sendung in diesem sinne separate wird zwischen den
jahren gewissen unhaltbar da hatte er das ende der beschlossen beziehungsweise wer von uns auch
nicht nur um sehr froh produktion anderes bemüht und daher ist auch helfen mit etwas mehr zeit
vergangen so dass sie werden doch aber forschung freie denn das neue jahr startlinie von angela
merkel für kinder zu sprechen
genannten grundsätze direkt de los liegen genau und aber und dem ganzen jedoch und worin die
ich hier noch und männern zu treten um für die bürger draußen ich bin dennoch summarum der
bestände ihr zu beziehen auch lohnen treffen von denen wir machen als alle vier wochen dieser
schön sind in den garten kanal und zu kirchenbauten computer bin unserer guten armer und
kutsche für technik geschnittenen arktischen können oder dass zwischen damen eindruck sich
bewegt bin dennoch genau oder ansonsten würden am markt kommen sondern nur noch noch höheren
der anderen erstellt die als wird wie die norm ins internet von unterschieden wird seine daten
kanal punkt org europa von alle sprung über die serben und kroaten waren oder von
unterschieden von morgen und dabei den markt mit vor schrecken gruppe von tod sollte würden
ansonsten gibt es noch zum wird bedeutend wird und orten kann am besten ab rund uns spalten
armen stocken vor einiger zeit norden zwecke schon eingerichtet und armen und auch männer mord
wirken kann hat aufnehmen des problems hinaus muss sollte umgehend unverändert übernehmen
adresse schicken vertiefen und komplizierte und ihren folgen noch so große und den konflikt zu
finden melden aber in dem sinne dich ein schreiben als einfache frage der webseite es auch
denen adresse der datenaustausch rücknahme unter anderem gold gewann soll besteuert robust
grundsätzliche und abgesehen von dort unter ihnen auch stoiber post uns auch firmen von guter
dinge gesagt werden mit dem speer wir bitten wird dann doch

Aus meinem »Hallo zum ersten Datenkanal 2018« wurde ein »gut dass sie das internet zweitausendachtzehn«, von Jens' »Wir freuen uns, dass ihr wieder alle da draußen dran seid« wurde »wir freuen uns dass sollte draußen« erkannt und das Ergebnis »angela merkel« kommt vermutlich von meinem Wort »Elan«.

Diese Beispiele spiegeln auch die Qualität der Erkennung mit dem Mikrophon am Laptop wieder, wobei in der Aufnahme vom Datenkanal kein Rauschen oder ähnliche Störungen zu hören sind. Die Optionen -maxwpf 10 -pl_window 2, die ich oben erwähnt hatte, brachten leider auch keine Verbesserung.

Viele der erkannten Worte klingen sehr nach einer politischen Rede und ich vermute, dass der Trainingskorpus für das Sprachmodell mit solchen Texten verzerrt ist. Es gibt auch bereits das Projekt VoxForge, das sich mit dem Aufbau einer freien Datenbank solcher Sprach-Text-Paare beschäftigt, zu dem jeder beitragen kann.

Indizierung des Datenkanals

Meine Idee letztes Jahr nach dem Vortrag war, unsere Radiosendungen mit Pocketsphinx zu verschriftlichen, um darüber die Suchmaschinen besser füttern und unsere Webseite aufwerten zu können. Leider wird so schnell wohl nichts daraus.

Aber ich habe die Option -time yes entdeckt, die uns sehr helfen kann, wenn die Erkennungsrate besser wird, denn damit gibt pocketsphinx_continuous das Zeitfenster an, in dem es das Wort vermutet. Somit könnten wir für die Sendungen eine Art Schlagwortverzeichnis mit den Verweisen auf die Zeitpunkte erstellen, womit auch die Hörer einen gezielteren Einstieg in die Sendungen nehmen können.

Ausblick

Eine Übersicht zu den Möglichkeiten der Spracherkennung unter Linux findet sich in der Wikipedia.

Von Pocketsphinx gibt es auch eine Portierung auf JavaScript, die komplett im Browser läuft. Die Demo-Seite wirkt vielversprechend.