V mojem članku Avtomatizacija doma z Alexa [1] smo se naučili, kako posnemati naprave interneta stvari in jih upravljati na daljavo s pomočjo glasovnega pomočnika. Tam smo uporabili Echo-Dot, ki se »zbudi« vsakič, ko zasliši besedo Alexa.
Avtor: Marcelo José Rovai
2022-305-29
Emulacija Google pomočnika na Raspberry Pi in Arduino Nano 33 BLE.
Toda kako deluje glasovni pomočnik?
Na to bomo poskušali odgovoriti v tem projektu in posnemali Google pomočnika z uporabo RaspberryPi in Arduino Nano.
Ta vsebina je samo za naročnike
Za začetek se je treba zavedati, da glasovni pomočniki na trgu, kot sta Google Home ali Amazon Echo-Dot, reagirajo na glas človeka le, ko jih »prebudijo« določene ključne besede, kot sta »Hej Google« za Google pomočnika in »Alexa« za Amazon Echo-Dot.
Z drugimi besedami, celoten postopek za prepoznavanje glasovnih ukazov temelji na večstopenjskem modelu ali kaskadni detekciji (angl. Cascade Detection).
1. stopnja: manjši mikrokontroler znotraj Echo-Dot ali Google Home nenehno posluša zvok in čaka, da se zazna ključna beseda. Za takšno odkrivanje se uporablja model TinyML na robu.
2. faza: Šele ko se sproži, se podatki pošljejo v oblak in tako obdelajo na večjem modelu.
TinyML je odličen koncept, ki omogoča strojno inteligenco tik ob fizičnem svetu; poleg tega se z izvajanjem modelov strojnega učenja (angl. Machine Learning: ML) na ravni mikrokontrolerja izognemo težavam, kot so latenca, poraba energije in varnost.
Za 1. stopnjo (KWS ali opazovanje ključnih besed) v tem projektu bomo uporabili mikrokontroler Arduino Nano 33 BLE Sense. Med več vgrajenimi senzorji ima vgrajen tudi digitalni mikrofon, ki bo uporabljen za zaznavanje ključne besede. Za 2. stopnjo bo RaspberryPi uporabljen za vzpostavitev stika z Google storitvami v oblaku za izvedbo bolj zapletene naloge, ko jo sproži Arduino.
Projekt bo razdeljen na dva dela:
1. del: Emulacija Google pomočnika na RPi
2. del: Implementacija KWS na Arduino Nano
1. del – Emulacija Google pomočnika na RPi
Poleg programske opreme, ki bo razvita, da bo RPi omogočila emulacijo Google pomočnika, bo potrebno tudi nekaj dodatnega HW. Lahko namestite zunanji mikrofon in zvočnik ali uporabite HAT, kar bo najlažje. V tem projektu bomo uporabili ReSpeaker 2-Mics Pi HAT.
ReSpeaker 2-Mics Pi HAT
Njegova namestitev je zelo preprosta: Povežite ReSpeaker 2-Mics Pi HAT z Raspberry Pi, slika 6.
Nastavitev gonilnika na Raspberry Pi
sudo apt-get update
sudo apt-get upgrade
git clone https://github.com/
respeaker/seeed-voicecard.git
cd seeed-voicecard
sudo ./install.sh
reboot
Preverite zvočne kartice, nameščene na RPi, slika 7.
Torej, v mojem primeru imam naslednje zvočne kartice:
Card 0: RPi HDMI
Card 1: RPi Headphone audio jack
Card 2: ReSpeaker 2-Mics Pi HAT
V mojem primeru izhod na ReSpeaker 2-Mics Pi HAT (Audio Jack) ni deloval pravilno, zato sem kartico 2 opredelil kot vhod (Mikofoni na ReSpeakerju), kot izhod pa imam standardni RPi Audio Jack (kartica 1).
Ta konfiguracija se izvede z urejanjem datoteke .asoundrc v mapi /home/pi. Če želite urediti to datoteko, izvedite naslednji terminalski ukaz:
sudo nano /home/pi/.asoundrc
in spremenite pcm.output s kartice 2 na kartico 1, glej sliko 9.
Vsakič, ko se spremenijo nastavitve Pi Preferences/Audio Device Settings, je treba preveriti zgornjo datoteko. Prav tako lahko izhodno glasnost spremenite v istem meniju za zvočno kartico 1 — slušalke (RPi Audio Jack).
Na tej točki je mogoče narediti nekaj testov:
Testiranje avdio izhoda, slika 10:
speaker-test -t wav
Poslušajte, kako se na zvočniku ponavljata “Front” in “Left”. Pritisnite [CTRL]+[C] za izhod.
Testiranje avdio vhoda
Najprej namestite pyaudio Python knjižnico, ki se uporablja za predvajanje in snemanje zvoka na RPi:
sudo pip install pyaudio
Na spletni strani puAudio, http://people.csail.mit.edu/hubert/pyaudio/, lahko najdete informacije in primere uporabe knjižnice. S spodnjim skriptom posnemite nekaj sekund (5s) zvoka, tabela 1.
Datoteka z imenom »record_test.wav« se mora pojaviti v mapi, kjer je bil skript izveden. Če želite preveriti posneti zvok, izvedite spodnji skript, tabela 12.
Če poslušaš, kar snemaš, super!
Smo v poslu! Preden začnemo pripravljati naš RPi za emulacijo Google pomočnika, poglejmo tipko in RGB LEDice, ki so nameščene na ReSpeaker 2-Mics Pi HAT:
Tipka
Na GPIO17 je vgrajena uporabniška tipka, kot je prikazano na spodnjem električnem diagramu.
Zdaj ga bomo poskušali zaznati pritisk tipke s pythonom in RPi.GPIO.
Najprej namestite RPi.GPIO knjižnico:
sudo pip install rpi.gpio
Nato lahko izvedete spodnji skript, da preizkusite tipko, tabela 3.
Vgrajene RGB LEDice (APA102)
Vsaka od treh vgrajenih APA102 RGB LED ima dodaten gonilniški čip.
Čip gonilnika poskrbi za prejemanje želene barve prek svojih vhodnih vrstic in jo nato zadrži, dokler ne prejme novega ukaza. Namestite spidev knjižnico:
sudo pip install spidev
In klonirajte datoteko:
git clone https://github.com/
respeaker/mic_hat.git
V podmapi mic_hat izvedite pixels.py skript, ki bo opravil test na vseh LED diodah. Uporabite [CTRL]+[C], da ustavite LEDice:
python3 pixels.py
Razred slikovnih pik ima več pripravljenih funkcij, kot so:
pixels.wakeup(): VKLOPI vse LED
pixels.off(): IZKLOPI vse LED
pixels.think(): VKLOP LEDic eno za drugo, spreminjanje barv
pixels.speak(): VKLOPI vse LEDice in
spremenite njihovo jakost svetlobe
Za učinkovito uporabo funkcije na končni kodi imejte obe datoteki apa102.py in pixels.py v istem imeniku. S tem lahko uporabite preprosto kodo, kot je spodnja, za dostop do LED, tabela 4.
Google Voice storitve
Na tej točki ves HW deluje pravilno:
- Avdio vhod
- Avdio izhod
- Tipka
- LEDice
Čas je, da namestite storitve Google Voice na naš RaspberryPi. Za to bomo upoštevali nasvete iz odlične vadnice [4].
Namestite API za Google Assistant
Pojdite v domači imenik RPi in klonirajte VoiceKit GitHub v podimeniku /voice-recognizer-raspi:
cd ~
git clone -b voicekit https://github.com/google/aiyprojects-raspbian.git ~/voice
-recognizer-raspi
Pojdite v ta ustvarjeni podimenik in zaženite skript za namestitev datotek:
cd ~/voice-recognizer-raspi
scripts/install-deps.sh
Če želite uporabljati Google Voicekit, morate imeti picotts, platformo za pretvorbo besedila v govor, ki uporablja mehanizem za pretvorbo besedila v govor pico brez povezave za branje besedila z naravnimi glasovi. Če želite namestiti knjižnico pico TTS v sistem, običajno v Debianu, naredite:
sudo apt-get install libttspico-utils
V nekaterih izdajah Raspbian ta paket manjka, vendar lahko kopirate arm deb paket iz Debiana. V Debian Busterju na primer paket manjka, zato ga namestite z naslednjimi ukazi:
wget http://ftp.us.debian.org/debian/pool/non-free/s/svox/libttspico0_
1.0+git20130326-9_armhf.deb
wget http://ftp.us.debian.org/debian/pool/
non-free/s/svox/libttspico-utils_1.0+git20130326-9_armhf.deb
sudo apt-get install -f ./libttspico0_1.0+
git20130326-9_armhf.deb ./libttspico-u
tils_1.0+git20130326-9_armhf.deb
Namesti gRPC (oddaljeni klici postopkov).
Zakaj bi želel uporabiti gRPC?
Glavni scenariji uporabe:
Nizka latenca, zelo razširljivi, porazdeljeni sistemi.
Razvoj mobilnih klientov, ki komunicirajo s strežnikom v oblaku.
Oblikovanje novega protokola, ki mora biti natančen, učinkovit in neodvisen od jezika.
Večplastna zasnova, ki omogoča razširitev npr. preverjanje pristnosti, uravnoteženje obremenitve, beleženje in spremljanje itd.
sudo pip install grpcio
sudo pip install grpcio-tools
Zdaj je čas, da namestite Google API in Google Assistant knjižnico:
sudo pip install –upgrade google-api-
python-client
sudo pip install –upgrade google-assistant-
library==1.0.1
sudo pip install –upgrade google-assistant-
sdk[samples]==0.5.1
Na tej točki so nameščeni glavni paketi, znova zaženite sistem:
reboot
Zahtevane spremembe v izvirnem kompletu Google Voice:
Odprite datoteko:
/home/pi/voice-recognizer-raspi/src/
aiy/_apis/_speech.py
in zakomentirajte naslednje vrstice, tabela 5.
Zdaj odprite datoteko:
/home/pi/voice-recognizer-raspi/src/aiy/
voicehat.py
In spremenite GPIO tipko (ki bi morala biti prikazana kot 23.) za tisto, ki se uporablja na ReSpeaker 2-Mics Pi HAT (ki bi morala biti 17.):
1 | _GPIO_BUTTON = 17 |
Na tej točki bi morala biti HW in SW končana. Manjkajoči del je pridobiti poverilnice od Googla za zagon glasovnega kompleta na našem Raspberryju.
Omogočanje Google Assistant API-ja
Vse korake za omogočanje API-ja najdete na spletnem mestu Google AIY Voice Kit v razdelku »GET CREDENTIALS«.
Ta razdelek se nahaja daleč spodaj na tej strani (približno polovica dolgega spletnega mesta). Odprite drugo stran https://console.cloud.google.com/ (Google Cloud Platform) in sledite navodilom na prvi strani. Če je vse pravilno, bi morali v računalnik prenesti JSON datoteko. Navodila pojasnjujejo tudi, kako ustvariti asistent.json datoteko, kamor je treba shraniti vsebino tako prenesene datoteke. Datoteka mora biti shranjena v vašem domačem imeniku RPi, slika 15.
Poleg zgornjih navodil sem vključil tudi svojo e-pošto kot »Preskusne uporabnike« z možnostmi + DODAJ UPORABNIKE na strani zaslona za soglasje Oauth:
In to je to! Čas je, da preizkusite našega glasovnega pomočnika!
Preizkušanje glasovnega pomočnika
Pojdite v podmapo, kjer je bil nameščen Voice-Kit:
cd ~/voice-recognizer-raspi
In zaženite demo program, ki se nahaja v podmapi /src:
python3 src/assistant_grpc_
demo.py
Če je vse v redu, bi morali na terminalu dobiti naslednja sporočila, slika 17
Glasovni pomočnik čaka, da pritisnete tipko za začetek pogovora: Na primer, pritisnil sem tipko in pojavilo se je sporočilo »Listening …«. Vprašal sem: “What time is it now?” ki se je pojavil tudi na Terminalu. Hkrati bo pomočnik povedal odgovor.
Kot zadnji del projekta v zgornjo kodo vključimo LEDice, ki so na voljo na RPi HATu, kot je prikazano.
Kopirajte obe datoteki apa102.py in pixels.py v isti imenik, kjer zaženete kodo [6] (v tem primeru: ”voice-recognizer-raspi/src”).
Zdaj bo med postopkom zagona (enkrat) dodan nekakšen “Wake-up LED show”. Tudi vsakič, ko pritisnete ta gumb, bo glasovni pomočnik »Razmišljal« in počakal na naše vprašanje, za to bomo uporabili funkcijo pixels.think(), ki prisili LEDice, da se zaporedno vklapljajo in izklapljajo. Enako, ko Pomočnik “govori”, bodo LEDice ohranile svojo RGB barvo, vendar bodo počasi ugašale.
Upoštevajte, da če rečete “Goodbye”, se bo pomočnik zaprl.
Igranje z GPIO vrati
Pomembna prednost posnemanja Google pomočnika na RPi je, da lahko uporabljamo njegove GPIO za nadzor zunanjih stvari v resničnem svetu. To smo že storili z uporabo notranjih LEDic in tipke ReSpeaker 2-Mics Pi HAT. HAT pusti 2 GPIO (12 in 13) na voljo prek priključka Grove, kot je prikazano v njegovem električnem diagramu slike 20.
Zdaj namestimo zunanjotipko na RPI GPIO 13 in LED na GPIO 12, kot je prikazano na diagramu slike 21.
Spremenimo skript, ki je bil prej uporabljen za preizkušanje HAT tipke.Zdaj preizkusimo zunanjotipko in LEDico. LEDica se prižge vsakič, ko pritisnete tipko, tabela 6.
Uporaba ključnih besed (KWS)
Doslej smo našega glasovnega pomočnika prebujali s fizično tipko.Kot je bilo že omenjeno v uvodu, se glasovni pomočniki, kot je Google Home, odzivajo, ko uporabimo določene ključne besede kot npr. »Hej Google«.
Ta projekt bo zamenjal fizičnotipko z “navidezno”, z uporabo mehanizma, znanega kot KWS ali opazovanje ključnih besed (angl. Keyword Spotting). Uporabili bomo Arduino Nano 33 BLE Sense mikrokontroler, z vgrajenim digitalnim mikrofonom, ki bo uporabljen za odkrivanje ključne besede.
Za poenostavitev (ko glavni cilj tega projekta ni razvoj modelov nevronskih omrežij) ponovno uporabimo kodo, ki jo je razvil Google, vključeno v Arduino IDE, ustvarjeno s pomočjo TensorFlowLite in imenovano »micro_speech«. Ta skica vključuje model, ki lahko opazi dve besedi: YES, NO, poleg UNKNOWN in Tišina. Dobite ga lahko na zavihku primeri, kot je prikazano na sliki 23.
Za testiranje lahko naložite kodo takšno kot je v vaš Arduino Nano in jo preizkusite z besedami, kot sta “YES” ali “NO”. Ko je prepoznana beseda, mora zasvetiti notranja RGB LED (YES: zelena in pri besedi NO: rdeča).
Video testiranja besed »YES« in »NO« najdete na youtube [7].
Hiter pregled, kako prepoznavanje govora deluje na mikrokontrolerju
Arduino bo izvedel sklepanje v predhodno usposobljenem modelu, razvitem s pomočjo TensorFlow. Model konvolucijskega nevronskega omrežja (tiny_conv) se usposobi s +100 000 enosekundnimi (ali manj) vzorci zapisa (format .wave) 35 različnih fonemov (podatkovni nabor Googlovih govornih ukazov). Izurjeni model je TensorFlowLite pretvoril v C bajtno polje, ki ga bo uporabil na majhnem mikrokontrolerju kot je Nano (končni model ima več kot 90-odstotno natančnost in velikost le 19 KB).
Upoštevajte, da neobdelanih podatkov (zvok v formatu.wave) ni mogoče uporabiti neposredno s CNN modelom. Najprej je treba zvočne podatke pretvoriti v sliko (40×49 slikovnih pik), kar se naredi s pretvornikom funkcij MFCC, kot je prikazano na sliki 25.
Melfrekvenčni cepstralni koeficienti (MFCC) so koeficienti, ki skupaj sestavljajo MFC, to je predstavitev kratkoročnega spektra moči zvoka, ki temelji na linearni kosinusni transformaciji spektra logaritemske moči na nelinearni mel lestvici frekvence.
Poglejmo, kako koda deluje na splošno
Arduino mora nenehno poslušati zvok okoli sebe. Mikrofon zajame zvočne vzorce (vsako sekundo) in jih pretvori v 16-bitne podatke (impulzno kodirana modulacija — PCM). Modul ponudnika zvoka opravi to nalogo.
PCM podatke je treba pred uporabo v sklepanju predhodno obdelati. Na modulu Feature Provider se neobdelani podatki pretvorijo v slike s pretvornikom funkcij MFCC. Vsak vzorec bo monokromatska slika (ali tenzor velikosti: [1, 49, 40, 1]).
Tolmač TFLite izvaja sklepanje, ali bolje, razvrsti vhodni tenzor v štiri različne razrede. Izhod bo tenzor z dimenzijo [1, 4], kjer so vrednosti verjetnosti vhodnega zvoka Tišina, Unknot, Da ali Ne.
Na podlagi teh verjetnosti bo Command Recognizer & Responder modul uporabil izhod tolmača TFLite, da se odloči, ali je bil ukaz slišan, in izvede ustrezne ukrepe. Na primer, če ima zvok večjo verjetnost, da je “YES”, se vklopi notranja zelena RGB LED, če je “NO”, rdeča in končno, za katero koli drugo možno besedo, modra. Model je kvantiziran za delo z 8-bitnim celim številom, tako da se verjetnost giblje od 0 do 255. Če je verjetnost večja od 200 (okoli 80 %), se ukaz izvede.
Spreminjanje HW
Namestili bomo dve zunanji LEDici, ki posnemata tisto, kar je storjeno z notranjo LED RGB Nano. Zelena LED bo priključena na nano izhod D2, rdeča pa na D4. Nano izhod D3 (skupaj z GND) bo nadomestila zunanja fizičnatipka, povezana z RPi GPIO13.
Spreminjanje kode
Kodo moramo spremeniti tako, da vsakič, ko opazimo besedo YES (naša budna beseda), zunanja zelena LED sveti in RPi pošlje impulz, ki simulira pritisnjenotipko.
Kot ste lahko videli, je edini modul, ki bi ga bilo treba spremeniti, Command Recognizer & Responder, da se bodo stvari zgodile! Ta koda je na zavihku: arduino_command_responder.cpp (ta zavihek je označen na sliki Arduino IDE, prikazani prej), tabela 7 in 8.
Če želite izvedeti več o TinyML in o tem, kako je bila razvita izvirna koda, močno predlagam odlično knjigo Petra Wardena in Daniela Situnayakea, TinyML: Strojno učenje s TensorFlow Lite na Arduinu in mikrokontrolerskih napravah z izjemno nizko porabo [8].
In to je to!
Rezultat je mogoče preveriti na videu, ki je v uvodu, in v celoti spremenjeni Arduino kodi na mojem GitHubu.
Zaključek
Kot vedno upam, da lahko ta projekt pomaga drugim, da se znajdejo v razburljivem svetu umetne inteligence, elektronike in interneta stvari!
Za posodobljene datoteke obiščite moj GitHub: Inteligent_Voice_Assistant
Lep pozdrav z juga sveta! Se vidimo v mojem naslednjem članku!
Viri:
https://bit.ly/3KtmeG5
https://bit.ly/3rWTrkQ
https://amzn.to/3oe0x3d
Povzeto po:
https://mjrobot.org/2021/01/27/building-an-intelligent-voice-assistant-from-scratch/