Snel ‘Alexa Built-In’ IoT-ontwerpen implementeren met behulp van een microcontrollerkit

Door Stephen Evanczuk

Bijgedragen door De Noord-Amerikaanse redacteurs van DigiKey

Voice assistants hebben zich snel ontwikkeld en vervullen nu een belangrijke functie in alle slimme producten. Van alle huidige cloudgebaseerde oplossingen is Alexa Voice Service (AVS) van Amazon dé dominante voice assistant die kant-en-klare functionaliteit biedt met behulp van de Amazon cloud voor spraakherkenning en natuurlijke taalverwerking.

De prestatievereisten en ontwerpcomplexiteit van AVS bieden echter een beduidende belemmering voor ontwikkelaars van kleinere microprocessorgestuurde apparaten voor smart homes en het Internet of Things (IoT). NXP Semiconductors heeft een kit ontwikkeld als drop-in oplossing en referentie-ontwerp voor toepassingen op maat. Deze kit maakt gebruik van Amazon AVS en is speciaal ontworpen voor zogenaamde resource-constrained apparaten.

Dit artikel laat zien hoe ontwikkelaars snel ‘Alexa Built-in’ ontwerpen kunnen implementeren met behulp van een kant-en-klare oplossing van NXP.

Wat is AVS?

Voice assistants deden tien jaar geleden hun intrede en sindsdien is deze technologie snel geëvolueerd, vooral in toepassingen met slimme speakers. Marktanalisten schatten dat deze groeimarkt al circa een derde van de bevolking in de VS omvat. De Amazon Echo slimme speakers hebben daarbij een dominante positie verworven en benutten het succes van Amazon Web Services (AWS) bij het leveren van cloudgebaseerde middelen voor ondersteuning van Echo-apps van derden, zogenaamde ‘skills’.

Met behulp van de Alexa Skills Kit (ASK) en bijbehorende API’s (Application Programming Interfaces) kunnen ontwikkelaars profiteren van de snel groeiende geïnstalleerde basis van Echo slimme speakers om een bepaald niveau van spraakbesturing toe te voegen aan hun verbonden apparaten. Op die manier kunnen verbonden producten zoals slimme televisies of thermostaten die ‘met Alexa werken’ reageren op spraakverzoeken en andere opdrachten die zijn via de Alexa-cloud ontvangen (Afbeelding 1). Hieronder wordt een samenvatting gegeven van AVS en wat je er allemaal mee kan doen.

Schema van spraakverzoeken en bijbehorende opdrachten die via de Alexa-cloud worden ontvangenAfbeelding 1: Ontwikkelaars kunnen door Alexa-apps of ‘skills’ te bouwen producten laten reageren op spraakopdrachten van de gebruiker via Amazon Echo-producten. (Bron afbeelding: Amazon Web Services)

Alexa Built-in ontwerp

In tegenstelling tot producten die ‘met Alexa werken’ creëren slimme producten met ‘Alexa Built-in’ een naadloze, low-latency interface tussen het apparaat met Alexa-spraakmogelijkheden en AWS. Deze producten integreren AVS rechtstreeks in een verbonden apparaatontwerp. Met behulp van AVS in combinatie met het AWS IoT Core-platform kunnen ontwikkelaars geavanceerde IoT-toepassingen implementeren waarmee gebruikers via spraakopdrachten Alexa-producten gebruiken om verbonden apparaten te bedienen en met deze apparaten te communiceren (Afbeelding 2).

Schema van spraakinterfaces en IoT-meldingsworkflows in Alexa-apparatenAfbeelding 2: Alexa-apparaten bieden gebruikers een spraakinterface voor het bedienen van apparaten (boven) of het ontvangen van meldingen van IoT-apparaten (onder) die via AWS IoT Core verbonden zijn met Amazon Web Services. (Bron afbeelding: Amazon Web Services)

In het verleden vereisten ontwerpen voor de Alexa-compatibele apparaten die de kern vormen van dit soort IoT-toepassingen echter enorme ontwerpinspanningen. Om gebruik te maken van cloudgebaseerde Alexa-services moet een apparaat de AVS-servicebibliotheken uitvoeren die via de AVS Device Software Development Kit (SDK) op Android- of Linux-platforms worden geleverd om het ontwaakwoord te detecteren, met de Alexa-cloud te communiceren en opdrachten te verwerken voor ondersteunde mogelijkheden (Afbeelding 3).

