マルツTOP > APPLICATION LAB TOPページ おすすめ技術記事アーカイブス > 「Alexa Built-In」IoT設計をマイクロコントローラベースのキットを使用して迅速に実装

「Alexa Built-In」IoT設計をマイクロコントローラベースのキットを使用して迅速に実装

著者 Stephen Evanczuk 氏
Digi-Keyの北米担当編集者 提供
2020-02-11
マルツ掲載日:2020-05-18


 音声アシスタントは急速に進化して、あらゆるスマート製品の重要な機能になりました。現在のクラウドベースのソリューションの中で、AmazonのAlexa Voice Service(AVS)は支配的な音声アシスタントとして台頭し、Amazonのクラウドリソースを音声認識や自然言語処理に利用するターンキー機能を提供しています。

 しかしながら開発者には、AVSの性能要件と設計の複雑さが、コネクテッドホームやIoT向けのマイクロプロセッサを使用した小型デバイスで利用する上で大きな障壁となってきました。

 カスタムアプリケーションのためのドロップインソリューションやリファレンス設計として設計されたNXP Semiconductors社のキットは、特にリソース制約のあるデバイスに向けたAmazon AVS製品です。

 この記事では、NXP社が提供するすぐに使えるソリューションを利用して「Alexa Built-In」設計を迅速に実装する方法を紹介します。

AVSとは?

 10年前に登場して以来、音声アシスタント技術は急速に進歩し、スマートスピーカの成長市場がすでに米国人口の約1/3を占めていると、市場アナリストたちは推定しています。競合ソリューションの中で、AmazonのスマートスピーカであるEchoは支配的なシェアを獲得し、Amazon Web Services(AWS)の成功を活用してサードパーティ製Echoアプリ(スキル)をサポートするクラウドベースのリソースを提供しています。

 Alexa Skills Kit(ASK)と関連アプリケーションプログラミングインターフェース(API)を使うと、開発者は急速に拡大しつつあるEchoスマートスピーカのインストールベースを利用して自身のコネクテッドデバイスに一定レベルの音声制御を付加することができます。

 この手法により、「Alexaと連動する」スマートテレビやスマートサーモスタットなどのコネクテッド製品は、ユーザーの音声指示とAlexaクラウドから受信する関連ディレクティブに応答できます。図1はAVSの概要を示しており、その可能性を垣間見ることができます。

図1:Alexaアプリ(スキル)を作成すると、Amazon Echo製品を介してユーザーが発声したコマンドにコネクテッド製品を応答させることができます。(画像提供: Amazon Web Services)

Alexa Built-In設計

 「Alexaと連動する」製品に比べて「Alexa Built-In」のスマート製品は、Alexa音声対応デバイスとAWSリソースの間でよりシームレスで低遅延のインターフェースを実現します。これらの製品は、コネックテッドデバイスの設計にAVSを直接的に組み込んでいます。

 AVSをAWS IoT Coreプラットフォームと組み合わせて使用すると、ユーザーがAlexa搭載製品を使って音声コマンドによるコネックテッドデバイスの制御とそれらのデバイスから音声応答を受けることの両方ができる、洗練されたIoTアプリケーションを実装できます(図2)。

図2:Alexa搭載デバイスは、デバイス制御(上)やAWS IoT Coreを介してAmazon Web Servicesのリソースに接続したIoTデバイスからの通知受信(下)のための音声インターフェースをユーザーに提供します。(画像提供:Amazon Web Services)

 しかしながら以前は、この種のIoTアプリケーションの中心となるAlexa搭載デバイスの設計に多大な作業を要しました。クラウドベースのAlexaサービスを利用するには、デバイスがAndroidやLinuxのプラットフォームで動作するAVSデバイスソフトウェア開発キット(SDK)に含まれている多数のAVSサービスライブラリを実行して、ウェイクワードの検出、Alexaクラウドとの通信、サポート機能のためのディレクティブの処理を行うことが必要になります(図3)。

