Lisää IoT-projekteihin nopeasti Alexa-toiminnallisuus käyttämällä mikrokontrolleripohjaista sarjaa
Julkaisija DigiKeyn kirjoittajat Pohjois-Amerikassa
2020-02-11
Ääniohjauksesta on nopeasti kehittynyt tärkeä ominaisuus kaikille älytuotteille. Amazonin Alexa Voice Service (AVS) on noussut nykyisistä pilvipohjaisista ratkaisuista johtavaksi ääniavustajaksi. Se tarjoaa valmiin ratkaisun, joka hyödyntää Amazonin pilviresursseja äänentunnistukseen ja luonnollisen kielen käsittelyyn.
Kehittäjille AVS:n suorituskykyvaatimukset ja suunnittelun monimutkaisuus ovat kuitenkin muodostaneet merkittävän esteen pienempien mikroprosessoripohjaisten laitteiden liittämiselle älykoteihin ja esineiden internetiin (IoT). NXP Semiconductorsin sarja tarjoaa erityisesti resursseiltaan niukoille laitteille tarkoitetun Amazon AVS -toteutuksen. Se on tarkoitettu sekä valmiiksi ratkaisuksi että referenssisuunnitelmaksi omia sovelluksia varten.
Tässä artikkelissa kerrotaan, miten kehittäjät voivat toteuttaa Alexa-toiminnallisuuden nopeasti käyttäen NXP:n valmisratkaisua.
Mikä AVS on?
Noin vuosikymmen sitten ensiesiintymisensä tehnyt ääniavustajateknologia on kehittynyt nopeasti ja luonut kasvavan älykaiutinmarkkinan. Markkina-analyytikoiden arvioiden mukaan noin kolmanneksella Yhdysvaltojen väestöstä on jo älykaiutin. Kilpailevien ratkaisujen joukosta Amazon Echo -älykaiuttimet ovat nousseet määräävään asemaan hyödyntämällä suositun Amazon Web Services (AWS) -pilvipalvelun resursseja, joilla voidaan tarjota ulkopuolisia Echo-sovelluksia eli Skillejä.
Alexa Skills Kitin (ASK) ja ohjelmointirajapintojen (API) avulla kehittäjät voivat hyödyntää nopeasti kasvavaa Echo-älykaiutinten käyttäjämäärää ja lisätä yhdistettyihin laitteisiin jonkin tasoista ääniohjausta. Tällä lähestymistavalla yhdistetyt laitteet, kuten ”Alexa-yhteensopivat” älytelevisiot tai termostaatit, voivat vastata käyttäjän äänipyyntöihin ja niihin liittyviin Alexa-pilvestä saapuviin komentoihin (kuva 1). Tämä tiivistää AVS:n toimintaperiaatteen ja antaa käsityksen sen potentiaalista.
Kuva 1: Laatimalla Alexa-sovelluksia eli Skillejä kehittäjät voivat antaa yhdistetyille tuotteille mahdollisuuden reagoida käyttäjän äänikomentoihin Amazon Echo -tuotteiden kautta. (Kuvan lähde: Amazon Web Services)
Alexa-toiminnallisuuden suunnittelu
Toisin kuin Alexa-yhteensopivat tuotteet, Alexa-toiminnallisuudella varustetut älytuotteet muodostavat saumattomamman, latenssiltaan alemman rajapinnan Alexa-ääniohjatun laitteen ja AWS-resurssien välille. Nämä tuotteet integroivat AVS:n suoraan yhdistettyyn laitteeseen. Käyttämällä AVS-palvelua ja AWS IoT Core -alustaa kehittäjät voivat toteuttaa sofistikoituneita IoT-sovelluksia, joiden avulla käyttäjät voivat käyttää ääniohjausta Alexaa tukevien tuotteiden kanssa sekä yhdistettyjen laitteiden ohjaamiseen että äänivastauksien vastaanottamiseksi näiltä laitteilta (kuva 2).
Kuva 2: Alexaa tukevat tuotteet tarjoavat käyttäjille äänirajapinnan ohjauskomentojen lähettämiseen (yllä) sekä ilmoitusten vastaanottamiseen (alla) IoT-laitteilta, jotka on yhdistetty AWSS IoT Coren kautta Amazon Web Services -resursseihin. (Kuvan lähde: Amazon Web Services)
Aiemmin tällaisen IoT-sovelluksen ytimenä toimivan Alexaa tukevan laitteen suunnittelu on kuitenkin vaatinut merkittäviä suunnittelupanostuksia jo itsessään. Voidakseen käyttää pilvipohjaisia Alexa-palveluita laitteen on käytettävä useita Android- tai Linux-alustalla toimivan AVS:n ohjelmistokehityssarjan (SDK) kautta saatavia AVS-palvelukirjastoja, jotta se voi tunnistaa herätesanan, viestiä Alexa-pilven kanssa sekä käsitellä laitteen ominaisuuksien tukemia käskyjä (kuva 3).
Kuva 3: Tämä kaavio esittää komponentit AVS-laitteen SDK:ssa sekä datavirrat niiden välillä. (Kuvan lähde: Amazon Web Services)
Näiden palvelukirjastojen tukemiseksi Alexaa tukevissa laitteissa pitää yleensä olla tehokas suoritin sekä vähintään 50 megatavua (Mt) muistia AVS:n käsittelyvaatimuksia varten. Lisäksi laitteisiin tarvitaan usein digitaalinen signaaliprosessori (DSP) suorittamaan kompleksisia algoritmeja, joita tarvitaan poimimaan puheääni meluisasta ympäristöstä sekä tukemaan ääniavustinlaitteilta edellytettäviä pitkän etäisyyden äänitoimintoja. Viime kädessä Alexaa tehokkaasti tukevan laitteen järjestelmävaatimukset ovat tyypillisesti kasvaneet reilusti yli käytännöllisen IoT-laitteen kustannus- ja kompleksisuustason.
AWS IoT Coren AVS-integroinnin julkistamisen myötä Amazon kuitenkin laski dramaattisesti Alexa-toiminnallisuuden toteuttamiseen vaadittavaa suoritintehoa ja muistimäärää. Tällä palvelulla laskenta- ja muisti-intensiiviset tehtävät siirretään Alexaa tukevalta laitteelta pilvessä sijaitsevalle siihen yhdistetylle virtuaalilaitteelle (kuva 4).
Kuva 4: AVS for AWS IoT Core siirtää muisti- ja laskentaintensiiviset tehtävät pilveen, jolloin Alexa-ääniavustajaominaisuudet voidaan toteuttaa resursseiltaan niukoilla IoT-laitteilla. (Kuvan lähde: Amazon Web Services)
Varsinaisen fyysisen laitteen prosessointitehtävät rajoittuvat perustason palveluihin, kuten suojattuun viestintään, luotettavaan äänidatan toimitukseen Alexalle ja takaisin, tehtävien hallintaan sekä tapahtumailmoituksien käsittelyyn laitteessa sekä Alexan kanssa. Datan, komentojen ja ilmoitusten siirto fyysisen laitteen ja Alexan välillä tapahtuu tehokkaan MQTT-viestinnän (MQ Telemetry Transport) kautta. Tähän on varattu tietyt aiheet MQTT:n julkaisu-tilaus-protokollassa. Lisäksi mobiili apusovellus rekisteröi laitteen Alexa-pilveen ja auttaa muissa käyttäjään liittyvissä toimissa, joita Alexaa tukeva laite vaatii.
Siirtämällä raskaan laskennan pilveen AVS for AWS IoT Core antaa kehittäjille mahdollisuuden luoda Alexa-toiminnallisuudella varustettuja tuotteita alustoilla, jotka ovat tutumpia sulautettujen järjestelmien kehittäjille. Linux- tai Android-sovellussuorittimien ja 50 megatavun muistimäärien sijaan kehittäjät voivat toteuttaa laitteet paljon vaatimattomammilla mikrokontrollereilla, joissa on alle 1 megatavu muistia ja reaaliaikainen käyttöjärjestelmä (RTOS). Itse asiassa AVS for AWS IoT Coren avulla toteutetuissa Alexaa tukevissa laitteissa voidaan pienentää materiaalitarvetta jopa 50 % verrattuna laitteisiin, jotka on suunniteltu suorittamaan AVS-palveluita paikallisesti.
Vaikka AVS for AWS IoT Core tukeekin kustannustehokkaampaa suoritusalustaa, sertifioidun Alexa-toiminnallisuuden rakentaminen tuotteeseen on edelleen monimutkaista. Kehittäjät, joilla ei ole aiempaa kokemusta AVS-palvelusta ja IoT Coresta, voivat kohdata huomattavan oppimiskynnyksen yrittäessään täyttää AWS-palvelun vaatimukset tietoturvan, tiedonsiirron, tilienhallinnan, käyttäjäkokemuksen (UX) suunnittelun ja monien muiden seikkojen suhteen. Riippumatta siitä, tuntevatko he AWS-ekosysteemiä, kaikkien Alexa-tuotteiden kehittäjien tulee varmistaa, että heidän suunnittelemansa laitteet täyttävät suuren joukon Amazon Alexa -sertifioinnin edellyttämiä määrityksiä ja vaatimuksia.
NXP:n mikrokontrolleripohjainen Alexa-ratkaisu tarjoaa käyttövalmiin ratkaisun, joka toteuttaa täysin Amazonin AVS for AWS IoT Coren laitteisto- ja ohjelmistovaatimukset.
Mikrokontrolleripohjainen Alexa-ratkaisu
NXP i.MX RT106A -mikrokontrollerin ympärille rakennettu NXP:n AVS-sarja SLN-ALEXA-IOT tarjoaa valmiit AWS-yhteydet, AVS-hyväksytyt kaukaa kuuluvan äänen tunnistusalgoritmit, kaiun kumoamisen, tuen Alexan herätesanoille sekä sovelluskoodia. Sarjan Arm Cortex-M7 -ytimeen perustuva i.MX RT106A -mikrokontrolleri kuuluu NXP:n i.MX RT106x -laiteperheeseen, joka muodostuu erityisesti IoT-verkonreunalaskentaan tarkoitetuista crossover-suorittimista. Sulautettuihin äänisovelluksiin kehitetty RT106A lisää erikoistoiminnallisuuksia NXP:n i.MX RT1060 -crossover-suorittimen perusarkkitehtuuriin, joka tarjoaa kattavan valikoiman lisälaiterajapintoja, suuren sisäisen muistin sekä laajan tuen ulkoisille muistivaihtoehdoille (kuva 5).
Kuva 5: NXP:n i.MX RT1060 -crossover-suoritinperhe integroi Arm Cortex-M7 -mikrokontrolleriytimeen täyden valikoiman lisälaiterajapintoja, muistia sekä muita IoT-laitteessa tyypillisesti vaadittuja ominaisuuksia. (Kuvan lähde : NXP)
Integroidun toiminnallisuutensa ansiosta i.MX RT106A -mikrokontrolleri vaatii vain muutaman lisäkomponentin voidakseen tarjota AVS for AWS IoT Core -toteutukseen vaadittavan laitteiston. SLN-ALEXA-IOT-sarjassa NXP integroi i.MX RT106A -mikrokontrollerin järjestelmämoduuliin, joka tarjoaa 256 megabittiä (Mb) flash-muistia, Murata Electronicsin LBEE5KL1DX-Wi-Fi-/Bluetooth-lähetin-vastaanotinmoduulin sekä Diodesin buck-muuntimen AP2202K-3.3TRG1 (kuva 6).
Kuva 6: NXP:n SLN-ALEXA-IOT-AVS-sarjan järjestelmämoduulin rakenne hyödyntää yksinkertaista laitteistorajapintaa, joka tarvitaan NXP:n i.MX RT106A -mikrokontrollerin integroimiseen ulkoiseen flash-muistiin sekä langattomaan lähetin-vastaanottimeen. (Kuvan lähde : NXP)
Tätä järjestelmämoduulia täydentävässä SLN-ALEXA-IOT-sarjan äänikortissa on kolme pulssitiheysmodulaatiota (PDM) käyttävää Knowles SPH0641LM4H-1 -MEMS-mikrofonia, PUI Audion AS01808AO-kaiutin ja NXP:n D-luokan audiovahvistin TFA9894D. Äänikortissa on USB Type C -liitin virransyöttöä ja tietokoneelta suoritettavaa komentorivikonsolia varten sekä piirilevyliittimet Ethernetiä, sarjaväylää käyttäviä lisävarusteita ja i.MX RT106A -mikrokontrollerin GPIO-liitäntää (general purpose input/output) varten. Lisäksi kortilla on kytkimet perusohjausten syöttöä varten sekä ledit visuaaliseen palautteeseen Amazon AVS UX Attention System -vaatimusten mukaisesti. Laite käyttää erivärisiä ledejä sekä jaksomalleja niiden sytytykseen ja sammutukseen.
Tämän järjestelmämoduulin ja ääniohjauspiirilevyn myötä SLN-ALEXA-IOT-laitteisto tarjoaa täydellisen alustan AVS for AWS IoT Core -ohjelmiston laitteessa tapahtuvalle käsittelylle. Kuten aiemmin mainittiin, Alexaa tukevat IoT-laitteet vaativat kuitenkin laitteiston lisäksi myös optimoitua ohjelmistoa. Ohjelmiston luominen tyhjästä Amazonin AVS for AWS IoT API -rajapinnan avulla voi viivästyttää projekteja huomattavasti, koska kehittäjien on laadittava vaaditut dataobjektit ja toteutettava tarvittavat protokollat. Lisäviivettä syntyy siitä, kun Alexa-sertifiointia tavoittelevat kehittäjät yrittävät noudattaa AVS UX Attention System -vaatimuksia, AWS-tietoturvakäytäntöjä sekä muita vaatimuksia, jotka koskettavat kaikkia käyttäjän ja Alexa-palveluiden vuorovaikutuksen osa-alueita. NXP vastaa näihin ongelmiin kattavalla ajonaikaisella ääniohjausohjelmistoympäristöllä, joka perustuu Amazon FreeRTOS-käyttöjärjestelmään. Sen alla toimii kerros ohjelmistoajureita ohjelmien suorittamiselle suoraan tallennusmuistista (XIP), yhteyksille sekä muille laitteistokomponenteille (kuva 7).
Kuva 7: Amazon FreeRTOS-käyttöjärjestelmän päälle rakennettu NXP:n ääniohjausjärjestelmäympäristö tarjoaa kattavan valikoiman middleware-palveluita, kuten laiteohjelmiston rutiinit koneoppimista hyödyntävään päättelyyn sekä äänen esikäsittelyyn. (Kuvan lähde : NXP)
Tämän ohjelmistoympäristön äänenkäsittelykykyjä tukee NXP:n Intelligent Toolbox -laiteohjelmisto, joka tarjoaa optimoidut toiminnot kaikille äänenkäsittelytehtäville, kuten koneoppimiseen (ML) perustuvan päättelyrutiinin sekä ML-pohjaisen esikäsittelyn, joka käsittelee ja optimoi audiosignaalia. Muut middleware-palvelut tukevat suojattua yhteyttä, AWS-tiedonsiirtoa sekä ääniominaisuuksia. Tämän kattavan palvelukerroksen päällä toimiva AWS IoT Core -yhteyksiä, laitteen rekisteröintiä ja muita sovelluksen ohjaustoimintoja tukeva ohjelmisto käynnistyy kaksivaiheisella käynnistyslataajalla, joka tukee verkon kautta jaeltuja päivityksiä (OTA) AWS IoT OTA -palvelun sekä Amazon FreeRTOS OTA -asiakasohjelmiston kautta.
Käyttämällä tässä ympäristössä toimivaa valmiiksi asennettua ohjelmistoa kehittäjät voivat käynnistää välittömästi SLN-ALEXA-IOT-laitteistosarjan ja täydellisen Alexaa tukevan sovelluksen. Sovelluksessa käytetään AWS IoT:lle luotua NXP-esittelytiliä. NXP:n dokumentaatiossa on käydään tarkasti läpi sarjan käynnistäminen, Wi-Fi-tunnusten syöttäminen sekä laitteen AWS-todennuksen suorittaminen esittelytilillä. Tämän prosessin aikana kehittäjät ovat yhteydessä sarjaan ja AWS-palveluun käyttäen ohjelmiston jakelupakkaukseen sisältyvää Android-sovellusta, jonka saa ladattua NXP:n sivustolta käyttäen kunkin SLN-ALEXA-IOT-sarjan mukana toimitettavaa aktivointikoodia. Muutaman helpon vaiheen jälkeen kehittäjät voivat välittömästi aloittaa sarjan ohjaamisen käyttäen Echo-älykaiuttimista tuttuja Alexa-äänikomentoja.
SLN-ALEXA-IOT-sarja ja sen valmiiksi asennettu ohjelmisto tarjoavat valmiin alustan Alexa-toiminnallisuuksia sisältävien tuotteiden prototyyppien nopeaan rakentamiseen. Samaan aikaan sarjan laitteisto ja ohjelmisto toimivat nopeana kehitysalustana omien i.MX RT106A -mikrokontrolleriin perustuvien Alexaa tukevien laitteiden suunnittelulle.
Oma kehitys
i.MX RT106A -pohjaisten Alexa-ratkaisujen ohjelmisto hyödyntää NXP:n ääniohjausympäristön kykyjä käyttäen NXP MCU Alexa Voice IoT SDK:ta, joka toimitetaan tuotteen aktivoinnin myötä tarjottavassa ohjelmiston jakelupaketissa. Tämä SDK on suunniteltu laajennukseksi NXP:n Eclipse-pohjaiseen, MCUXpressoksi kutsuttuun integroituun kehitysympäristöön (IDE), ja se tarjoaa sekä täydelliset lähdekoodit esimerkkisovelluksille, ohjaimille ja middleware-sovelluksille että binäärijakeluun tarvittavat header-tiedostot NXP Intelligent Toolboxin, ML-päättelyrutiinin sekä ML-ääniesiasteen sisällyttämiseksi laiteohjelmistoon.
Kehittäjät, joiden pitää nopeasti luoda Alexaa tukeva tuote, voivat periaatteessa käyttää Alexa-esittelysovellusta sellaisenaan pienin muutoksin. Yksinkertaisimmillaan muutokset tarkoittavat vain sovelluksen ohjaamista kehittäjän omalle AWS-tilille käyttämällä tämän omia kirjautumistietoja. NXP tarjoaa tätä prosessia varten ohjeet askel askeleelta.
Omaa kehitystä varten ohjelmistojakeluun sisältyvät esimerkkisovellukset tarjoavat suoritettavia esimerkkejä, jotka esittelevät NXP MCU Alexa Voice IoT SDK:n käyttöä. Sen sijaan, että kehittäjät siirtyisivät suoraan varsinaiseen Alexa-esittelysovellukseen, he voivat tutkia esimerkkisovelluksia, jotka paneutuvat tarkemmin tiettyihin ominaisuuksiin, kuten äänen esikäsittelyyn, Wi-Fiin, Bluetooth-yhteyksiin, käynnistyslataajaan ja niin edelleen. Esimerkiksi äänen esikäsittelyn esimerkkisovellus kuvaa suunnittelumallit herätesanan tunnistukseen käytettäessä Amazon FreeRTOS -tehtäviä.
Äänen esikäsittelyn esimerkkisovelluksessa päärutiini kuvaa, miten kehittäjän tulee alustaa laitteiston ja ohjelmiston alijärjestelmät ja käyttää sitten FreeRTOS-käyttöjärjestelmän xTaskCreate-funktiota, jolla käynnistetään pääsovellustehtävä (appTask) sekä konsolitehtävä (sln_shell_task) ennen kuin hallinta vapautetaan FreeRTOS-ajoitusrutiinille (listaus 1). (Huomaa: FreeRTOS-ajoitusrutiinin käynnistyskutsu vTaskStartScheduler palaa vain, jos ajoitusrutiinille ei ole riittävästi muistia.)
Kopioi void main(void) { /* Enable additional fault handlers */ SCB->SHCSR |= (SCB_SHCSR_BUSFAULTENA_Msk | /*SCB_SHCSR_USGFAULTENA_Msk |*/ SCB_SHCSR_MEMFAULTENA_Msk); /* Init board hardware. */ BOARD_ConfigMPU(); BOARD_InitBootPins(); BOARD_BootClockRUN(); .
.
.
RGB_LED_Init(); RGB_LED_SetColor(LED_COLOR_GREEN); sln_shell_init(); xTaskCreate(appTask, "APP_Task", 512, NULL, configMAX_PRIORITIES - 1, &appTaskHandle); xTaskCreate(sln_shell_task, "Shell_Task", 1024, NULL, tskIDLE_PRIORITY + 1, NULL); /* Run RTOS */ vTaskStartScheduler(); .
.
.
}
Listaus 1: NXP MCU:n Alexa Voice IoT SDK-jakeluun sisältyvä äänen esikäsittelyn esimerkkisovellus kuvaa vaadittavat perusalustukset sekä FreeRTOS-tehtävien luonnin sovelluksen päätehtävälle sekä konsolitehtävälle. (Lähdekoodi: NXP)
Äänialijärjestelmän alustamisen jälkeen sovelluksen päätehtävä appTask käynnistää puolestaan kaksi FreeRTOS-tehtävää. Yksi tehtävistä suorittaa palvelurutiinia audio_processing_task, joka käsittelee äänisyötettä, kun taas toinen käsittelee mikrofonin PDM-lähdön muuntamista pulssikoodimodulaatioksi (PCM). Hoidettuaan muutamia siivousoperaatioita appTask jää päättymättömään silmukkaan odottamaan RTOS-ilmoitusta herätesanan tunnistamisesta (listaus 2).
Kopioi
void appTask(void *arg)
{
.
.
.
// Create audio processing task
if (xTaskCreate(audio_processing_task, "Audio_processing_task", 1536U, NULL, audio_processing_task_PRIORITY,
&xAudioProcessingTaskHandle) != pdPASS)
.
.
.
// Create pdm to pcm task
if (xTaskCreate(pdm_to_pcm_task, "pdm_to_pcm_task", 1024U, NULL, pdm_to_pcm_task_PRIORITY, &xPdmToPcmTaskHandle) !=
pdPASS)
.
.
.
RGB_LED_SetColor(LED_COLOR_OFF);
SLN_AMP_WriteDefault();
uint32_t taskNotification = 0;
while (1)
{
xTaskNotifyWait(0xffffffffU, 0xffffffffU, &taskNotification, portMAX_DELAY);
switch (taskNotification)
{
case kWakeWordDetected:
{
RGB_LED_SetColor(LED_COLOR_BLUE);
vTaskDelay(100);
RGB_LED_SetColor(LED_COLOR_OFF);
break;
}
default:
break;
}
taskNotification = 0;
}
}
Listaus 2: Äänen esikäsittelyn esimerkkisovelluksessa päätehtävä appTask käynnistää tehtävät, jotka hoitavat äänen käsittelyn ja mikrofonidatan muunnoksen, ja jää sitten odottamaan FreeRTOS:n ilmoitusta (taskNotification) herätesanan tunnistuksesta (kWakeWordDetected). (Lähdekoodi: NXP)
Tämän esimerkkisovelluksen äänenkäsittelytehtävä puolestaan alustaa laiteohjelmiston herätesanafunktion ja herätesanan tunnistusparametrit ennen kuin myös se siirtyy päättymättömään silmukkaan, jossa se odottaa mikrofonidatan muunnostehtävän FreeRTOS-ilmoitusta siitä, että käsiteltyä mikrofonidataa on käytettävissä. Tällöin äänenkäsittelytehtävä kutsuu Intelligent Toolbox -laiteohjelmiston funktioita, jotka käsittelevät äänidatan ja suorittavat herätesanan tunnistuksen ML-päättelyrutiinin avulla (listaus 3).
Kopioi
void audio_processing_task(void *pvParameters)
{
.
.
.
SLN_AMAZON_WAKE_Initialize();
SLN_AMAZON_WAKE_SetWakeupDetectedParams(&wakeWordActive, &wwLen);
while (1)
{
// Suspend waiting to be activated when receiving PDM mic data after Decimation
xTaskNotifyWait(0U, ULONG_MAX, &taskNotification, portMAX_DELAY);
.
.
.
// Process microphone streams
int16_t *pcmIn = (int16_t *)((*s_micInputStream)[pingPongIdx]);
SLN_Voice_Process_Audio(g_externallyAllocatedMem, pcmIn,
&s_ampInputStream[pingPongAmpIdx * PCM_SINGLE_CH_SMPL_COUNT], &cleanAudioBuff, NULL,
NULL);
// Pass output of AFE to wake word
SLN_AMAZON_WAKE_ProcessWakeWord(cleanAudioBuff, 320);
taskNotification &= ~currentEvent;
if (wakeWordActive)
{
wakeWordActive = 0U;
// Notify App Task Wake Word Detected
xTaskNotify(s_appTask, kWakeWordDetected, eSetBits);
}
}
}
Listaus 3: Äänen esikäsittelyn esimerkkisovelluksessa äänenkäsittelytehtävä alustaa laiteohjelmiston herätesanarutiinin, odottaa FreeRTOS-ilmoitusta siitä, että mikrofonidataa on käytettävissä, ja kutsuu lopulta NXP Intelligent Toolbox -laiteohjelmiston analogista etuastetta (SLN_Voice_Process_Audio) ja ML-päättelyrutiinia (SLN_AMAZON_WAKE_ProcessWakeWord) herätesanan tunnistusta varten. (Lähdekoodi: NXP)
Herätesanan tunnistamisen jälkeen äänen käsittelytehtävä lähettää FreeRTOS-tehtäväilmoituksen, jolla se ilmoittaa tapahtumasta sovelluksen päätehtävälle (appTask). Saadessaan tämän ilmoituksen appTask vilkuttaa lyhyesti sinistä lediä (katso taas listaus 2).
Täydellinen Alexa-esimerkkisovellus käyttää samoja periaatteita kuin yksinkertaisempi äänen esikäsittelysovellus, mutta laajentaa peruskoodipohjaa huomattavasti tukemaan täyttä Alexa-toiminnallisuutta. Esimerkiksi silloin, kun ML-päättelyrutiini tunnistaa herätesanan Alexa-esimerkkisovelluksessa, äänen käsittelytehtävä suorittaa joukon FreeRTOS-ilmoituksia kuhunkin Alexa-käsittelysekvenssin vaiheeseen liittyen (listaus 4).
Kopioi
void audio_processing_task(void *pvParameters)
{
.
.
.
SLN_AMAZON_WAKE_Initialize();
SLN_AMAZON_WAKE_SetWakeupDetectedParams(&u8WakeWordActive, &wwLen);
while (1)
{
// Suspend waiting to be activated when receiving PDM mic data after Decimation
xTaskNotifyWait(0U, ULONG_MAX, &taskNotification, portMAX_DELAY);
.
.
.
int16_t *pcmIn = (int16_t *)((*s_micInputStream)[pingPongIdx]);
SLN_Voice_Process_Audio(g_w8ExternallyAllocatedMem, pcmIn,
&s_ampInputStream[pingPongAmpIdx * PCM_SINGLE_CH_SMPL_COUNT], &pu8CleanAudioBuff, NULL,
NULL);
SLN_AMAZON_WAKE_ProcessWakeWord((int16_t*)pu8CleanAudioBuff, 320);
taskNotification &= ~currentEvent;
// If devices is muted, then skip over state machine
if (s_micMuteMode)
{
if (u8WakeWordActive)
{
u8WakeWordActive = 0U;
}
memset(pu8CleanAudioBuff, 0x00, AUDIO_QUEUE_ITEM_LEN_BYTES);
}
if (u8WakeWordActive)
{
configPRINTF(("Wake word detected locally\r\n"));
}
// Execute intended state
switch (s_audioProcessingState)
{
case kIdle:
/* add clean buff to cloud wake word ring buffer */
continuous_utterance_samples_add(pu8CleanAudioBuff, PCM_SINGLE_CH_SMPL_COUNT * PCM_SAMPLE_SIZE_BYTES);
if (u8WakeWordActive)
{
continuous_utterance_buffer_set(&cloud_buffer, &cloud_buffer_len, wwLen);
u8WakeWordActive = 0U;
wwLen = 0;
// Notify App Task Wake Word Detected
xTaskNotify(s_appTask, kWakeWordDetected, eSetBits);
// App Task will now determine if we begin recording/publishing data
}
break;
.
.
.
case kWakeWordDetected:
audio_processing_reset_mic_capture_buffers();
// Notify App_Task to indicate recording
xTaskNotify(s_appTask, kMicRecording, eSetBits);
if (s_audioProcessingState != kMicRecording)
{
s_audioProcessingState = kMicCloudWakeVerifier;
}
configPRINTF(("[audio processing] Mic Recording Start.\r\n"));
// Roll into next state
case kMicCloudWakeVerifier:
case kMicRecording:
micRecordingLen = AUDIO_QUEUE_ITEM_LEN_BYTES;
if (u8WakeWordActive)
{
u8WakeWordActive = 0U;
}
// Push data into buffer for consumption by AIS task
status = audio_processing_push_mic_data(&pu8CleanAudioBuff, &micRecordingLen);
.
.
.
}
}
Listaus 4: Täydellisessä Alexa-sovelluksessa äänen käsittelytehtävä lisää äänen esikäsittelysovelluksessa tehtyihin käsittelyvaiheisiin koodia, jolla hallinnoidaan Alexa-sekvenssin seuraavia äänen käsittelyvaiheita. (Lähdekoodi: NXP)
Paikallisen ML-pohjaisen herätesanan tunnistamisen jälkeen täydellisen Alexa-sovelluksen äänenkäsittelytehtävä ilmoittaa asiasta sovelluksen päätehtävälle yllä kuvatulla tavalla. Lisäksi sen pitää hallita äänenkäsittelyvaiheita, joissa mikrofoni pidetään auki koko äänisyötteen tallentamiseksi Alexa-pilvessä käsittelemistä varten hävittämättä alkuperäistä datavirtaa, joka sisältää paikallisesti havaitun herätesanan. Tämä koko datavirta välitetään Alexa-pilveen herätesanan vahvistusta sekä puheen jatkokäsittelyä varten.
Käsittelysekvenssin jokaisessa vaiheessa äänen käsittelytehtävä lähettää sovelluksen päätehtävälle vastaavia FreeRTOS-ilmoituksia. Aivan kuten äänen käsittelytehtävässä, täydellisessä Alexa-sovelluksessa laajennetaan sovelluksen päätehtävän muotoa, joka äänen esikäsittelytehtävässä esitettiin yksinkertaistettuna. Tässä täydellisen Alexa-sovelluksen päätehtävä appTask sekä synnyttää tapahtumat lähetettäväksi Alexa-pilveen että ohjaa sarjan ledejä Amazon AVS UX Attention System -vaatimusten mukaisesti. Esimerkiksi kun mikrofoni pidetään avoinna herätesanan tunnistamisen jälkeen, äänen käsittelytehtävä ilmoittaa asiasta sovelluksen päätehtävälle, joka asettaa sopivan UX-huomiotilan (kiinteä sinivihreä led-merkkivalo) (katso listauksen 5 keltaisella korostetut osat sekä vastaavat korostukset listauksessa 4).
Kopioi
void appTask(void *arg)
{
.
.
.
// Create audio processing task
if (xTaskCreate(audio_processing_task, "Audio_proc_task", 1536U, NULL, audio_processing_task_PRIORITY, &xAudioProcessingTaskHandle) != pdPASS)
.
.
.
// Create pdm to pcm task
if (xTaskCreate(pdm_to_pcm_task, "pdm_to_pcm_task", 512U, NULL, pdm_to_pcm_task_PRIORITY, &xPdmToPcmTaskHandle) != pdPASS)
.
.
.
while(1)
{
xTaskNotifyWait( ULONG_MAX, ULONG_MAX, &taskNotification, portMAX_DELAY );
if (kIdle & taskNotification)
{
// Set UX attention state
ux_attention_set_state(uxIdle);
taskNotification &= ~kIdle;
}
if (kWakeWordDetected & taskNotification)
{
if (reconnection_task_get_state() == kStartState)
{
if (!AIS_CheckState(&aisHandle, AIS_TASK_STATE_MICROPHONE))
{
// Set UX attention state
ux_attention_set_state(uxListeningStart);
.
.
.
// Begin sending speech
micOpen.wwStart = aisHandle.micStream.audio.audioData.offset + 16000;
micOpen.wwEnd = aisHandle.micStream.audio.audioData.offset + audio_processing_get_wake_word_end();
micOpen.initiator = AIS_INITIATOR_WAKEWORD;
AIS_EventMicrophoneOpened(&aisHandle, &micOpen);
// We are now recording
audio_processing_set_state(kWakeWordDetected);
}
}
else
{
ux_attention_set_state(uxDisconnected);
audio_processing_set_state(kReconnect);
}
taskNotification &= ~kWakeWordDetected;
}
.
.
.
if (kMicRecording & taskNotification)
{
// Set UX attention state and check if mute is active
// so we don't confuse the user
if (audio_processing_get_mic_mute())
{
ux_attention_set_state(uxMicOntoOff);
}
else
{
ux_attention_set_state(uxListeningActive);
}
taskNotification &= ~kMicRecording;
}
.
.
.
Listaus 5: Täydellisessä Alexa-sovelluksessa päätehtävä kontrolloi Alexan käsittelysekvenssiä, ohjaten myös LED-valoja Alexa-sertifiointivaatimusten mukaisesti. (Lähdekoodi: NXP)
Täydellisen Alexa-sovelluksen päärutiini laajentaa samalla tavoin mallia, joka esitettiin yksinkertaisemmassa muodossa äänen esikäsittelysovelluksessa. Tässä tapauksessa pääsovellus luo myös lisää FreeRTOS-tehtäviä kattavampaa alustusta varten sekä tehtäviä, joilla käsitellään sarjan painikkeita sekä tuetaan OTA-päivityksiä.
Näiden esimerkkisovellusten pohjalta kehittäjät voivat luottavaisesti toteuttaa Alexa-toiminnallisuuden käyttämällä NXP MCU Alexa Voice IoT SDK:ta omissa i.MX RT106A -pohjaisissa laitteissaan. Koska suoritusalusta hyödyntää AVS for AWS IoT Corea täysimittaisesti, kehittäjät voivat sen avulla käyttää Alexaa tukevia ratkaisuja laajemmin edullisissa, resursseiltaan rajoitetuissa laitteissa, jotka muodostavat yhä sofistikoituneempien IoT-sovellusten perustan.
Yhteenveto
Amazon Alexa Voice Service on antanut kehittäjille mahdollisuuden toteuttaa samanlaisia ääniavustajatoimintoja kuin suosituissa Echo-älykaiuttimissa. Halutun Alexa-sertifioinnin saavuttaminen edellytti aiemmin, että suoritusalustalla oli käytettävissään huomattavasti paikallista muistia sekä runsaasti suoritustehoa. NXP:n AVS for AWS IoT Core -pohjainen sarja tarjoaa valmiin ratkaisun, jolla Alexa-toiminnallisuus voidaan lisätä käyttämällä mikrokontrolleria sekä siihen liittyvää ohjelmiston suoritusympäristöä.

Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.