Serie: Sprachsteuerung - Teil 2

Mo, 12. Juli 2021, Ralf Hersel

Im zweiten Teil der Serie über die Sprachsteuerung unter Linux, verwenden wir ein Mikrofon, um die Speech-to-Text Maschine zu füttern. Im ersten Teil wurde die Grundinstallation der Vosk-Engine und der Vosk-Schnittstelle beschrieben. Danach konntet ihr eine WAV-Datei mit gesprochenen Zahlen von Vosk in geschriebene Zahlen umwandeln lassen. Nun testen wir die Mikrofon-Schnittstelle.

Das Python-Skript für die Mikrofon-Schnittstelle befindet sich im Verzeichnis: ../vosk-api/python/example. Bevor man das Testen kann, muss zuerst die Eingabequelle (das Mikrofon) ermittelt werden. Dazu ruft man das Skript mit dem Parameter -l auf, worauf es eine Liste der erkannten Devices anzeigt:

./test_microphone.py -l

   0 HDA Intel: Generic Analog (hw:0,0), ALSA (2 in, 2 out)
   1 sysdefault, ALSA (128 in, 128 out)
   2 front, ALSA (0 in, 2 out)
   3 surround40, ALSA (0 in, 2 out)
   4 surround51, ALSA (0 in, 2 out)
   5 surround71, ALSA (0 in, 2 out)
   6 samplerate, ALSA (128 in, 128 out)
   7 speexrate, ALSA (128 in, 128 out)
*  8 pulse, ALSA (32 in, 32 out)
   9 speex, ALSA (1 in, 1 out)
  10 upmix, ALSA (8 in, 8 out)
  11 vdownmix, ALSA (6 in, 6 out)
  12 dmix, ALSA (0 in, 2 out)
  13 default, ALSA (32 in, 32 out)

Bei mir sieht das so aus; bei euch anders.

Höchstwahrscheinlich werdet ihr diese Liste gar nicht sehen, weil Python eine Fehlermeldung wirft, und sich beschwert, dass das Modul sounddevice fehlt. Das lässt sich mit pip3 install sounddevice schnell nachholen. Sollte Python jetzt meckern, dass PortAudio fehlt, habt ihr Pech gehabt. Bei meinem ersten Versuch unter Ubuntu 20.04 hatte ich dieses Problem und bin nicht weitergekommen. Mit einem aktuellen Manjaro lief die Sache nach der Installation von sounddevice problemlos.

Nun muss man ausprobieren, welches Device das richtige ist. In meinem Fall war es die Nummer 8 (pulse, ALSA). Zum Testen verwendet man wieder das Skript, dieses Mal gibt man die Device-Nr als Parameter mit: ./test_microphone.py -d 8. Im Terminal läuft nun die permanente Spracherkennung. Ich empfehle, es mit einfachen englischen Wörtern zu Testen, zum Beispiel: one, two, in, out, usw. Falls nichts erkannt wird, habt ihr das falsche Device gewählt.

./test_microphone.py -d 8

( 10 Zeilen Load-Geschwurbel )

{
  "partial" : "one"
}
{
  "partial" : "one way"
}
{
  "partial" : "one three one"
}
{
  "partial" : "one way or the"
}

Im obigen Beispiel habe ich die Worte 'one two three' mehrmals hintereinander eingesprochen.

Wer mit einem anderen Sprachmodell spielen möchte, kann sich hier das gewünschte Modell herunterladen. Im ersten Teil (zweiter Code-Block) ist beschrieben, wie man das macht. Die Ergebnisse bei der Spracherkennung mit dem englischen Modell waren auf meinem Notebook (eingebautes Mikrofon) eher schlecht. Ob das an der virtuellen Maschine oder am schlechten Mikrofon lag, kann ich nicht beurteilen.

Die Worterkennung wird vom Test-Skript als JSON-Struktur im Terminal ausgegeben (siehe letzten Codeblock). Zum Testen mag das in Ordnung sein, für eine Sprachsteuerung jedoch nicht. Im dritten Teil der Serie zeige ich, wie man die Software so modifiziert, dass erkannte Worte in Steuerbefehle umgewandelt werden.

Quelle: https://alphacephei.com/vosk/

Marius
Geschrieben von Marius am 13. Juli 2021

Das Projekt ist nett. Ich haben in knapp 5 Stunden einen funktionierenden Lexikalischen Parser in java geschrieben, der einfache und einige komplexe Kommandos ausführen kann. Die Spracherkennung ist noch suboptimal, aber so gut, daß man es für sinnvolle Dinge benutzen kann. Ich schätze mal 30% Müll bei gewollten Kommandos und 100% bei allem was die Software so belauscht, wenn man nicht mit dem PC redet :D Da stimmte nicht ein Satz mit mehr als 5 Wörtern :D Ich habe dazu das große Model für Deutsch benutzt.

Die Geschwindigkeit ist auf einem Ryzen 5600x super gut. Allerdings erkennt die Software das Ende des Satzes nicht immer, was gelinde gesagt, etwas nervt, weil man oft doppelte Anweisungen geben muß. Wer sich da selbst was bauen will, kleiner Tipp, reagiert nur auf ein Keyword, sonst löscht Ihr Euch noch ungewollte die Platte ;)