図3:AVS Device SDKのコンポーネントとそれらの間のデータの流れ。(画像提供:Amazon Web Services)

 サービスライブラリに対応するには、Alexa搭載デバイス設計に、通常、AVSの処理要求を満たすための高性能アプリケーションプロセッサと50MB以上のメモリが必要になります。さらにこうした設計では、雑音の多い環境から音声を抽出し、音声アシスタントデバイスに求められる非近接場の音声機能を備えるために必要な複雑なアルゴリズムを実行するため、しばしばデジタル信号プロセッサ(DSP)を組み込むことになります。

 そのため、実効性のあるAlexa搭載デバイスを構成するためのシステム要件は、通常、実用的なIoTデバイスに必要な程度のコストと複雑さをはるかに超えていました。

 しかし、AVS Integration for AWS IoT Coreのリリースによって、AmazonはAlexa Built-In製品の実装に必要なプロセッサのワークロードとメモリ容量を劇的に削減しました。このサービスにより、計算処理とメモリ容量の負荷の高い処理が、Alexa搭載デバイスからクラウドにある関連付けられた仮想デバイスに移されます(図4)。

図4:AVS for AWS IoT Coreはメモリと処理負荷の高いタスクをクラウドに移すため、リソース制約のあるIoTデバイスにAlexa音声アシスタント機能を実装することができます。(画像提供:Amazon Web Services)

 物理デバイスが担当する処理は、Alexaとのセキュアなメッセージ、信頼性の高い音声データの送受信、タスク管理、デバイス内やAlexaとの間のイベント通知など、より基本的なサービスを行うことに軽減されます。

 物理デバイスとAlexaの間におけるデータ、コマンド、通知の送信は効率の高いMQTT(MQ Telemetry Transport)メッセージングによって行われ、パブリッシュ-サブスクライブプロトコルであるMQTTの予約済みトピックを数個使用します。最後に、コンパニオン携帯アプリが、デバイス登録と、その他に必要なAlexa搭載デバイスとのあらゆるユーザーインタラクションのためにAlexaクラウドとやりとりします。

 AVS for AWS IoT Coreは重い処理をクラウドに移すことによって、組み込みシステム開発者にとって馴染み深いプラットフォームでAlexa Built-In製品を開発できるようにします。LinuxやAndroidで動作する50MBのメモリを搭載したアプリケーションプロセッサではなく、リアルタイムオペレーティングシステム(RTOS)が動作する、搭載RAMが1MB未満であまり高性能でないマイクロコントローラを使用しても、そのような設計を実装できるのです。

 実際、AVS for AWS IoT Coreを使用して構成されたAlexa搭載設計では、AVSサービス一式をローカルで実行させるように構成された設計に比べて部品点数の50%削減が達成できます。

 AVS for AWS IoT Coreはコスト効率のさらに良いランタイムプラットフォームをサポートしていますが、Alexa Built-In認定製品の実装は依然として複雑な仕事です。AVSとIoT Coreが初めての開発者は、セキュリティ、通信、アカウント管理、ユーザー体験(UX)設計、その他のためのAWS要件に取り組んでいく過程で習得に苦労するかもしれません。

 AWSのエコシステムに精通しているかどうかに関わらず、Alexa製品の開発者は誰でも、その設計がAmazon Alexa認定を取得するために大量の仕様や要件を満たすようにしなければなりません。

 NXP社が提供するAlexaのためのマイクロコントローラを利用したソリューションは、Amazon AVS for AWS IoT Coreのためのデバイス側のハードウェアとソフトウェアの要件を完全に実装するターンキーシステムソリューションです。

