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/

Marius
Geschrieben von Marius am 14. Juli 2021

Ich bring Dich mal auf den Stand der Dinge, welche sich rasend schnell entwickeln:

Ich hab den PVA schon auf das Pinephone portiert :D mehr dazu hier und in Kürze im Blog.

Testrun of "Sophia: Personal Voice Assistant" on Pinephone (best of):

http://static.bloggt-in-braunschweig.de/Pinephone-PVA-TEST1.mp4

works on desktops too ;) It will drain your battery for sure...

OS: Fedora 35 STT: vosk (python3) TTS: espeak+mbrola PVA: selfwritten in Java

Commands: listen to musik, watching videos, volumecontrol in audioplayer QMMP, weather infos, starting varios apps and abstracts like NETFLIX

Nextgoal:

  • client/server version of PVA to have memory to react in context to the user requests.
  • more functionality i.e. making calls, sending sms,

Falls Du probleme bei der Texterkennung hast, zwei Dinge sind wichtig:

Rauschfreies Mikro und den Inputlevel des Audioaufnahmegerätes nicht zu groß einstellen, sonst übersteuerts und dann klappt es nicht. Ich hab bei mir 25% für die Aufnahmeapp benutzt, hatte 99,9% erkennung ohne Nebengeräusche. Mit Straßenlärm gehts leicht bergab.

Das Video zeigt Euch allen mal, wie gut das sein kann.