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:
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:
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:
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:
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:
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:
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:
Wenn wir genug gesprochen bzw. aufgenommen haben, unterbrechen wir die Aufnahme mit Ctrl+C. Danach können wir sie testweise mit aplay wiedergeben:
Man kann die Lautsprecher, bzw. deren Funktionalität ebenfalls mit speaker-test -c testen:
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:
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:
außerdem benötigen wir für die Entwicklung für CMU-Sphinx noch einige Pakete:
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:
außerdem müssen in der ~/.bashrc noch Einträge hinterlegt werden:
Nun müssen wir diese Einträge aktivieren:
Ist das geschehen, müssen wir präventiv noch die Sawp Partition erweitern, um ein später notwendiges kompilieren zu ermöglichen:
Jetzt kann die Installation von Jasper beginnen:
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:
als nächstes installieren wir openfst, eine Software um den Vergleich von Ähnlichkeiten bei der Spracherkennung zu optimieren:
/*
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:
*/
Nun kommt noch m2m-aligner:
Um selbst komfortabel mit Jasper zu trainieren und neue Worte, Befehle und/oder Slangs oder Dialekte zu lernen, benötigen wir noch mitlm:
zusätzlich benötigen wir noch phonetisaurus:
Beim aufruf von jasper.py kommt folgender fehler:
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):
zum anderen (hat bei mir geholfen):
Der Fehler
DEBUG:client.diagnose:Executable 'espeak' not found
wurde gelöst durch:
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
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
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
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
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
pcm.!default { type hw card 1 } ctl.!default { type hw card 1 }
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:
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
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
aplay output.wav
Man kann die Lautsprecher, bzw. deren Funktionalität ebenfalls mit speaker-test -c
BASH code
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
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
sudo apt install git-core
außerdem benötigen wir für die Entwicklung für CMU-Sphinx noch einige Pakete:
BASH code
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
nano ~/.bashrc-profile
BASH code
export LD_LIBRARY_PATH="/usr/local/lib"
außerdem müssen in der ~/.bashrc noch Einträge hinterlegt werden:
BASH code
nano ~/.bashrc
BASH code
LD_LIBRARY_PATH="/usr/local/lib" export LD_LIBRARY_PATH PATH=$PATH:/usr/local/lib/ export PATH
Nun müssen wir diese Einträge aktivieren:
BASH code
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
sudo su echo "CONF_SWAPSIZE=512" > /etc/dphys-swapfile dphys-swapfile setup dphys-swapfile swapon reboot
Jetzt kann die Installation von Jasper beginnen:
BASH code
git clone https://github.com/jasperproject/jasper-client.git jasper sudo pip install --upgrade setuptools sudo pip install -r jasper/client/requirements.txt 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
svn co https://cmusphinx.svn.sourceforge.net/svnroot/cmusphinx/trunk/cmuclmtk cd cmuclmtk ./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
#wget http://www.openfst.org/twiki/pub/FST/FstDownload/openfst-1.6.5.tar.gz #tar -xvf openfst-1.6.5.tar.gz #cd openfst-1.6.5 #sudo ./configure --enable-compact-fsts --enable-const-fsts --enable-far --enable-lookahead-fsts --enable-pdt wget http://www.openfst.org/twiki/pub/FST/FstDownload/openfst-1.6.2.tar.gz tar -xvzf openfst-1.6.1.tar.gz cd openfst-1.6.1 # Minimal configure, compatible with current defaults for Kaldi ./configure --enable-static --enable-shared --enable-far --enable-ngram-fsts make -j 4 sudo make install
BASH code
cd # Extend your LD_LIBRARY_PATH .bashrc: echo 'export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib:/usr/local/lib/fst' >> ~/.bashrc 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
sudo su cd /usr/local/lib for f in libfst*; do ln -s "../$f" "fst/$f"; done
*/
Nun kommt noch m2m-aligner:
BASH code
git clone https://github.com/letter-to-phoneme/m2m-aligner.git cd m2m-aligner 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
git clone https://github.com/mitlm/mitlm.git cd mitlm autoreconf -i ./configure make sudo make install
zusätzlich benötigen wir noch phonetisaurus:
BASH code
#git clone https://github.com/mozilla/g2p.git #cd g2p/phonetisaurus #wget https://phonetisaurus.googlecode.com/files/phonetisaurus-0.7.8.tgz #wget http://phonetisaurus.googlecode.com/files/g014b2b.tgz #tar -xvf phonetisaurus-0.7.8.tgz #tar -xvf g014b2b.tgz git clone https://github.com/AdolfVonKleist/Phonetisaurus.git cd Phonetisaurus ./configure --enable-far make && sudo make install cd src 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
sudo apt install --only-upgrade python-pip pip2 install --upgrade urllib3
zum anderen (hat bei mir geholfen):
BASH code
sudo apt remove python-pip sudo easy_install pip
Der Fehler
Zitat :
DEBUG:client.diagnose:Executable 'espeak' not found
wurde gelöst durch:
BASH code
sudo apt install espeak