マイクロコントローラベースのAlexaソリューション

 NXP製マイクロコントローラi.MX RT106Aを中心として構成された、NXP社のAVSキットSLN-ALEXA-IOTは、すぐに使えるAWSコネクティビティ、AVS認定済み非近接場音声アルゴリズム、エコーキャンセル、Alexaウェイクワード機能、アプリケーションコードを備えています。

 Arm Cortex-M7コアをベースにした、本キットのi.MX RT106Aマイクロコントローラは、特にIoTエッジコンピューティング用に設計されたNXP社のクロスオーバープロセッサであるi.MX RT106xファミリの製品です。

 組み込み音声アプリケーション用に設計されたRT106Aは、NXP社のi.MX RT1060クロスオーバープロセッサファミリのベースアーキテクチャが備えている広範な周辺インターフェース一式、大容量内蔵メモリ、外部メモリオプション用のボードサポートに、専用機能を加えた製品です(図5)。

図5:NXP社のi.MX RT1060クロスオーバープロセッサファミリは、Arm Cortex-M7マイクロコントローラコアを周辺インターフェース一式、メモリ、IoTデバイスで通常必要なその他の機能と統合しています。(画像提供:NXP)

 i.MX RT106Aマイクロコントローラはその内蔵機能のおかげで、AVS for AWS IoT Coreの実装に必要なハードウェア基盤を提供するために、わずか数個の追加コンポーネントしか必要としません。

 SLN-ALEXA-IOTキットの場合、256メガビット(Mb)フラッシュメモリ、Murata Electronics社のLBEE5KL1DX Wi-Fi/Bluetoothトランシーバモジュール、Diodes社のAP2202K-3.3TRG1降圧コンバータを装備したシステムモジュールにi.MX RT106Aマイクロコントローラを搭載しています(図6)。

図6:NXP SLN-ALEXA-IOT AVSキットのシステムモジュールの設計は、NXP i.MX RT106Aマイクロコントローラを外部フラッシュとワイヤレストランシーバと統合するために必要なシンプルなハードウェアインターフェースを利用しています。(画像提供:NXP)

 このシステムモジュールを補完するSLN-ALEXA-IOTキットの音声ボードは、Knowles製パルス密度変調(PDM)MEMSマイクロフォンであるSPH0641LM4H-1を3個、PUI Audio製スピーカAS01808AO、NXP製クラスDオーディオアンプTFA9894Dを搭載しています。

 この音声ボードは、キットへの給電とパーソナルコンピュータからのシェルコンソール実行用のUSBタイプCコネクタに加えて、Ethernet用ヘッダ、シリアル周辺モジュール、i.MX RT106Aマイクロコントローラの汎用入出力(GPIO)を備えています。

 最後に、このボードは基本的な制御入力用のスイッチと、LEDの各色およびオンオフのサイクリングパターンを使用するAmazonのAVS UXアテンションシステム要件に準拠した視覚的フィードバック用のLEDを備えています。

 SLN-ALEXA-IOTのハードウェアは、そのシステムモジュールと音声ボードにより、AVS for AWS IoT Coreソフトウェアのデバイス側処理のための完結したプラットフォームです。しかしながら、上で述べたようにAlexa搭載IoTデバイスの設計は、ハードウェアと同じく最適化されたソフトウェアにも大きく依存しています。

 AmazonのAVS for AWS IoT APIを使ってそのようなソフトウェアをゼロから作成すると、必要なデータオブジェクトを作成して関連するプロトコルを実装する作業を行うため、プロジェクトが大幅に遅れる恐れがあります。

 開発者はAlexa Built-In認定を目的として、その設計におけるAlexaサービスとのユーザーインタラクションの各面に関わるAVS UXアテンションシステム、AWSセキュリティプラクティス、その他の要件に準拠しようとすることからもさらに遅れが発生する恐れもあります。

 NXP社は、これらの懸念事項に対してXIP(Execute-In-Place)フラッシュ、コネクティビティ、その他のハードウェアコンポーネントのソフトウェアドライバのレイヤを土台とするAmazon FreeRTOS上に構築した包括的なランタイム音声制御ソフトウェア環境で対応しています(図7)。

