Lisää IoT-projekteihin nopeasti Alexa-toiminnallisuus käyttämällä mikrokontrolleripohjaista sarjaa

Kirjoittaja Stephen Evanczuk

Julkaisija DigiKeyn kirjoittajat Pohjois-Amerikassa

Ää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.

Kaavio käyttäjän äänipyynnöistä ja Alexa-pilvestä vastaanotetuista käskyistä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).

Kaavio Alexaa tukevien laitteiden äänirajapinnoista ja IoT-ilmoituskuluistaKuva 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).

Kaavio AVS-laitteen SDK:sta ja datavirroistaKuva 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).

Kaavio: AVS for AWS IoT Coren muisti- ja laskentaintensiiviset tehtävät pilvessä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).

Kaavio NXP:n i.MX RT1060 -crossover-suoritinperheestä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).

Kaavio NXP:n SLN-ALEXA-IOT-AVS-sarjan järjestelmämoduulistaKuva 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).

Kaavio NXP:n ääniohjausjärjestelmäympäristöstä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öä.

DigiKey logo

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.

Tietoja kirjoittajasta

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk has more than 20 years of experience writing for and about the electronics industry on a wide range of topics including hardware, software, systems, and applications including the IoT. He received his Ph.D. in neuroscience on neuronal networks and worked in the aerospace industry on massively distributed secure systems and algorithm acceleration methods. Currently, when he's not writing articles on technology and engineering, he's working on applications of deep learning to recognition and recommendation systems.

Tietoja tästä julkaisijasta

DigiKeyn kirjoittajat Pohjois-Amerikassa