Amazon Echo / Alexa am Raspberry Pi 3 mit Hifiberry AMP+ auf raspbian stretch

Inzwischen gibt es ja doch zahlreiche Fortschritte in Bezug auf „digitale Assistenten“ und Amazons Alexa / Echo und das Schöne ist, damit lässt sich gut basteln.

Wer einen Raspberry Pi, einen  Lautsprecher und ein Mikrophon über hat, der kann loslegen.

Was braucht man?

D.h. im Vergleich zu Amazon Echo (180 €) ist die Bastelvariante deutlich günstiger, beim Echo Dot fällt das nicht mehr ganz so unterschiedlich aus aber bei der Bastelvariante hat man im Falle der Verstärkerkarte je nach Qualität der Boxen zugleich einen richtig guten Klang.

Das Grobkonzept:

  • Amazon betreibt ein Github-Repository Alexa welches eine Beispielanwendung für Entwickler bereithält: die alexa-avs-sample-app. Auf passenden Geräten installiert kann in Verbindung mit einem Amazon Developer-Konto auf einen sehr großen Teil des Alexa-Funktionsumfangs zurückgegriffen werden. Und das ist mit dem Raspberry eben möglich. Radio, Smart Home, Kalenderzugriffe, usw. – vieles ist damit dann möglich. Bestimmte Sachen (z.B. Kauffunktionen, Amazon Music (nicht aber Webradios) werden z.B. nicht möglich sein)
  • Sprachausgabe und -Aufnahme übernimmt der Raspberry Pi selbst mit seinen Lautsprechern und seinem Microfon.

Hinweis: Dieser Beitrag geht auf die Besonderheiten der Installation unter stretch ein.

Dann kann’s eigentlich losgehen…

Raspbian aufsetzen

Raspbian pixel – aktuell raspbian stretch – downloaden und aufsetzen. Hier gibt’s schon genügend Tutorials und noch eins ist nicht nötig.

Siehe hierzu Download und Installationsanleitung unter https://www.raspberrypi.org/downloads/raspbian/

Audio konfigurieren

Ausgabe: Die Integration und der Test des HifiBerry AMP+ ist auf den HifiBerry-Support-Seiten beschrieben.

Aufnahme: Als Aufnahme dient mir für erste Versuche ein USB-Microfon, welches als Teil einer alten Webcam nun wieder einen Sinn erhalten hat. Ein gutes Micro ist später aber wichtig, wenn man mit Alexa auch von weiter weg reden will…

~/alexa-avs-sample-app $ arecord -l
**** Liste der Hardware-Geräte (CAPTURE) ****
Karte 1: U0x46d0x8dd [USB Device 0x46d:0x8dd], Gerät 0: USB Audio [USB Audio]
 (...)

Entsprechend daraus baut sich dann die /etc/asound.conf auf:

pcm.!default
{
 type asym
 playback.pcm {
  type hw
  card 0
  device 0
 }
 capture.pcm {
  type plug
  slave {
   pcm {
    type hw
    card 1
    device 0
   }
  }
 }
}

Ich habe dies sowohl als .asoundrc im Home-Verzeichnis des Users „pi“ ausgeführt, der später ja ausführender Benutzer sein wird als gleich global in der /etc/asound.conf. Hintergrund ist, dass ansonsten beim Boot eine Standard .asoundrc-Datei angelegt wird und dann die Micros nicht gehen.

Zusätzlich haben wir mit dem AMP+ noch ein Problem: Er steht immer nur einer Anwendung zu einem Zeitpunkt zur Verfügung. Will man aus mehreren Anwendungen drauf zugreifen, bekommt man ein „device busy“ o.ä. zurück und man scheitert. Bei der Alexa Javaclient Sample App gibt das insofern Probleme, dass einerseits eine Art Jingle kommt, die sagt, dass Alexa aufnahmebereit ist, dann nimmt es die Audio auf, gibt teils Rückmeldung und startet dann auch beim Webradio gleich selbiges. Und hier kommt es dann dazu, dass die Geräte plötzlich doch nicht zur Verfügung stehen.

Das Problem lässt sich einfach lösen, indem man pulseaudio als Art virtuelle Soundkarte dazwischenschaltet. Nun können auch parallel gleichzeitig Soundfiles abgespielt werden. Macht oft kaum Sinn, denn sich überlagernde Lieder und Texte wären verwirrend, hier hilft es uns aber.

Pulseaudio lässt sich für die Sitzung des Users „pi“ als Daemon starten und steht ab da dann zur Verfügung:

pulseaudio -D

Alexa Sample App

Amazon betreibt ein Github-Repository Alexa welches eine Beispielanwendung für Entwickler bereithält: die alexa-avs-sample-app. Auf passenden Geräten installiert kann in Verbindung mit einem Amazon Developer-Konto auf einen sehr großen Teil des Alexa-Funktionsumfangs zurückgegriffen werden.

Amazon Developer Konto eröffnen und Produkt registrieren

Erstelle eine Enwicklerkonto unter developer.amazon.com und gehe ins Menü „Alexa“ / „Alexa Voice Service“.

Erstelle nun ein Produkt

  • Product Information:
    • Product Name: Frei wählbar.
    • Product ID: Frei wählbar mit Leerzeichen und Groß- und Kleinschreibung lief ich in Probleme (die spätere Authentifizierung via Browser hat nicht geklappt), daher nur Kleinbuchstaben, keine Leer- und Sonderzeichen.
    • Used as: „device“ wählen.
    • Will your device use a companion app? „Ja“ wählen
    • Die restlichen Angaben sind nicht mehr großartig für uns relevant
  • Security Profile
    • Als Security Profile „Alexa Voice Service Sample App Security Profile“ auswählen.
    • Allowed Origins: https://localhost:3000
    • Allowed return URLs: https://localhost:3000/authresponse
  • Speichern.

Nun werden Client ID, Client Secret und Amazon ID angezeigt. Wir brauchen die Client ID später nicht, dafür aber die „Product-ID“. Nicht verwechseln, wird nicht funktionieren. 😉

Sample App installieren

Die Anwendung installieren wir als User „pi“ im Home-Verzeichnis. Vorher brauchen wir ggf. noch ein paar Pakete

sudo apt install libvlc-dev git-core mc

Weitere Pakete werden während des Installationsprozesses automatisch installiert, aber die libvlc-dev hat mich hier viel Zeit gekostet, die war unberücksichtigt.

Nun rein ins alexa-verzeichnis

cd alexa-avs-sample-app
mcedit automated_install.sh

Nun in der Datei die ProductID, ClientID und ClientSecret ersetzen / eintragen, welche wir aus dem Developer-Konto rausgeholt haben.

… und weiter geht’s mit der Installationsroutine.

. automated_install_sh

Bei der Sprachauswahl Deutsch auswählen. Die Frage nach der Sound-Ausgabe von Audio ist es letztlich egal, was gewählt wird. Es wird hier auch nichts irgendwo in alexa gespeichert es wird lediglich der reguläre Standard-Output in der Raspi-Konfiguration geschrieben (siehe auch hier). Da wir ja mit der Verstärkerkarte den Audiooutput nicht benötigen und das Soundmodul eh deaktiviert haben ist die Auswahl uns an der Stelle egal. Wichtiger ist später eine vernünftige Konfiguration der asound-Konfiguration.

Sample-App starten und erstmalig und einmalig bei Amazon authentifizieren

Zwei Komponenten spielen nun zusammen:

  • Der comopanion-service läuft als Basis im Hintergrund und kommuniziert mit Amazon.
  • Ein javaclient übernimmt die Steuerung und die tatsächliche Soundaufnahme und -Ausgabe.

Companion-Service starten:

cd ~/alexa-avs-sample-app/samples/companionService
npm start &

Durch das & läuft er nun im Hintergrund der Konsole, so sparen wir uns mehrere Konsolenfenster. Mit „fg“ kann ein in den Hintergrund gerücktes Programm wieder nach vorhe gebracht werden.

Javaclient starten:

cd ~/alexa-avs-sample-app/samples/javaclient
mvn exec:exec &

Der Client startet nun und stellt fest, dass der keine Anmeldung bei Amazon vorliegt:

Mit „ja“ wird nun der Webbrowser geöffnet. Es wird moniert werden, dass das ssl-Zertifikat von Localhost nicht überprüft werden kann. Hier einfach auf „erweitert“ und „weiter zu Localhost“ klicken:

Anschließend wird eine Anmeldung am Amazon Developer-Konto notwendig sein und ist das erfolgt erscheint die lapidare Meldung „device token ready“ im Browser. Browser schließen und auch den Dialog des javaclients schließen. Anschließend wird im javaclient auch angezeigt, dass man eingeloggt ist:

Mit Klick auf das Mikro kann man nun Amazon fragen stellen und wird antworten via Audio erhalten.

Das Authentifizieren via Amazon ist ausschließlich beim ersten Start notwendig.