図7:Amazon FreeRTOS上に構築された、NXPの音声制御システム環境は、機械学習推論と音声フロントエンド処理のファームウェアルーチンを含む広範なミドルウェア一式を提供しています。(画像提供:NXP)

 このソフトウェア環境の音声処理機能の基礎をなしている、NXPのIntelligent Toolboxファームウェアは、音声信号の調整と最適化のための機械学習(ML)推論エンジンおよびML音声フロントエンドを含む最適化機能を提供します。他のミドルウェアサービスは、セキュアなコネクティビティ、AWS通信、音声機能をサポートします。

 この包括的なサービスレイヤの上で、AWS IoT Core、オンボーディング、その他のアプリケーション制御機能のためのソフトウェアが、AWS IoT OTAサービスとAmazon FreeRTOS OTAクライアントの上に構築された無線(OTA:Over-The-Air)アップデートをサポートする2段階ブートローダからの起動を取り持ちます。

 この環境で動作する出荷時インストール済みソフトウェアを使うと、NXP社のAWS IoT用デモアカウントを使用する完全なAlexa搭載アプリケーションを搭載したSLN-ALEXA-IOTハードウェアキットを即座に動作させることができます。

 NXP社のドキュメントには、本キットを動作させる方法、Wi-Fi認証情報のプロビジョニング、デモアカウントによるAWSデバイス認証の完了方法の詳細な手順が記載されています。この作業の中で、開発者はソフトウェア配布パッケージに含まれているAndroid携帯アプリを使って本キットとAWSでやりとりします。

 パッケージは、NXPサイトで各SLN-ALEXA-IOTキットに付属しているアクティベーションコードを使用して入手できます。簡単な数ステップの作業を済ませると、すぐにEchoスマートスピーカを使う場合と同種のAlexa音声インタラクションで本キットとやり取りを開始できます。

 Alexa機能を備えた製品の迅速な試作を行う場合、SLN-ALEXA-IOTキットや出荷時インストール済みソフトウェアはそのまま使えるプラットフォームです。それと同時に本キットのハードウェアとソフトウェアは、i.MX RT106AマイクロコントローラをベースにしたカスタムAlexa搭載設計作成用の迅速な開発プラットフォームになります。

