Siri, Alexa, Cortana und OK Google – digitale Assistenten mit Sprachfähigkeiten infiltrieren auf allen Plattformen das Privatleben des Benutzers. Anwender eines Raspberry Pi nutzen dagegen freie Software, ohne dass internationale Konzerne mithören.
Computer per Sprache statt per Tastatur zu steuern ist ein alter Traum, zuerst in zahlreichen Science-Fiction-Serien der späten Sechzigerjahre verwirklicht. Inzwischen sind sowohl die Rechner als auch die Sprachforscher so weit, dass die Idee tatsächlich im Alltag funktioniert. Technisch kommen hier zwei Komponenten zum Einsatz: Eine sogenannte STT-Engine (englisch für “speech-to-text”, Sprache-zu-Text) wandelt die gesprochene Sprache in Text um. Die andere Richtung übernimmt eine TTS-Engine (“text-to-speech”, Text-zu-Sprache). Dazwischen sitzt ein Programm, das den eingegebenen Text interpretiert und den Ausgabetext erzeugt.
Sowohl für STT als auch für TTS gibt es On- und Offline-Lösungen. Insbesondere die Sprachanalyse benötigt viel Know-how, ein gutes Sprachmodell und ein Lexikon, damit die Spracheingabe nicht zum sinnlosen Silbenbrei verkommt. Diverse Anbieter wie Google erlauben – nicht ganz uneigennützig – die Integration ihrer Online-Engines in selbst geschriebene Programme. Wer jedoch nicht möchte, dass der Anbieter mithört, benötigt eine Offline-Engine.
Zum Glück gibt es mit Pocketsphinx [1] und Julius [2] zwei quelloffene Engines, die autark arbeiten. Die Latte für die Hardware-Anforderungen liegt dabei erfreulich niedrig: Für beide reicht die Rechenleistung eines Raspberry Pi aus. Darüber hinaus gibt es mit dem Jasper-Projekt [3] eine Python-Lösung, die diese (und andere) TTS- und STT-Engines über einen simplen Mechanismus verbindet und so die Sprachsteuerung eines RasPi recht einfach macht. In den folgenden Abschnitten geht es um die Hardware, die Installation der Software sowie um ein kleines Beispiel für die Sprachverarbeitung.
Hardware-Voraussetzungen
Für den normalen Betrieb genügt die Rechenleistung eines Raspberry Pi der ersten Generation. Möchten Sie die Software selbst kompilieren (mehr dazu im nächsten Abschnitt), benötigen Sie aber sehr viel mehr Geduld als beim RasPi 2. Im Betrieb verhielt sich der Ur-Pi ein wenig besser, da bei ihm anders als bei seinem Nachfolger keine Brummgeräusche auftraten. Hier fehlt dem RasPi 2 offensichtlich eine ordentliche Abschirmung der Audiobuchse.
Da der Raspberry Pi im Gegensatz zu anderen SBCs wie etwa dem Banana Pi nicht über ein eingebautes Mikrofon verfügt, stehen entweder eine kleine USB-Soundkarte plus Mikrofon (Abbildung 1) oder gleich ein USB-Mikrofon auf der Einkaufsliste. Die Kombi in Abbildung 1 mit der USB-Soundkarte Creative Soundblaster Play und dem Notebook-Mini-Mikrofon von Hama kostet 17 Euro plus 6 Euro für das Mikro. Das USB-Mikro Akiro von Kinobo in Abbildung 2 gibt es für etwa 18 Euro im Handel.
Die Sprachausgabe erfolgt über den HDMI-Ausgang oder per 3,5-mm-Klinke. Besondere Ansprüche an die Lautsprecher gibt es nicht, hier tun es selbst einfache “Brüllwürfel”: Die synthetischen Stimmen der meisten Sprachausgabe-Engines hauen audiophile Nutzer sowieso nicht vom Hocker. Freilich spricht nichts gegen bessere Lautsprecher, etwa falls das System später sprachgesteuert Musik abspielen soll.
Der richtige Ton
Um später nicht irgendwelche Fehler in der Software zu suchen, sollten Sie Aufnahme (Mikrofon) und Wiedergabe richtig konfigurieren. Das folgende Setup geht von der Ausgabe über die interne Soundkarte mithilfe der 3,5-mm-Klinkenbuchse aus. Die Konfiguration klappt am bequemsten über Raspi-config und dessen Menüpunkt zum Steuern der Ausgabe. Letztlich besteht die Konfiguration nur aus dem Ändern eines Werts in /etc/modprobe.d/alsa-base.conf: Raspi-config stellt dort die Option snd-usb-audio von -2 auf 0.
Schließen Sie das Mikrofon über eine unterstützte USB-Soundkarte an, können Sie sich eine weitere Konfiguration sparen. Dasselbe gilt für USB-Mikrofone, die quasi ein auf das Eingabeteil reduziertes Sound-Device enthalten. Für einen ersten Test und zum Einstellen der Aufnahme- und Wiedergabelautstärke greifen Sie zum Programm alsamixer. Mit [F6] wählen Sie das Sound-Device aus, mit [Tab] gelangen Sie zu den einzelnen Geräten für Ein- und Ausgabe. Über die Pfeiltasten ändern Sie die Einstellungen (Abbildung 3). Taucht statt des Mixerprogramms nur eine Fehlermeldung auf, gehört typischerweise der angemeldete Nutzer nicht zur Gruppe audio – wer mit dem Standardnutzer pi arbeitet, hat dieses Problem nicht.
Hilfreich für die Einrichtung ist das Programm mic-test aus dem zu diesem Artikel entstandenen Github-Projekt des Autors [4]. Das Programm nimmt für fünf Sekunden auf und spielt die Aufnahme anschließend gleich wieder ab – damit lässt sich dann sowohl die Aussteuerung des Mikros als auch die Ausgabelautstärke per Alsamixer den eigenen Bedürfnissen anpassen. Anschließend speichert der Befehl sudo alsactl store die Einstellungen. Beim nächsten Bootvorgang lädt das System diese automatisch wieder.
Installation von Jasper
Nachdem dem Einrichten der Hardware geht es an die Konfiguration der Software. Jasper selbst gibt es ebenfalls auf Github, die Installation fällt nicht weiter schwer. Probleme machen hingegen oft die verschiedenen STT- und TTS-Engines. Für Letztere gibt es immerhin Debian-Pakete; bei Ersteren bleibt Ihnen nur die Wahl zwischen den verschiedenen Online-Lösungen und den Offline-Engines, die von diversen Bibliotheken abhängen – dummerweise gibt es Letztere nicht für Raspbian.
Die Macher von Jasper stellen daher ein Image bereit, bei dem diese Bibliotheken schon in kompilierter Form vorliegen. Allerdings ist dieses Image relativ alt (von Anfang 2014) und nur für den Raspberry Pi Model 1 geeignet. Benutzer des Models 2 müssen sich dagegen durch eine längliche Installationsanleitung quälen, die an einigen Stellen mittlerweile Unstimmigkeiten aufweist.
Einfacher geht es mit dem Script jasper-install aus dem gleichnamigen Github-Projekt des Autors (Details siehe Kasten “Installation von Jasper”). Das Skript unterstützt dabei beide Modelle. Alle Selbstinstallierer können die nächsten Absätze bis auf die Hintergrundinfos ignorieren, die dort beschriebenen Nacharbeiten erfolgen automatisch durch das Skript.