Alexa nutzen

Eine Liste der Befehle gibt’s bei Amazon. „Alexa, spiele Radio Bayern 3“ gibt z.B. über das vorinstallierte skill Webradio „tunein“ den Musikstream des Radiosenders wieder.

Auch die Andoid-App ist empfehlenswert. Ist sie mit dem Gerät verbunden zeigt sie den Suchverlauf und Fenster (Wettermeldungen usw.) an und auch Listen können darauf verwaltet werden und und und. Etwas herumspielen lohnt sich.

wakeWordAgent: Bau Dir ’ne Wanze. Aber beschwer‘ Dich nachher nicht darüber 😉

Wer sich eine Wanze ins Wohnzimmer setzen will, die immer mithört und bei Nutzung des Begriffs „alexa“ dann auch das Übertragen der Daten beginnt (also wie wenn man oben auf den Microfon-Button klickt), kann den wakeword-Agent starten. Nach dem Wort „Alexa“ sollte eine kurze Pause bis zum kurzen Tonsignal abgewartet werden, bis dann weitergesprochen wird.

Hier gibt es zwei Sprach-Engines, kitt_ai und sensory. kitt_ai habe ich aktuell mit dem AMP+ noch nicht zum Laufen gebracht, sensory tut ganz gut seine Dienste:

cd ~/alexa-avs-sample-app/samples/wakeWordAgent/src
./wakeWordAgent -e sensory

Aktuelle Probleme alexa-avs mit raspbian stretch

Beim Kompilieren vom wakewordagent kommt es zu Fehlern, die einerseits in den Foren auf ein inkompatibles wiringpi zurückgeführt wird. In diesem Fall lohnt es sich, wenn man den wakewordAgent nutzen will, wiringpi manuell zu kompilieren.

Ebenso gibt es Inkompatilibitäten in den verwendeten Compilern. Hier wurde zu einer älteren gcc-Version geraten, welche bei mir dann auch zum Erfolg geführt hat.

sudo apt install gcc-4.8 cpp-4.8 libasan0 libcloog-isl4 libgcc-4.8-dev
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 60

Ebenso musste ich (Details hier) die ~/alexa-avs-sample-app/samples/wakeWordAgent/src/CMakeLists.txt in anpassen und die Zeile einfügen:

add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)

Damit lief es dann. Da die automatische Installation von der sample app nicht abbricht, nur weil der wakewordAgent scheitert, muss man nicht alles nochmal durchlaufen, hier genügt es, den wakewordAgent alleine neu zu compilieren:

cd ~/alexa-avs-sample-app/samples/wakeWordAgent/src
cmake .
make -j4

„Autostart“ beim Raspberry-Start

Wenn man sich das Kommandoeingeben sparen will, kann man das auch in einem Script zusammenfassen und in den Desktop-Autostart hängen.

Damit man nicht ganz blind ist, was da passiert, lasse ich die Ausgaben in temporäre Logfiles umleiten, die sich dann ganz gut beobachten lassen.

Scriptname bei mir im „pi“-Homeverzeichnis: ~/alexa.sh

#!/bin/bash
pulseaudio -D
cd ~/alexa-avs-sample-app/samples/companionService
npm start > /tmp/alexa-conpanionservice.log &
cd ~/alexa-avs-sample-app/samples/javaclient
mvn exec:exec > /tmp/alexa-javaclient.log &
cd ~/alexa-avs-sample-app/samples/wakeWordAgent/src
./wakeWordAgent -e sensory > /tmp/alexa-wakeword.log &

Das Script ausführbar machen (und gerne auch mal testen, wenn Bedarf da ist)

chmod o+x alexa.sh

Dann rein in den Autostart als Datei ~/.config/autostart/alexa.desktop mit folgendem Inhalt:

[Desktop Entry]
Comment=Alexa Sample App Autostart
Exec=/bin/sh /home/pi/alexa.sh
Name=a#lexa.sh
Path=/home/pi
Type=Shell

Ggf. noch einstellen, das der Raspberry sich erstens automatisch in den Desktopmodus bootet und auch gleich mit dem benutzer „pi“ automatisch ohne Kennwortabfrage anmeldet.

Nun: Reboot und hoffentlich läuft alles 😉

sudo reboot

Der Javaclient kommt dann nach ein paar Sekunden automatisch hoch und ist – wenn ein Bildschirm angeschlossen ist – entsprechend zu sehen. Wer ihn nicht braucht einfach klein machen aber er muss laufen, sonst klappt das Ganze nicht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.