カスタム開発

 i.MX RT106AをベースにしたAlexaソリューション用ソフトウェアは、製品のアクティベーション後、すぐに使えるソフトウェア配布パッケージに含まれているNXP MCU Alexa Voice IoT SDKを介して、NXP音声制御ランタイム環境の機能を活用します。

 NXP社によるEclipseベースのMCUXpresso統合開発環境(IDE)のアドオンとして設計されたこのSDKは、サンプルアプリケーション、ドライバ、ミドルウェアの全ソースコードとNXP Intelligent Toolbox、ML推論エンジン、ML音声フロントエンドなどの特殊ファームウェア機能のバイナリ配布物用ヘッダを合わせたものです。

 Alexa搭載製品を迅速にデプロイする必要のある開発者は、原則的に、完結したAlexaのデモアプリケーションに少しの変更を加えて利用することができます。最も簡単な場合、そうした変更は開発者が自分のセキュリティ認証情報を使ってアプリケーションを自分のAWSアカウント用にするだけです。NXP社は、この作業を完了する手順を説明しています。

 カスタム開発向けには、ソフトウェア配布物に含まれているサンプルアプリケーションがNXP MCU Alexa Voice IoT SDKの扱い方を示す実行可能サンプルになっています。いきなりAlexaの完全なデモアプリケーションに取りかかるのではなく、サンプルアプリケーションを探って、音声フロントエンド、Wi-FiおよびBluetoothコネクティビティ、ブートローディングなどの特定機能を重点的に調べることもできます。

 たとえば、音声フロントエンドのサンプルアプリケーションは、Amazon FreeRTOSのタスクを使用してウェイクワード検出を行う場合の基本的なデザインパターンの実例になっています。

 音声フロントエンドのサンプルアプリケーションの場合、メインルーチンが、ハードウェアとソフトウェアのサブシステムを初期化し、FreeRTOSのxTaskCreate関数でメインアプリケーションタスク(appTask)とコンソールシェルタスク(sln_shell_task)を開始して、FreeRTOSスケジューラに制御を渡す手順の実例になっています(リスト1)。(注:FreeRTOSスケジューラを起動するvTaskStartSchedulerの呼び出しは、スケジューラに十分なメモリがない場合、リターンするだけです)

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();
...
}
リスト1:NXP MCU Alexa Voice IoT SDKディストリビューションに含まれているサンプル音声フロントエンドアプリケーションは、基本的な必須の初期化処理と、メインアプリケーションタスクやコンソールシェルタスクのためのFreeRTOSタスク生成を実例で示しています。(コード提供:NXP)

 音声サブシステムを初期化した後、メインアプリケーションタスクであるappTaskは、2つのFreeRTOSタスクを順次開始します。一方のタスクは、音声入力を処理するサービスルーチンであるaudio_processing_taskを実行し、もう一方のタスクは、マイクロフォンPDM出力のパルス符号変調(PCM、Pulse-Code Modulation)への変換を処理します。その他の内部処理をした後、appTaskは永久ループに入ってウェイクワードを検出したことを知らせるRTOS通知を受けるべく待機します(リスト2)。

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;
    }
}
リスト2:サンプルの音声フロントエンドアプリケーションで、メインアプリケーションタスクのappTaskは、音声処理とマイクロフォンデータの変換を処理するタスクを開始し、ウェイクワードが検出された(kWakeWordDetected)というFreeRTOS通知(taskNotification)を受けるべく待機します。(コード提供:NXP)

 次に、このサンプルアプリケーションの音声処理タスクは、ウェイクワードファームウェア機能の初期化とウェイクワード検出パラメータの初期化を行った後、同じく永久ループに入って、処理済みマイクロフォンデータが利用可能になったことを知らせる、マイクロフォンデータ変換タスクからのFreeRTOS通知を受けるべく待機します。

 この時点で音声処理タスクは、Intelligent Toolboxのファームウェア関数の呼び出しによって音声データの処理と、ML推論エンジンを使用したウェイクワード検出を行います(リスト3)。

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);
        }
    }
}
リスト3:サンプルの音声フロントエンドアプリケーションでは、音声処理タスクがファームウェアのウェイクワードエンジンを初期化し、マイクロフォンデータが利用可能であるというFreeRTOS通知を受けるべく待機し、最後にXP Intelligent Toolboxのファームウェアアナログフロントエンド(SLN_Voice_Process_Audio)とウェイクワード検出用NML推論エンジン(SLN_AMAZON_WAKE_ProcessWakeWord)を呼び出します。(コード提供:NXP)

 ウェイクワードを検出すると、音声処理タスクはFreeRTOSタスク通知を発行してそのイベントをメインアプリケーションタスクであるappTaskに知らせます。appTaskは、その通知を受けるとすぐに青色LEDを点滅させます(再度リスト2参照)。

 フルAlexaサンプルアプリケーションは、シンプルな音声フロントエンドアプリケーションで説明したのと同じパターンに従いますが、基本コードベースでAlexaの全機能をサポートするように大幅に拡張されています。

 たとえば、AlexaサンプルアプリケーションでML推論エンジンがウェイクワードを検出すると、音声処理タスクはAlexaの処理シーケンスの各段階に関連付けられた一連のFreeRTOS通知を実行します(リスト4)。

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

}
リスト4:フルAlexaアプリケーションの場合、音声処理タスクは、Alexaシーケンスにおける後続の音声処理段階を管理する追加のコードにより、音声フロントエンドアプリケーションで実行される処理ステップを拡張しています。(コード提供:NXP)

 ローカルMLウェイクワード検出の後、フルAlexaアプリケーションの音声処理タスクは、上で説明したのと同様にメインアプリケーションタスクに通知します。加えて、ローカルで検出したウェイクワードを含んだ元のデータストリームを失うことなくAlexaクラウドでスピーチ処理するため、マイクロフォンを有効にしたまま全音声入力をキャプチャする場合の音声処理ステートも管理する必要があります。この全データストリームは、ウェイクワードの検証とさらなるスピーチ処理のためAlexaクラウドに渡されます。

 この処理シーケンスの各段階において、音声処理タスクは対応するFreeRTOS通知をメインアプリケーションタスクに対して発行します。音声処理タスクの場合と同様、フルAlexaアプリケーションでは、音声フロントエンドアプリケーションでシンプルな形で実現されたメインアプリケーションタスクのパターンが拡張されています。

 つまり、フルAlexaアプリケーションのメインアプリケーションタスクであるappTaskは、Alexaクラウドへの送信用とAmazon AVS UXアテンションシステム要件に準拠したキットLEDの管理用の両方のイベントを生成します。

 たとえば、ウェイクワード検出後にマイクロフォンを有効にしたままの場合、音声処理タスクはメインアプリケーションタスクに通知し、メインアプリケーションタスクが該当のUXアテンションステート(濃いシアン色のLEDインジケータ)を設定します(リスト5の黄色の強調部分と再度リスト4の対応する強調部分を参照)。

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;
        }
