How To: Sprachsteuerung des Raspberry III B

mastercad
13.01.2018 14:30:13
Ich bin durch einen guten Freund auf den Geschmack gekommen und möchte nun parallel zu seinen Bemühungen auch mein bescheidenes Heim mit ein wenig Smart-Home verfeinern.

Hierbei sind für mich unter anderem sehr wichtige Kriterien:

  • Modulare Software
  • Offline verfügbar
  • akzeptable Reaktionszeiten
  • Quelloffen
  • akzeptable Ergebnisse in der Erkennung


Die Sprache, die hierfür verwendet wird, ist mir relativ egal. Ich habe mir ein SDK in Java heraus gesucht, eines in C++ und eines in Python. Die meisten der Programme unterstützen dabei lediglich englisch, aber auch das sollte kein Problem sein.

Beginnen wir also mit dem Aufsetzen:

Zu beginn liegt vor mir ein Raspberry Pi III B, ich habe mir von der Seite raspberrypi.org das Image herunter geladen, was mir für die Basis vorschwebte. In meinem Fall war das Rasbian Stretch LITE, da ich keinerlei grafische Oberfläche benötige und auch nicht wünsche, der Raspbeerry wird später in einem Schrank installiert sein und per ssh wartbar sein.

Nach dem Aufspielen des Images mit Hilfe von Etcher auf die SD-Card und dem Starten des Raspberry-PI kann man sich an der Console wie folgt anmelden:

User: pi
Password: raspberry

Da das Image als Basis die englische Spracheinstellung benutzt, müssten wir das erstmal umstellen:

BASH code

  1. sudo raspi-config


dort wählen wir Localisation Options aus. Im darauf folgenden Menü wählen wir Change Locale und entscheiden uns nach Bestätigen durch Select für eine von uns präferierte Sprache. In meinem Fall ist das de_DE.UTF-8. Diese Sprache wählen wir mit der Leertaste aus, nachdem wir dahin navigiert sind (pfeil hoch/runter, oder Bild auf/ab) und bestätigen dann mit Ok.