Diagram van AVS Device SDK en gegevensstroomAfbeelding 3: Dit diagram illustreert de AVS Device SDK en de gegevensstroom tussen de verschillende onderdelen. (Bron afbeelding: Amazon Web Services)

Om deze servicebibliotheken te ondersteunen, moesten ontwerpen voor Alexa-apparaten doorgaans een krachtige applicatieprocessor en ten minste 50 megabyte (Mbyte) geheugen hebben om te voldoen aan de eisen van AVS-verwerking. Bovendien gebruikten deze ontwerpen vaak een digitale signaalprocessor (DSP) om de complexe algoritmen uit te voeren die nodig zijn om spraakaudio uit rumoerige omgevingen te extraheren en om far-field spraakmogelijkheden te ondersteunen die verwacht worden van apparaten met spraakassistent. Uiteindelijk gaan de systeemvereisten voor het bouwen van een effectief Alexa-apparaat doorgaans veel verder dan de kosten en complexiteit van praktische IoT-apparaten.

Met de release van AVS-integratie voor AWS IoT Core heeft Amazon echter de werklast van de processor en de hoeveelheid geheugen die nodig is voor de implementatie van ingebouwde Alexa-producten drastisch verminderd. Dankzij deze service worden reken- en geheugenintensieve taken van het Alexa-apparaat naar een bijbehorend virtueel apparaat in de cloud verhuisd (Afbeelding 4).

Schema van AVS voor AWS IoT Core-geheugen en verwerking van intensieve taken in de cloudAfbeelding 4: AVS voor AWS IoT Core verhuist geheugen- en verwerkingsintensieve taken naar de cloud om implementatie van Alexa voice assistant mogelijk te maken op resource-constrained IoT-apparaten. (Bron afbeelding: Amazon Web Services)

De verwerkingsverantwoordelijkheden van het fysieke apparaat worden beperkt tot het leveren van basisservices, zoals beveiligde berichtgeving, betrouwbare levering van audiogegevens aan en van Alexa, taakbeheer en gebeurtenismeldingen binnen het apparaat en met Alexa. De overdracht van gegevens, opdrachten en meldingen tussen het fysieke apparaat en Alexa vindt plaats via efficiënte MQTT-berichten (MQ Telemetry Transport), waarbij gebruik wordt gemaakt van een aantal gereserveerde onderwerpen in het MQTT publish-subscribe protocol. Tot slot zorgt een bijbehorende mobiele app samen met de Alexa-cloud voor apparaatregistratie en eventuele extra vereiste gebruikersinteractie met het Alexa-apparaat.

Door de intensieve verwerking naar de cloud te verhuizen, stelt AVS voor AWS IoT Core ontwikkelaars in staat om Alexa Built-in producten te maken met platforms waarmee embedded systeemontwikkelaars meer vertrouwd zijn. In plaats van applicatieprocessors met 50 Mbyte geheugen op Linux of Android kunnen ontwikkelaars deze ontwerpen implementeren met kleinere microcontrollers met minder dan 1 MB RAM en real-time besturingssysteem (RTOS) software. Alexa-ontwerpen die zijn gebouwd met AVS voor AWS IoT Core hebben in feite 50% minder materiaalkosten vergeleken met ontwerpen die zijn gemaakt om het volledige pakket AVS-services lokaal te laten draaien.

Hoewel AVS voor AWS IoT Core een rendabeler runtime-platform ondersteunt, blijft de implementatie van een gecertificeerd Alexa Built-in product een complexe taak. Nieuwe AVS- en IoT Core-ontwikkelaars krijgen te maken met een aanzienlijke leercurve als het gaat om AWS-vereisten voor beveiliging, communicatie, accountbeheer, UX-ontwerp (User Experience) etc. Ongeacht of ze vertrouwd zijn met het AWS-ecosysteem moeten alle Alexa-productontwikkelaars ervoor zorgen dat hun ontwerpen aan een lange reeks Amazon Alexa-specificaties en -vereisten voldoen.

NXP biedt een kant-en-klare, microcontrollergebaseerde oplossing voor Alexa die de hardware- en softwarevereisten voor Amazon AVS voor AWS IoT Core volledig implementeert.

Microcontrollergebaseerde Alexa-oplossingen