リスト5:フルAlexaアプリケーションでは、メインアプリケーションタスクがAlexa認定要件に準拠したLED照明の制御を含むAlexaの処理シーケンスをオーケストレートします。(コード提供:NXP)

 フルAlexaアプリケーションのメインルーチンでは、音声フロントエンドアプリケーションにシンプルな形で実装されているパターンも同様に拡張されています。この場合、メインアプリケーションは、さらに多くの初期化処理のためのタスクに加え、キットのボタンの処理、OTAアップデートをサポートするタスクなどのFreeRTOSタスクも生成します。

 これらのサンプルアプリケーションを土台にすることで、開発者は自信をもって自身のi.MX RT106Aベースの設計にNXP MCU Alexa Voice IoT SDKを使用したAlexa Built-In機能を実装することができます。

 この実行プラットフォームはAVS for AWS IoT Coreを最大限に活用しているため、開発者はますます高度化していくIoTアプリケーションの基盤における低コストでリソースの制約されるデバイスに、より広くAlexa搭載ソリューションをデプロイすることができます。

まとめ

 Amazon Alexa Voice Serviceによって、開発者がEchoスマートスピーカの急速な成長の原動力となっているのと同一の音声アシスタント機能を実装することが可能になりました。以前は、誰もが求めるAlexa Built-In認定を取得できる製品は、相当なローカルメモリと高性能な処理能力を備えた実行プラットフォームを必要としました。

 AVS for AWS IoT Coreを使用して製作されたNXP社のキットは、マイクロコントローラと関連ソフトウェア実行環境を使用した、Alexa Built-In機能に対するドロップインソリューションです。



免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、Digi-Key Electronicsの意見、信念および視点またはDigi-Key Electronicsの公式な方針を必ずしも反映するものではありません。

 

このページのコンテンツはDigi-Key社より提供されています。
英文でのオリジナルのコンテンツはDigi-Keyサイトでご確認いただけます。
   


Digi-Key社の全製品は 1個からマルツオンラインで購入できます

※製品カテゴリー総一覧はこちら



ODM、OEM、EMSで定期購入や量産をご検討のお客様へ【価格交渉OK】

毎月一定額をご購入予定のお客様や量産部品としてご検討されているお客様には、マルツ特別価格にてDigi-Key社製品を供給いたします。
条件に応じて、マルツオンライン表示価格よりもお安い価格をご提示できる場合がございます。
是非一度、マルツエレックにお見積もりをご用命ください。


ページトップへ