Nun gehen wir noch einmal in die Localisation Options, wählen aber diesmal Change Keyboard Layout aus. Im folgenden Menü wählen wir ein für uns bevorzugtes Layout aus, für mich war das Generic 105-key (Intl) PC. Mit bestätigen durch Enter kann man die speziellen Einstellungen des gewählten Layouts festlegen. Ich wähle hier in der Regel German - Romanian (Germany) aus, da ich so alle Akzenttasten verfügbar habe. Weiter geht es mit dem festlegen der AltGr Taste. Ich wähle hier meiner Tastatur entsprechend Right Alt aus. Den Compose Key lege ich mir auf Menu Key (das ist meist die "Windows"-Taste.

Nun möchte ich das Microfon konfigurieren. Ich nutze dazu das Microfon meines USB-Headsets. Um zu prüfen, ob es überhaupt erkannt wurde, rufe ich folgenden Befehl auf:

BASH code

  1. lsub


bringt mir eine Ausgabe aller angeschlossenen USB-Geräte, unter anderem auch mein Headset, voila, der erste Knackpunkt ist überwunden.

Nun öffnen wir den alsamixer um unseren Ein-und Ausgang zu konfigurieren:

BASH code

  1. alsamixer


dort wählen wir per F6 unser USB device aus und per F4 den Eingang. Im darauf folgenden Menü stellen wir unser Mikrofon auf eine entsprechende Empfindlichkeit, falls das nicht schon eingestellt ist.

Jetzt müssen wir in Erfahrung bringen, unter welchem Eintrag unser USB Gerät gelistet ist. Dafür geben wir in der console folgendes ein:

BASH code

  1. arecord -l


In der darauf folgenden Ausgabe sehen wir, dass unser USB Device als card 1 gelistet ist mit dem Namen Device [USB PnP Audio Device], device 0: USB Audion [USB Audio]

Der nächste Schritt ist hier, unser USB Device als default Ein-Ausgabe einzustellen. Dafür ziehen wir die im vorhergehenden Abschnitt erhaltene Card Nummer hinzu. Hierfür öffnen wir mit nano eine neue Datei Namens /etc/asound.conf und tragen dort folgende Zeilen ein:

BASH code

  1. pcm.!default {
  2. type hw card 1
  3. }
  4.  
  5. ctl.!default {
  6. type hw card 1
  7. }


Nun speichern wir diese Zeilen und starten den Raspberry per sudo reboot now neu.

Nach dem Reboot sollte unter alsamixer unser USB Device default ausgewählt sein.

Um nun unsere Aufnahme zu testen gehen wir wie folgt vor:

Mit arecord -D plughw:, output.wav kann man einen Stream abgreifen und lokal speichern. Das nutzen wir für die Testaufnahme.

wir geben im Terminal folgendes ein (dabei ist CARD unsere Card Nummer und Device unsere Nummer des Geräte, was wir im vorhergehenden Abschnitt durch arecord -l erhalten haben:

BASH code

  1. arecord -D plughw:1,0 output.wav


Wenn wir genug gesprochen bzw. aufgenommen haben, unterbrechen wir die Aufnahme mit Ctrl+C. Danach können wir sie testweise mit aplay wiedergeben:

BASH code

  1. aplay output.wav


Man kann die Lautsprecher, bzw. deren Funktionalität ebenfalls mit speaker-test -c testen:

BASH code

  1. speaker-test -c2


So. Damit haben wir erstmal die notwendige Hardware konfiguriert.

Kommen wir nun zur Software!

Um per ssh auf den raspberry zu kommen, müssen wir es aktivieren:

BASH code

  1. sudo raspi-config


hier wählen wir Interfacing Options aus und im folgenden Menü SSH. Dort wählen wir Ja bzw. Yes aus und aktivieren damit SSH. Ab sofort können wir uns per Terminal am raspberry mit den oben genannten Credentials authentifizieren.

Ich habe mich hier für CMU-Sphinx und Jasper entschieden. Das sind 2 verschiedene Spracherkennungslösungen und ich werde in diesem How To die Wege der Installation und Einrichtung, sowie deren Anwendung und die Pro und Contras beleuchten.

Um mit der aktuellen Version von CMU-Sphinx arbeiten zu können, benötigen wir erstmal Git, also installieren wir das erstmal:

BASH code

  1. sudo apt install git-core


außerdem benötigen wir für die Entwicklung für CMU-Sphinx noch einige Pakete:

BASH code

  1. sudo apt install --yes cmake automake autoconf libtool bison swig python-dev libpulse-dev python-pip libasound2-dev libportaudio-dev python-pyaudio gfortran g++ autoconf-archive


Jetzt wird erstmal für Jasper alles vorbereitet. Dazu tragen wir im Profil des users "pi" (oder eines anderen, wenn du einen bestimten user angelegt hast) ein paar umgebungsvariablen ein, bzw. erweitern diese:

BASH code

  1. nano ~/.bashrc-profile


BASH code

  1. export LD_LIBRARY_PATH="/usr/local/lib"


außerdem müssen in der ~/.bashrc noch Einträge hinterlegt werden:

BASH code

  1. nano ~/.bashrc


BASH code

  1. LD_LIBRARY_PATH="/usr/local/lib"
  2. export LD_LIBRARY_PATH
  3. PATH=$PATH:/usr/local/lib/
  4. export PATH


Nun müssen wir diese Einträge aktivieren:

BASH code

  1. source .bashrc


Ist das geschehen, müssen wir präventiv noch die Sawp Partition erweitern, um ein später notwendiges kompilieren zu ermöglichen:

BASH code

  1. sudo su
  2. echo "CONF_SWAPSIZE=512" > /etc/dphys-swapfile
  3. dphys-swapfile setup
  4. dphys-swapfile swapon
  5. reboot


Jetzt kann die Installation von Jasper beginnen:

BASH code

  1. git clone https://github.com/jasperproject/jasper-client.git jasper
  2.  
  3. sudo pip install --upgrade setuptools
  4. sudo pip install -r jasper/client/requirements.txt
  5. chmod +x jasper/jasper.py


Dieser Vorgang kann unter Umständen eine erhebliche Weile dauern, also ruhig bleiben ;)

Wenn dies erledigt ist, installieren wir CMUCLMTK, ein Wrapper um die Sprachdateien von CMU Sphinx verarbeiten zu können:

BASH code

  1. svn co https://cmusphinx.svn.sourceforge.net/svnroot/cmusphinx/trunk/cmuclmtk
  2. cd cmuclmtk
  3. ./autogen.sh && make && sudo make install


als nächstes installieren wir openfst, eine Software um den Vergleich von Ähnlichkeiten bei der Spracherkennung zu optimieren:

BASH code

  1. #wget http://www.openfst.org/twiki/pub/FST/FstDownload/openfst-1.6.5.tar.gz
  2. #tar -xvf openfst-1.6.5.tar.gz
  3. #cd openfst-1.6.5
  4. #sudo ./configure --enable-compact-fsts --enable-const-fsts --enable-far --enable-lookahead-fsts --enable-pdt
  5. wget http://www.openfst.org/twiki/pub/FST/FstDownload/openfst-1.6.2.tar.gz
  6. tar -xvzf openfst-1.6.1.tar.gz
  7. cd openfst-1.6.1
  8. # Minimal configure, compatible with current defaults for Kaldi
  9. ./configure --enable-static --enable-shared --enable-far --enable-ngram-fsts
  10. make -j 4
  11. sudo make install


BASH code

  1. cd
  2. # Extend your LD_LIBRARY_PATH .bashrc:
  3. echo 'export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib:/usr/local/lib/fst'
  4. >> ~/.bashrc
  5. source ~/.bashrc


/*
Da die Dateinamen sich geändert haben zu einer vorherigen Version zu openfst und Phonetarius sich auf die alten Dateinamen bezieht, müssen wir noch folgendes ausführen, um alte Dateinamen als Sysmlinks einzufügen:

BASH code

  1. sudo su
  2. cd /usr/local/lib
  3. for f in libfst*; do ln -s "../$f" "fst/$f"; done

*/

Nun kommt noch m2m-aligner:

BASH code

  1. git clone https://github.com/letter-to-phoneme/m2m-aligner.git
  2. cd m2m-aligner
  3. make


Um selbst komfortabel mit Jasper zu trainieren und neue Worte, Befehle und/oder Slangs oder Dialekte zu lernen, benötigen wir noch mitlm:

BASH code

  1. git clone https://github.com/mitlm/mitlm.git
  2. cd mitlm
  3. autoreconf -i
  4. ./configure
  5. make
  6. sudo make install


zusätzlich benötigen wir noch phonetisaurus:

BASH code

  1. #git clone https://github.com/mozilla/g2p.git
  2. #cd g2p/phonetisaurus
  3. #wget https://phonetisaurus.googlecode.com/files/phonetisaurus-0.7.8.tgz
  4. #wget http://phonetisaurus.googlecode.com/files/g014b2b.tgz
  5. #tar -xvf phonetisaurus-0.7.8.tgz
  6. #tar -xvf g014b2b.tgz
  7.  
  8. git clone https://github.com/AdolfVonKleist/Phonetisaurus.git
  9. cd Phonetisaurus
  10. ./configure --enable-far
  11. make && sudo make install
  12. cd src
  13. make


Troubleshooting:



Beim aufruf von jasper.py kommt folgender fehler:

Zitat :

File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 21, in
from pip._vendor.requests.packages.urllib3.exceptions import DependencyWarning


hier gibt es 2 Ansätze:

zum einen (hat bei mir nicht geholfen):

BASH code

  1. sudo apt install --only-upgrade python-pip
  2. pip2 install --upgrade urllib3


zum anderen (hat bei mir geholfen):

BASH code

  1. sudo apt remove python-pip
  2. sudo easy_install pip


Der Fehler

Zitat :

DEBUG:client.diagnose:Executable 'espeak' not found


wurde gelöst durch:

BASH code

  1. sudo apt install espeak