De SLN-ALEXA-IOT AVS-kit van NXP is gebouwd rond de i.MX RT106A microcontroller en biedt kant-en-klare AWS-connectiviteit, AVS-gekwalificeerde far-field audio-algoritmen, echo-onderdrukking, Alexa-ontwaakwoord en applicatiecode. De i.MX RT106A microcontroller in de kit is gebaseerd op een Cortex-M7-kern van Arm en is onderdeel van de i.MX RT106x-serie crossover-processors van NXP, speciaal ontwikkeld voor IoT edge-computing. De RT106A is ontwikkeld voor geïntegreerde spraaktoepassingen en voegt gespecialiseerde functionaliteit toe aan de basisarchitectuur van de i.MX RT1060-serie crossover-processors van NXP met een set uitgebreide perifere interfaces, intern geheugen en ondersteuning voor externe geheugenopties (Afbeelding 5).

Schema van de i.MX Rt1060-serie crossover-processors van NXPAfbeelding 5: De i.MX RT1060-serie crossover-processors van NXP integreert een Cortex-M7 microcontrollerkern van Arm met een volledige set perifere interfaces, geheugenopties en andere capaciteiten die doorgaans vereist zijn voor IoT-apparaten. (Bron afbeelding: NXP)

Dankzij de geïntegreerde functionaliteit heeft de i.MX RT106A microcontroller maar een paar extra componenten nodig om de vereiste hardwarebasis voor de implementatie van AVS voor AWS IoT Core te bieden. De SLN-ALEXA-IOT-kit van NXP bevat de i.MX RT106A microcontroller, geïntegreerd in een systeemmodule met 256 megabit (Mb) flashgeheugen, de LBEE5KL1DX Wi-Fi/Bluetooth ontvangermodule van Murata Electronics en de AP2202K-3.3TRG1 buck-omzetter van Diodes (Afbeelding 6).

Schema van de SLN-ALEXA-IOT AVS-kit systeemmodule van NXPAfbeelding 6: Het ontwerp van de the SLN-ALEXA-IOT AVS-kit systeemmodule van NXP maakt gebruik van een eenvoudige hardware-interface die vereist is om de i.MX RT106A microcontroller van NXP te integreren met externe flash en een draadloze ontvanger. (Bron afbeelding: NXP)

In aanvulling op deze systeemmodule biedt een spraakkaart in de SLN-ALEXA-IOT-kit drie SPH0641LM4H-1 pulse-density modulation (PDM) MEMS-microfoons van Knowles, een AS01808AO speaker van PUI Audio en een TFA9894D klasse-D audioversterker van NXP. Naast een USB-C-connector voor het voeden van de kit en voor het uitvoeren van een shell-console vanaf een pc, biedt de spraakkaart headers voor Ethernet, seriële randapparatuur en algemene ingang/uitgang (GPIO) van de i.MX RT106A microcontroller. Tot slot bevat de printplaat schakelaars voor besturingsinvoer en leds voor visuele feedback die voldoen aan de Amazon AVS UX Attention System-vereisten met verschillende led-kleuren en aan/uit-patronen.

Dankzij de systeemmodule en spraakkaart is de SLN-ALEXA-IOT hardware een volledig platform voor apparaatverwerking van AVS voor AWS IoT Core-software. Zoals eerder opgemerkt, zijn IoT-apparaatontwerpen met Alexa echter afhankelijk van zowel hardware als geoptimaliseerde software. Het creëren van die software met Amazons AVS voor AWS IoT API kan projecten aanzienlijk vertragen terwijl ontwikkelaars de vereiste gegevensobjecten bouwen en de bijbehorende protocollen implementeren. Verdere vertragingen kunnen zich voordoen als ontwikkelaars werken naar Alexa Built-in certificering en naleving van AVS UX Attention System, AWS veiligheidspraktijken en andere vereisten die betrekking hebben op elk aspect van de interactie tussen gebruikers en Alexa-diensten in het ontwerp. NXP lost deze problemen op met een uitgebreide runtime-softwareomgeving voor spraakbesturing op basis van Amazon FreeRTOS, gebaseerd op een laag softwaredrivers voor XIP-flash (Execute In Place), connectiviteit en andere hardwarecomponenten (Afbeelding 7).

