Listing 4
# Restart-Modul für Jasper
import re
import os
WORDS = ["REBOOT", "YES", "OKAY", "NO"]
def isValid(text):
return bool(re.search(r'\breboot\b', text, re.IGNORECASE))
def handle(text, mic, profile):
mic.say("Really reboot the system now?")
response = mic.activeListen()
if bool(re.search(r'\b(yes|okay)\b',response,re.IGNORECASE)):
mic.say("Initiating reboot. Please wait for system restart")
os.system("sudo reboot")
else:
mic.say("Reboot cancelled")
Am Anfang (Zeile 5) steht die Definition der Schlüsselwörter für das neue Modul. Darauf folgen zwei Funktionen (die genau so heißen müssen): isValid(text) prüft, ob der transkribierte Text für das Modul überhaupt relevant ist. Der Aufruf handle(text,mic,profile) löst dann die Aktion aus. Die Wörter “YES”, “OKAY” und “NO” sind zwar keine Schlüsselwörter und werden auch nicht vom Modul geprüft; die Aufnahme in die Wortliste sorgt aber dafür, dass sie im Vokabular landen (dort sind alle zu erkennenden Wörter hinterlegt).
In unserem Fall (Neustart des Rechners) fragt Jasper zur Sicherheit noch mal nach. Da die Funktion auch Zugriff auf das Profil des Nutzers hat (dritter Parameter, ausgelesen aus der Profildatei ~/.jasper/profile.yml), lassen sich dort hinterlegte Passwörter, Benutzer-IDs und so weiter nutzen.
Ein Problem der Jasper-Architektur liegt in der Fokussierung auf Schlüsselwörter. Nur die definierten Wörter landen im Vokabular und werden somit von Jasper erkannt. An frei formulierten Texten scheitert das Programm. Ebenso kommt es zu Konflikten zwischen den Modulen, sobald diese identische Wörter erkennen und verarbeiten. Für diesen Fall gibt es die Variable PRIORITY – das Modul mit der höchsten Priorität geht vor.
Anpassungen
Aus der Sicht von deutschsprachigen Nutzern steht das Anpassen der Sprache an erster Stelle. Das klappt jedoch nicht ohne erheblichen Aufwand, da die zugrundeliegenden STT-Toolkits Deutsch nur sehr eingeschränkt unterstützen. Es geht unter anderem darum, ein eigenes akustisches Modell zu erstellen. Details dazu finden sich auf den Seiten von Voxforge [6]. Diverse Foreneinträge machen klar, dass es sich dabei um keine Sache von wenigen Stunden oder Tagen handelt.
Was sich hingegen leicht anpassen lässt, ist das unglücklich gewählte, weil nur mit Mühe korrekt aussprechbare Befehlsschlüsselwort “Jasper”. Dazu tauschen Sie das Wort sowohl in der Datei jasper/static/keyword_phrases als auch in jasper/jasper.py aus. Die neue Keyword-Datei laden Sie dann auf die Webseite eines Online-Tools [7] hoch und generieren sich dort ein neues Dictionary und Language-Model (Dateinamen Name.dic und Name.lm). Im Verzeichnis jasper/static überschreiben Sie anschließend die Dateien dictionary_persona.dic und languagemodel_persona.lm mit den frisch erzeugten Versionen.
Da die Erkennung immer auf Wörterbucheinträgen basiert, sollten Sie idealerweise als Schlüsselwort einen einfachen, verbreiteten Namen wählen, dessen Aussprache sich im Deutschen und Englischen nur wenig unterscheidet. Aus diesem Grund fällt zum Beispiel das naheliegende “RasPi” flach.
Am Einfachsten lässt sich die Stimme für die Sprachausgabe ändern: Hier müssen Sie nur ein paar Zeilen in der Profildatei anpassen. Statt der E-Speak-TTS-Engine (Listing 4, Zeilen 15 bis 19) verwenden Sie etwa die F-Lite-Engine (Listing 6), für die es eine Reihe verschiedener Stimmen gibt. Die Stimme slt klingt deutlich natürlicher als die roboterähnliche E-Speak-Ausgabe und ist dennoch gut zu verstehen.
Listing 6
tts_engine: flite-tts flite-tts: voice: 'slt'
Fazit
Der Einstieg in Jasper gestaltet sich aufgrund der langwierigen Vorarbeiten aufwendig, und auch im Gebrauch macht Jasper wegen der mehr schlechten als rechten Spracherkennung nicht sonderlich viel Spaß. Bei gut eingestelltem Mikro und intelligent gewählten Schlüsselwörtern funktioniert Jasper dennoch überraschend zuverlässig. Die eigentliche Leistung des Jasper-Projekts liegt auch darin, alle Komponenten mit einfachem und kompaktem Python-Code zu verbinden. Selbst wer Jasper nicht direkt nutzen möchte, profitiert davon, denn weite Teile lassen sich einfach per Cut & Paste in eigene Projekte integrieren.
Da Jasper quasi ständig lauscht, verbietet sich ein Ausweichen auf die guten Online-Sprach-Engines von Google und Co., da sonst jedes gesprochene Wort dort landet. In eigenen Projekten ließe sich dieses Problem jedoch leicht lösen: Statt über ein gesprochenes Schlüsselwort (“Jasper”) leitet etwa ein Knopfdruck (oder Klick auf ein Icon) die Sprachaufnahme ein. So funktionierte vor der Einführung von OK Google auch die Spracherkennung von Android. Google bekäme dann nur gezielt gesprochene Befehle für die STT-Engine zu hören – damit ließe sich dann in vielen Bereichen gut leben.
Der Autor
Bernhard Bablok ([email protected]) arbeitet bei der Allianz Managed&Operations Services SE als SAP-HR-Entwickler. Wenn er nicht Musik hört, mit dem Rad oder zu Fuß unterwegs ist, beschäftigt er sich mit Themen rund um Linux, Programmierung und neuerdings Kleincomputer.
Infos
- Pocketsphinx: http://cmusphinx.sourceforge.net
- Julius: http://julius.osdn.jp/en_index.php
- Jasper: http://jasperproject.github.io
- Jasper-Installationsskript: http://github.com/bablokb/jasper-install
- IDs von Wetterstationen: http://www.wunderground.com/about/faq/international_cities.asp
- Voxforge: http://www.voxforge.org
- Online-Tool für Lexikon und Sprachmodell: http://www.speech.cs.cmu.edu/tools/lmtool-new.html





