Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Raspberry Pi + Alexa Voice Service

ghost666 12 Kwi 2016 22:53 7605 0
  • Raspberry Pi + Alexa Voice Service
    Opisany poniżej projekt pokazuje, jak krok po kroku uruchomić Alexa Voice Service na Raspberry Pi korzystając z klienta Java na RPi oraz serwera Node.js. Serwer Node.js wykorzystany jest w układzie do logowania się do Amazona i uzyskania kodu autoryzacyjnego w tym serwisie przez przeglądarkę.

    Alexa Voice Service (AVS) to usługa Amazonu, która dodaje do budowanych przez nas urządzeń możliwość rozpoznawania głosu. Jeśli nasz system wyposażony jest w mikrofon i głośniki, a także podłączenie do sieci, możemy zadawać mu głosowo pytania, a uzyskamy od niego odpowiedzi. Tematy rozmów mogą być różnorodne, AVS może podawać informacje o pogodzie, przeszukiwać za nas Wikipedię etc., a dzięki Alexa Skills Kit możemy także dodawać własne funkcje.

    Poniższy opis przeprowadzi nas krok po kroku przez instalację wszystkich potrzebnych składników systemu pozwalającego na korzystanie z AVS, opisze przykładowe programy i sprzęt, jaki potrzebny jest nam do korzystania z opisywanej usługi.

    Początek

    Potrzebny nam będzie szereg elementów. Oprócz samego Raspberry Pi 2 lub 3 potrzebujemy:
    * Zasilacz microUSB
    * Kartę SD z NOOBSem o pojemności co najmniej 8 GB.
    * Kabel ethernet.
    * Mikrofon na USB, jako że RPi nie posiada wbudowanego mikrofonu czy wejścia analogowego.
    * Klawiaturę i myszkę na USB do obsługi komputera oraz monitor z wejściem HDMI.
    * Opcjonalnie - kartę sieciową WiFi na USB.

    Przygotowanie Raspberry Pi

    Do slotu na kartę SD wkładamy kartę z przygotowanym instalatorem NOOBS, do portów USB podłączamy mikrofon, klawiaturę i mysz a także kartę WiFi, jeśli chcemy z niej korzystać. Podpinamy 'malinę' do monitora poprzez port HDMI i podłączamy do niej zasilanie.

    Instalacja systemu

    Po podłączeniu komputera do prądu system załaduje z karty instalator NOOBS. Wybieramy w nim, jaki OS chcemy zainstalować - w opisywanym przypadku będzie to Raspbian. Instalacja systemu może trochę potrwać.

    Raspberry Pi + Alexa Voice Service


    Po zainstalowaniu się systemu możemy przejść do programu konfiguracyjnego wpisując raspi-config. W nim możemy ustawić datę, godzinę, włączyć kamerę dodawać nowych użytkowników etc. Naciskając Finish, kończymy pracę programu i resetujemy komputer. Aby załadować interfejs graficzny, po uruchomieniu w linii komend wpisujemy startx. Domyślna nazwa użytkownika i hasło to, odpowiednio, pi i raspberry.

    Instalacja oprogramowania

    Oprogramowanie instalować będziemy z poziomu terminala, który jest preinstalowany w systemie i jest dostępny z poziomu interfejsu graficznego jak i (oczywiście) linii komend).

    Włączenie SSH[/b]

    SSH umożliwia zdalny dostęp do linii komend naszego Raspberry Pi z poziomu innego komputera, dzięki temu możliwe będzie zdalne pracowanie na naszej 'malinie' bez konieczności podpinania do niej monitora, klawiatury czy myszy.

    Domyślnie SSH jest włączone, jednakże jeśli z jakiejś przyczyny nie jesteśmy w stanie połączyć się z RPi, to warto się upewnić, czy wszystko jest dobrze ustawione w konfiguracji komputera. Podobnie jak przy ustawianiu daty i godziny do konfiguracji dostęp mamy poprzez raspi-config.

    [u]Połączenie się do Raspberry Pi poprzez SSH


    Aby połączyć się z 'maliną' przez SSH musimy znać jej numer IP. Sprawdzić go możemy wpisując w terminali hostname -I. Komputer poda nam numer IP. Na drugiej maszynie w programie z jakiego korzystamy do połączenia się poprzez SSH (na przykład Putty) wpisujemy pi@<numer IP> i podajemy hasło, gdy komputer nas o nie zapyta. W tym momencie możemy już zdalnie pracować na RPi.

    Instalacja serwera VNC

    VNC to system pozwalający na udostępnianie pulpitu graficznego, co umożliwi nam zdalne łączenie się z RPi i obsługę interfejsu graficznego z zdalnej maszyny. Rozwiązanie takie jest niezwykle praktyczne - nie potrzebujemy wtedy dodatkowego monitora dla 'maliny'. Aby zainstalować serwer VNC w linii komend, wpisujemy:

    Code:
    sudo apt-get install tightvncserver


    Aby uruchomić serwer VNC, wpisujemy tightvncserver. Musimy też upewnić się, że serwer uruchamiać będzie się za każdym razem, gdy uruchamiać będziemy komputer, dlatego też musimy dodać go do autostartu. Aby to zrobić, musimy wpisać następujące komendy:

    Code:
    cd /home/pi
    
    cd .config
    mkdir autostart
    cd autostart
    nano tightvnc.desktop


    Teraz w nowo stworzonym pliku konfiguracyjnym wpisujemy:

    Code:
    [Desktop Entry]
    
    Type=Application
    Name=TightVNC
    Exec=vncserver :1
    StartupNotify=false


    Aby podłączyć się poprzez VNC do naszego Raspberry Pi, skorzystać możemy z jednego z poradników (linki poniżej), zależnie z jakiego systemu operacyjnego korzystamy na komputerze, z którego się łączymy:

    Mac: See https://www.raspberrypi.org/documentation/remote-access/vnc/mac.md
    Windows: https://www.raspberrypi.org/documentation/remote-access/vnc/windows.md
    Linux: https://www.raspberrypi.org/documentation/remote-access/vnc/linux.md

    Instalacja VLC

    Aby zainstalować VLC w terminalu, wpisujemy:

    Code:
    sudo apt-get install vlc-nox vlc-data


    Jeśli na naszym Raspberry Pi zainstalowane jest już VLD, usunąć musimy stare pliki konfiguracyjne:

    Code:
    sudo apt-get remove --purge vlc-plugin-notify
    
    sudo rm /usr/lib/vlc/plugins/codec/libsdl_image_plugin.so



    Jeśli podczas instalacji napotkamy błąd "Unable to fetch", musimy spróbować aktualizacji apt-get przed instalacją:

    Code:
    sudo apt-get update
    
    sudo apt-get upgrade
    sudo apt-get install vlc-nox vlc-data


    Aby przetestować, czy VLC zainstalowało się poprawnie, wpiszmy:

    Code:
    whereis vlc


    Powinniśmy zobaczyć, np:

    Code:
    vlc: /usr/bin/vlc /usr/lib/vlc /usr/share/vlc /usr/share/man/man1/vlc.1.gz


    Aby ustalić zmienne środowiskowe VLC, wpisujemy w terminal:

    Code:
    export LD_LIBRARY_PATH=/usr/lib/vlc
    
    export VLC_PLUGIN_PATH=/usr/lib/vlc/plugins


    Instalacja Node.js

    Jeśli komenda node -v zwraca command not found, zainstalować musimy Node.js:

    Code:
    sudo apt-get update 
    
    sudo apt-get upgrade
    curl -sL https://deb.nodesource.com/setup | sudo bash -
    sudo apt-get install nodejs


    Instalacja Java Development Kit

    Na naszym Raspberry Pi zainstalować trzeba Java Development Kit (JDK) w wersji 8 lub wyższej. Najpierw pobieramy ze strony Oracle odpowiedni plik tar.gz z instalacją dla systemu Linux i procesora ARM 32. W czasie pisania tego artykułu był to plik pod nazwą jdk-8u77-linux-arm32-vfp-hflt.tar.gz.

    Następnie wypakowujemy zawartość pliku do folderu /opt i instalujemy JDK:

    Code:
    sudo tar zxvf jdk-8u77-linux-arm32-vfp-hflt.tar.gz -C /opt
    
    sudo update-alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_77/bin/javac 1
    sudo update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_77/bin/java 1
    sudo update-alternatives --config javac
    sudo update-alternatives --config java


    Aby zweryfikować poprawność naszych ustawień, wpisujemy:

    Code:
    java -version
    
    javac -version


    Komendy te zwrócą wersję zainstalowanego JDK.

    Instalacja Mavena

    Pobieramy plik apache-maven-3.3.9-bin.tar.gz z https://maven.apache.org/download.cgi i wypakowujemy jego zawartość do folderu /opt. Następnie musimy skonfigurować miejsce instalacji. Tworzymy nowy plik /etc/profile.d/maven.sh i wpisujemy w nim:

    Code:
    export M2_HOME=/opt/apache-maven-3.3.9
    
    export PATH=$PATH:$M2_HOME/bin


    Po zapisaniu pliku musimy się przelogować, aby skrypt się uruchomił. Sprawdzić instalację Mavena możemy podobnie jak dla JDK, wpisując:

    Code:
    mvn -version


    Konfiguracja Alexa Voice Service

    Aby zacząć korzystać z AVSa, musimy założyć darmowe konto developerskie na Amazonie (https://developer.amazon.com/login.html) i pobrać przykładową aplikację, korzystającą z AVSa wraz z pakietami, jakie potrzebuje. Aplikację pobieramy z githuba (https://github.com/amzn/alexa-avs-raspberry-pi/archive/master.zip). Po pobraniu aplikacji z githuba rozpakowujemy i umieszczamy ją w dowolnym folderze na RPi, dla wygody ścieżkę do folderu oznaczać będziemy w dalszej części artykułu <REFERENCE_IMPLEMENTATION>

    Teraz możemy zarejestrować się na witrynie Amazona i założyć profil bezpieczeństwa. Na stronie developer.amazon.com po zalogowaniu klikamy w zakładkę Apps & Services -> Alexa -> Alexa Voice Service -> Get Started

    Raspberry Pi + Alexa Voice Service


    Podczas rejestracji produktu wybieramy Device.

    Raspberry Pi + Alexa Voice Service


    Uzupełniamy wymagane dane, na przykład:

    Device Type ID: my_device
    Display Name: My Device

    Aby potwierdzić, naciskamy Next.

    Raspberry Pi + Alexa Voice Service


    Aby stworzyć profil bezpieczeństwa, wybieramy z listy "Security Profile", "Create a new profile".

    Raspberry Pi + Alexa Voice Service


    W zakładce ustawień ogólnych uzupełniamy:

    Security Profile Name: Alexa Voice Service Sample App Security Profile
    Security Profile Description: Alexa Voice Service Sample App Security Profile Description

    I naciskamy Next, co wygeneruje nasze ID oraz tzw. "Client Secret".

    Raspberry Pi + Alexa Voice Service Raspberry Pi + Alexa Voice Service


    Wchodzimy w zakładkę Web Settings, gdzie naciskamy w rozwijanym menu przycisk "Edit". Ustawiamy:

    Allowed Origins: Naciskamy "Add Another" i dodajemy wpis https://localhost:3000 w polu tekstowym, jakie się pojawi.
    Allowed Return URLs: Naciskamy "Add Another" i wpisujemy https://localhost:3000/authresponse.

    Naciskamy Next.

    Raspberry Pi + Alexa Voice Service


    Zapisujemy na naszym komputerze ten obrazek:

    Raspberry Pi + Alexa Voice Service


    W ustawieniach wpisujemy dalej:

    Category: Other
    Description: Alexa Voice Service sample app test
    What is your expected timeline for commercialization?: Longer than 4 months / TBD
    How many devices are you planning to commercialize?: 0

    Naciskamy Next.

    Enable Amazon Music?: No

    Naciskamy przycisk Submit.

    Raspberry Pi + Alexa Voice Service Raspberry Pi + Alexa Voice Service


    Wygenerowanie certyfikatów

    Aby byłot o możliwe musimy zainstalować SSL:

    Code:
    sudo apt-get install openssl


    Aby sprawdzić poprawność instalacji wpisujemy:

    Code:
    whereis openssl


    Zmieniamy katalog na <REFERENCE_IMPLEMENTATION>/samples/javaclient - tutaj znajduje się nasza aplikacja.

    Code:
    cd <REFERENCE_IMPLEMENTATION>/samples/javaclient


    Teraz edytujemy polik ssl.cnf, który jest plikiem konfiguracyjnym SSL. Wpisujemy wartości we wszystkie pole, gdzie wpisany jest parametr rozpoczynający się od YOUR_

    Pamiętajmy, że zmienna countryName to dwie litery - inaczej certyfikat nie będzie działał. Następnie musimy nadać flagę wykonywalności skryptowi generującemu certyfikat SSL i go uruchomić:

    Code:
    chmod +x generate.sh
    
    ./generate.sh


    Skrypt zapyta nas o kilka wartości:

    Product ID: my_device
    Serial number: 123456
    Password: nasze hasło

    Następnie musimy edytować plik konfiguracyjny serwera Node.js, który znajduje się w <REFERENCE_IMPLEMENTATION>/samples/companionService/config.js.

    Ustawiamy sslKey na <REFERENCE_IMPLEMENTATION>/samples/javaclient/certs/server/node.key
    Ustawiamy sslCert na <REFERENCE_IMPLEMENTATION>/samples/javaclient/certs/server/node.crt
    Ustawiamy sslCaCert na <REFERENCE_IMPLEMENTATION>/samples/javaclient/certs/ca/ca.crt

    Następnie musimy zmienić wpisy w pliku konfiguracyjnym klienta Java. Plik znajduje się w <REFERENCE_IMPLEMENTATION>/samples/javaclient/config.json. Wprowadzamy następujące zmiany:

    Ustawiamy companionApp.sslKeyStore na <REFERENCE_IMPLEMENTATION>/samples/javaclient/certs/server/jetty.pkcs12
    Ustawiamy companionApp.sslKeyStorePassphrase na hasło, jakie podaliśmy podczas generacji certyfikatu SSL.
    Ustawiamy companionService.sslClientKeyStore na <REFERENCE_IMPLEMENTATION>/samples/javaclient/certs/client/client.pkcs12
    Ustawiamy companionService.sslClientKeyStorePassphrase na hasło jakie podaliśmy podczas generacji certyfikatu SSL.
    Ustawiamy companionService.sslCaCert na <REFERENCE_IMPLEMENTATION>/samples/javaclient/certs/ca/ca.crt

    Instalacja zależności

    Przechodzimy do folderu <REFERENCE_IMPLEMENTATION>/samples/companionService i instalujemy zależności:

    Code:
    cd <REFERENCE_IMPLEMENTATION>/samples/companionService
    
    npm install


    Uruchomienie profilu bezpieczeństwa

    W przeglądarce otwieramy stronę visit https://developer.amazon.com/lwa/sp/overview.html, gdzie podajemy "privacy policy URL" zaczynający się od http:// lub https://. Nie musi to być rzeczywisty adres, może być na przykład http://example.com. Dodać możemy też obraz, który wyświetlać będzie się podczas logowania do Amazonu. Zapisujemy ustawienia przyciskiem "Save".

    Obok Alexa Voice Service Sample App Security Profile, naciskamy "Show Client ID and Client Secret". Zapisujemy pokazane tam wartości - będziemy potrzebować ich później.

    Aktualizacja plików konfiguracyjnych

    Logujemy się poprzez VNC do naszej 'maliny' i w edytorze tekstowym otwieramy plik <REFERENCE_IMPLEMENTATION>/samples/companionService/config.js w którym wpisujemy:

    clientId: Wartość, którą zapisaliśmy w poprzednim kroku.
    clientSecret: Wartość, którą zapisaliśmy w poprzednim kroku.
    products: Obiekt ten składa się z klucza, który musi być taki sam jak ID, który wpisaliśmy na portalu Amazona i wartości, która jest tablicą, będącą identyfikatorem produktu. Jeśli postępowaliśmy według poradnika to ID to my_device. Jako unikatowy klucz podać możemy dowolny ciąg znaków, na przykład 123456. Wtedy wpis JSON wyglądać będzie tak: {"my_device": ["123456"]}.

    Raspberry Pi + Alexa Voice Service


    Teraz otwieramy w edytorze tekstowym plik: <REFERENCE_IMPLEMENTATION>/samples/javaclient/config.json i uzupełniamy następujące wartości:

    productId: string "my_device"
    dsn: Identyfikator produktu, w naszym przypadku wpisane poprzednio 123456.
    provisioningMethod: wpisujemy companionService.

    Raspberry Pi + Alexa Voice Service


    Teraz przygotować musimy plik pom.xml. Otwieramy w edytorze tekstowym plik <REFERENCE_IMPLEMENTATION>/samples/javaclient/pom.xml i dodajemy tam sekcję <dependencies>:

    Code:
    <dependency>
    
      <groupId>net.java.dev.jna</groupId>
      <artifactId>jna</artifactId>
      <version>4.1.0</version>
      <scope>compile</scope>
    </dependency>


    Uruchomienie serwera

    Po zalogowaniu się do RPi w terminalu wpisujemy:

    Code:
    cd <REFERENCE_IMPLEMENTATION>/samples/companionService
    
    npm start


    Teraz na porcie 3000 pracuje serwer, nasłuchujący informacji od klienta.

    Uruchomienie klienta

    W nowym oknie terminala wpisujemy:

    Code:
    cd <REFERENCE_IMPLEMENTATION>/samples/javaclient
    
    chmod +x install-java8.sh
    Run the installation script:
    ./install-java8.sh
    mvn validate
    mvn install
    mvn exec:exec


    Po drodze potwierdzić musimy regulamin użytkowania aplikacji, etc.

    Autoryzacja i logowanie do Amazona

    Po uruchomieniu klienta powinniśmy zobaczyć okienko z informacją podobną do następującej:

    Code:
    Please register your device by visiting the following website on any system and following the instructions: https://localhost:3000/provision/d340f629bd685deeff28a917 Hit OK once completed.


    Kopiujemy adres do przeglądarki, logujemy się do konta Amazona i autentykujemy podłączenie urządzenia do naszego profilu bezpieczeństwa. Naciskamy OK. Zostaniemy teraz przekierowani do strony zaczynającej się od https://localhost:3000/authresponse na której wypisana będzie informacja o gotowości do pracy.

    Wracamy teraz do aplikacji Javowej i naciskamy przycisk OK. Klient jest teraz gotowy do obsługi zapytań AVS. Naciskamy przycisk "Start Listening" i możemy już wydawać komendy głosowe. Po zakończeniu komendy naciskamy "Stop Listening".

    Alexa pytać możemy, np. o pogodę (po angielsku):

    Ty: What's the weather in Seattle?
    Alexa: Current weather report for Seattle

    Poprosić o muzykę: Play Bruce Springsteen
    Zadawać pytania z wiedzy ogólnej: What's the mass of the sun in grams?
    Odmierzyć czas: Set the timer for 2 minutes.
    Ustawić budzik: Set the alarm for 7:30 a.m.

    FAQ

    * Udało mi się uruchomić AVS na Raspberry Pi, ale nie słyszę odpowiedzi Alexa:

    W terminalu sprawdzić możemy czy Alexa nam odpowiada, jeśli tak trzeba być może skorzystać z innego wyjścia audio - jacka 3,5 mm zamiast HDMI. Aby to zrobić, wpisujemy w terminalu:

    Code:
    sudo raspi-config 


    I ustawiamy odpowiednią opcję Audio.

    * Mam problem z npm-em.

    Jeśli widzimy błąd "npm not found", to podobnie jak z VLC możemy:

    Code:
    sudo apt-get update
    
    sudo apt-get upgrade
    sudo apt-get install npm


    * Jak powinien wyglądać plik ssl.conf?

    Code:
    [req]
    
    distinguished_name      = req_distinguished_name
    prompt                  = no

    [v3_req]
    subjectAltName          = @alt_names

    [alt_names]
    DNS.1                   = localhost
    IP.1                    = 127.0.0.1
    IP.2                    = 10.0.2.2

    [req_distinguished_name]
    commonName              = $ENV::COMMON_NAME                 # CN=
    countryName             = US                 # C=
    stateOrProvinceName     = NY            # ST=
    localityName            = NY                         # L=
    organizationName        = YOUR_ORGANIZATION                 # O=
    organizationalUnitName  = YOUR_ORGANIZATIONAL_UNIT          # OU=


    Aby dostosować go do naszego przypadku, musimy zmienić ustawienia kraju, organizacji i jednostki organizacyjnej:

    Code:
    countryName             = PL
    
    organizationName        = Przykladowa_organizacja                 # O=
    organizationalUnitName  = Przykladowy_dzial_organizacji          # OU=


    Źródło: Link

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    ghost666
    Tłumacz Redaktor
    Offline 
    Fizyk z wykształcenia. Po zrobieniu doktoratu i dwóch latach pracy na uczelni, przeszedł do sektora prywatnego, gdzie zajmuje się projektowaniem urządzeń elektronicznych i programowaniem. Od 2003 roku na forum Elektroda.pl, od 2008 roku członek zespołu redakcyjnego.
    ghost666 napisał 9365 postów o ocenie 6948, pomógł 157 razy. Mieszka w mieście Warszawa. Jest z nami od 2003 roku.