Schema van de NXP-spraakbesturingssysteemomgevingAfbeelding 7: De NXP-spraakbesturingssysteemomgeving is gebaseerd op Amazon FreeRTOS en biedt een uitgebreide reeks middlewarediensten zoals firmware-routines voor machine learning inferentie en audio front-end verwerking. (Bron afbeelding: NXP)

De intelligente Toolbox-firmware van NXP is de basis voor de spraakverwerkingsmogelijkheden van deze softwareomgeving en biedt geoptimaliseerde functies voor alle audiotaken, waaronder de engine voor de machine learning (ML) inferentie en de ML audio front-end voor het conditioneren en optimaliseren van audiosignalen. Andere middlewarediensten ondersteunen veilige connectiviteit, AWS-communicatie en audiomogelijkheden. Boven deze uitgebreide servicelaag verzorgt software voor AWS IoT Core, onboarding en andere toepassingsbeheerfuncties het opstarten van een tweetraps bootloader met ondersteuning voor OTA-updates (over the air), gebaseerd op de AWS IoT OTA-service en Amazon FreeRTOS OTA-client.

Met behulp van de in de fabriek geïnstalleerde software die in deze omgeving draait, kunnen ontwikkelaars onmiddellijk de SLN-ALEXA-IOT hardwarekit gebruiken met een volledige Alexa-toepassing, ontworpen voor gebruik van een NXP-demonstratieaccount voor AWS IoT. De NXP-documentatie bevat een gedetailleerde beschrijving van het proces voor het opstarten van de kit, het inrichten van Wi-Fi-referenties en het voltooien van de AWS-apparaatverificatie met een demonstratieaccount. Als onderdeel van dit proces communiceren ontwikkelaars met de kit en AWS door middel van een mobiele Android-app in het softwaredistributiepakket, dat beschikbaar is op de NXP-site met behulp van een activeringscode die bij de SLN-ALEXA-IOT-kits wordt meegeleverd. Na een paar eenvoudige stappen, kunnen ontwikkelaars onmiddellijk met de kit beginnen via dezelfde soort Alexa-spraakinteractie als die voor de slimme Echo-speakers.

De SLN-ALEXA-IOT-kit en de in de fabriek geïnstalleerde software vormen een kant-en-klaar platform om snel prototypen te maken van producten met Alexa-mogelijkheden. Tegelijkertijd fungeren de hardware en software van de kit als een snel ontwikkelplatform voor het maken van aangepaste ontwerpen met Alexa-ondersteuning op basis van de i.MX RT106A microcontroller.

Ontwikkeling op maat

Software voor i.MX RT106A-gebaseerde Alexa-oplossingen maakt gebruik van de mogelijkheden van de NXP-spraakbesturingsruntime-omgeving via de MCU Alexa Voice IoT SDK van NXP die wordt geleverd als onderdeel van het softwarepakket voor productactivering. Deze SDK is ontworpen als add-on voor de op Eclipse gebaseerde MCUXpresso-geïntegreerde ontwikkelomgeving (IDE) en combineert een complete broncode voor voorbeeldtoepassingen, drivers en middleware met headers voor binaire distributies van gespecialiseerde firmwaremogelijkheden zoals de NXP Intelligent Toolbox, ML inferentie-engine en ML audio front-end.

Ontwikkelaars die snel een Alexa-product willen implementeren, kunnen in principe de volledige Alexa-demonstratietoepassing gebruiken met minimale aanpassingen. In het eenvoudigste geval zouden deze wijzigingen de toepassing eenvoudig naar de eigen AWS-account van de ontwikkelaar omleiden met behulp van eigen beveiligingsreferenties. NXP biedt een stapsgewijze beschrijving voor het voltooien van dit proces.

Voor ontwikkelingen op maat bieden de voorbeeldtoepassingen in de softwaredistributie uitvoerbare voorbeelden die laten zien hoe je met de NXP MCU Alexa Voice IoT SDK kunt werken. In plaats van rechtstreeks naar de volledige Alexa-demonstratietoepassing te gaan, kunnen ontwikkelaars voorbeeldtoepassingen verkennen waarmee ze zich kunnen richten op specifieke mogelijkheden, zoals audio front-end, Wi-Fi- en Bluetooth-connectiviteit, bootloading en andere. Zo illustreert de voorbeeldtoepassing voor audio front-end de basispatronen voor het detecteren van ontwaakwoorden met Amazon FreeRTOS-taken.

