Serie: Sprachsteuerung - Teil 3

Mi, 14. Juli 2021, Ralf Hersel

Im ersten und zweiten Teil der Serie über die Sprachsteuerung unter Linux wurde die Grundinstallation der Vosk-Engine und der Vosk-Schnittstelle beschrieben. Ausserdem wurde getestet, ob die Spracheingabe per Mikrofon funktioniert. In diesem dritten Teil geht es um das Ausführen von Kommandos, die durch die Spracheingabe initiiert werden.

Ihr erinnert euch an die Textausgaben in der zweiten Folge, als ich die Worte 'one two three' über das Mikrofon eingesprochen haben. Nun gilt es, die Vosk-Schnittstelle so umbauen, dass statt einer JSON-Ausgabe die gewünschten Kommandos ausgeführt werden. Dazu muss das Skript test_microphone.py modifiziert werden, welches sich hier befindet: ../vosk-api/python/example/test_microphone.py

Bitte öffnet die Datei in einem Editor eurer Wahl und fügt die beiden Libraries json und subprocess hinzu:

#!/usr/bin/env python3

import argparse
import os
import queue
import sounddevice as sd
import vosk
import sys
import json
import subprocess

Das Modul json wird benötigt, um den erkannten Text aus der JSON-Struktur auslesen zu können und subprocess brauchen wir, um ein externes Kommando abzusetzen.

Nun geht ihr im Skript zu Zeile 77 rec = vosk.KaldiRecognizer(... und fügt etwas weiter unten die Zeilen ein, die mit # Ralf markiert sind.

rec = vosk.KaldiRecognizer(model, args.samplerate)
while True:
    data = q.get()
    if rec.AcceptWaveform(data):
        vc = json.loads(rec.Result())                       # Ralf
        if vc['text'] == 'one':                             # Ralf
            print('recognized: one')                        # Ralf
            subprocess.run(['gnome-calculator'])            # Ralf
        print(rec.Result())
    else:
        print(rec.PartialResult())
    if dump_fn is not None:
        dump_fn.write(data)

Die Zeile vc = json.loads(... holt die JSON-Struktur in ein Python-Dictionary, aus dem wir gleich die erkannten Worte einfach auslesen können. Mit if vc['text'] == 'one' wird geprüft, ob ein Schlüsselwort gesprochen wurde. Falls das der Fall ist, soll der Taschenrechner gestartet werden: subprocess.run(...
An dieser Stelle könnt ihr, statt 'gnome-calculator' ein beliebiges Programm angeben, das ihr starten möchtet.

Mir ist klar, dass dieses Beispiel hinkt. Warum soll das Wort 'one' den Taschenrechner starten? Weil Vosk bei mir nicht viel mehr erkannt hat als das Wort 'one'. Ihr könnt gerne das Wort 'Taschenrechner' sprechen und hoffen, dass es von Vosk erkannt wird :)

Mein Ziel war es, in diesen drei Teilen, die Sprachsteuerung so einfach und nachvollziehbar wie möglich zu beschreiben. Eventuell werde ich in einem vierten Teil an einer besseren Spracherkennung und sinnvolleren Kommandos arbeiten.

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