In de voorbeeldtoepassing voor audio front-end laat de hoofdroutine zien hoe ontwikkelaars hardware- en softwaresubsystemen kunnen initialiseren en vervolgens de FreeRTOS xTaskCreate-functie kunnen gebruiken om de hoofdtoepassingstaak (appTask) en een console-shell-taak (sln_shell_task) te starten voordat de besturing wordt vrijgegeven aan de FreeRTOS-planner (Listing 1). (Opmerking: De vTaskStartScheduler-oproep om de FreeRTOS-planner te starten, wordt alleen geretourneerd als de planner onvoldoende geheugen heeft.)

Copy 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(); .
.
.
} 

Listing 1: Een voorbeeld van een audio front-end toepassing, opgenomen in de NXP MCU Alexa Voice IoT SDK-distributie, toont de basisvereisten voor initialisatie en het maken van FreeRTOS-taken voor de hoofdtoepassingstaak en een console-shell-taak. (Bron code: NXP)

Na het initialiseren van het audiosubsysteem start de hoofdtoepassingstaak appTask een paar FreeRTOS-taken. Eén taak voert een serviceroutine, audio_processing_task, uit die inkomende audio verwerkt, terwijl de andere de conversie van microfoon PDM-uitvoer naar pulse-code modulatie (PCM) verwerkt. Uiteindelijk raakt appTask in een eindeloze lus en wacht op een RTOS-melding die aangeeft dat het ontwaakwoord is gedetecteerd (Listing 2).

Copy 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;     } } 

Listing 2: In de audio front-end voorbeeldtoepassing start de hoofdtoepassingstaak, appTask, taken voor het verwerken van audio en het converteren van microfoongegevens en wacht vervolgens op een melding van FreeRTOS (taskNotification) dat het ontwaakwoord is gedetecteerd (kWakeWordDetected). (Bron code: NXP)

De audioverwerkingstaak in deze voorbeeldtoepassing initialiseert op zijn beurt de functie voor het activeren van ontwaakwoord-firmware en initialiseert de parameters voor het detecteren van ontwaakwoorden voordat deze ook in een eindeloze lus terechtkomt, waarbij wordt gewacht op een FreeRTOS-melding van de taak voor het converteren van microfoongegevens dat er verwerkte microfoongegevens beschikbaar zijn. Op dat moment roept de audioverwerkingstaak Intelligent Toolbox-firmwarefuncties aan die de audiogegevens verwerken en ontwaakwoorddetectie uitvoeren met behulp van de ML inferentie-engine (Listing 3).

Copy
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);
        }
    }
}

Listing 3: In de voorbeeldtoepassing voor audio front-end initialiseert de audioverwerkingstaak de firmware ontwaakwoord-engine, wacht op een FreeRTOS-melding dat microfoongegevens beschikbaar zijn en roept uiteindelijk NXP Intelligent Toolbox-firmware analoog front-end (SLN_Voice_Process_Audio) en ML inferentie-engine (SLN_AMAZON_WAKE_ProcessWakeWord) aan voor ontwaakwoorddetectie. (Bron code: NXP)

Na de ontwaakwoorddetectie stuurt de audioverwerkingstaak een FreeRTOS-taakmelding naar de hoofdtoepassingstaak, appTask, van die gebeurtenis. Na ontvangst van deze melding laat de appTask kort een blauw gekleurde led knipperen (zie opnieuw Listing 2).

De volledige Alexa-voorbeeldtoepassing vertrouwt op dezelfde patronen als die voor de eenvoudiger audio front-end toepassing worden beschreven, maar breidt die basiscode aanzienlijk uit om volledige Alexa-functionaliteit te ondersteunen. Nadat de ML inferentie-engine bijvoorbeeld het ontwaakwoord in de Alexa-voorbeeldtoepassing heeft gedetecteerd, voert de audioverwerking een reeks FreeRTOS-meldingen uit die elk zijn gekoppeld aan een stap in de Alexa-verwerkingsreeks (Listing 4).

Copy
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);
.
.
.
    }
}

Listing 4: In de volledige Alexa-toepassing breidt de audioverwerkingstaak de verwerkingsstappen die in de audio front-end toepassing zijn uitgevoerd uit met extra code voor het beheren van de volgende audio-verwerkingsstappen in de Alexa-reeks. (Bron code: NXP)

Na detectie van het lokale ML-ontwaakwoord stuurt de audioverwerkingstaak van de volledige Alexa-toepassing een melding naar de hoofdtoepassingstaak, zoals eerder beschreven. Bovendien moet deze nu de audioverwerkingsstatus beheren, waarbij de microfoon open blijft om de volledige audio-invoer voor spraakverwerking in de Alexa-cloud vast te leggen zonder de oorspronkelijke gegevensstroom te verliezen die het lokaal gedetecteerde ontwaakwoord bevat. Deze volledige gegevensstroom wordt aan de Alexa-cloud doorgegeven voor verificatie van ontwaakwoorden en verdere spraakverwerking.

In elke stap van deze verwerkingsreeks geeft de audioverwerkingstaak bijbehorende FreeRTOS-meldingen door aan de hoofdtoepassingstaak. Net als bij de audioverwerkingstaak breidt de volledige Alexa-toepassing het hoofdtoepassingspatroon uit dat in een eenvoudiger vorm in de audio front-end toepassing wordt gepresenteerd. Hier genereert de volledige Alexa-hoofdtoepassingstaak, appTask, gebeurtenissen voor zowel verzending naar de Alexa-cloud als voor beheer van de leds van de kit in overeenstemming met de vereisten van het Amazon AVS UX Attention System. Als je bijvoorbeeld de microfoon openhoudt na detectie van het ontwaakwoord, ontvangt de hoofdtoepassingstaak een melding van de audioverwerkingstaak. Hiermee wordt de juiste UX-status ingesteld (led-indicator brandt cyaan) (zie de gele markeringen in Listing 5 en de bijbehorende markering in Listing 4).

Copy
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;
        }
.
.
.

Listing 5: In de volledige Alexa-toepassing orkestreert de hoofdtoepassingstaak de Alexa-verwerkingsreeks met inbegrip van besturing van ledverlichting in overeenstemming met Alexa-certificeringseisen. (Bron code: NXP)

De belangrijkste routine in de volledige Alexa-toepassing breidt het patroon uit dat in eenvoudigere vorm in de audio front-end wordt getoond. In dit geval creëert de hoofdtoepassing ook extra FreeRTOS-taken voor een meer substantiële initialisatieprocedure, evenals taken voor het verwerken van de knoppen in de kit en het ondersteunen van OTA-updates.

Door deze voorbeeldtoepassingen verder te ontwikkelen, kunnen ontwikkelaars vol vertrouwen Alexa Built-in functionaliteit implementeren met behulp van de NXP MCU Alexa Voice IoT SDK in hun eigen i.MX RT106A-gebaseerde ontwerpen. Omdat dit uitvoeringsplatform optimaal gebruik maakt van AVS voor AWS IoT Core kunnen ontwikkelaars Alexa-oplossingen breder implementeren in betaalbare resource-constrained apparaten op basis van steeds geavanceerder IoT-toepassingen.

Conclusie

Amazon Alexa Voice Service heeft ontwikkelaars in staat gesteld om dezelfde spraakassistentfunctionaliteit te implementeren die de snelle groei van Echo smart speakers drijft. In het verleden konden producten alleen die felbegeerde Alexa Built-in certificering behalen met behulp van uitvoerplatforms met een aanzienlijk lokaal geheugen en krachtige verwerkingsmogelijkheden. NXP biedt een drop-in oplossing voor Alexa Built-in functionaliteit met AVS voor AWS IoT Core met behulp van een microcontroller en een bijbehorende software-uitvoeromgeving.

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.

Achtergrondinformatie over deze auteur

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk heeft meer dan 20 jaar ervaring in het schrijven voor en over de elektronicasector met betrekking tot heel wat onderwerpen, waaronder hardware, software, systemen en toepassingen zoals het IoT. Hij behaalde zijn filosofiediplomain neurowetenschappen over neuronale netwerken en werkte in de ruimtevaartsector op massaal verspreide veilige systemen en algoritmeversnellingsmethoden. Wanneer hij geen artikels over technologie en techniek schrijft, werkt hij aan toepassingen voor “deep learning” voor herkennings- en aanbevelingssystemen.

Over deze uitgever

De Noord-Amerikaanse redacteurs van DigiKey