智慧音箱 (Smart speaker) on Filogic 130A Kit

        聯發科在2021年發表 MT7931 / MT7933 晶片,高度集成了無線網路藍芽語音處理於單晶片上,再提供一塊開發板(Filogic 130/130A)做為設計評估之用。先前,我們已經研究開發工具和 SDK 一段時間,並且將操作紀錄成教學影片,請參考聯發科 Filogic 130A(MT7933) 教學影片 https://han-ya.blogspot.com/2022/03/mt7933.html,分享給後進的開發人員,以縮短摸索的時間。目前,在這個平台的應用方面,智慧音箱或智能語音助手(Voice Assistant)是解決方案之一,本文將介紹如何在該平台實現智慧音箱這個應用,其影片可參考底下的連結。



系統介紹

        下圖一是 Filogic 130A 開發板的方塊示意圖,中心是一顆 MT7933 晶片核心,其包含兩個處理器,一個是 ARM Cortex M33 核心,另一個是 DSP 核心。M33 的工作負責周邊的 I/O 介面,如:SPI / I2C / ADC / UART / SDIO...等通訊介面,而 DSP 負責語音的處理,比如:play / record / VAD / AEC...等。這兩個內部的核心處理器之間有一套通訊的介面,名為 IPI (Internal Process Interface),做為兩邊的命令、event、回應...的溝通橋樑。

        做為智慧音箱的解決方案,在喇叭播放的部分,可以提供雙聲道的聲音輸出。在麥克風的部分,可以接兩路音源的輸入,具有陣列的效果 (far-end / near-end)。因此,喇叭與麥克風之間所產生的回音,這顆晶片的 DSP 能藉由 AEC (Acoustic Echo Canceling) 運算來消除,再者,VAD (Voice Activity Detection) 的算法能分辨出音源是屬於環境噪音或是來自人聲,最後才能進行語音識別 ASR (Acoustic Speech Recognition) 的運算。ASR 計算後的結果,如果偵測到符合預設的指令集,則將結果傳遞給 ARM Cortex 處理,ARM 便會控制周邊 I/O 的動作,完成智能化的行為。
圖一:Filogic 130A 開發板的方塊圖

SDK 函數

        在 SDK 裡,原廠提供了智慧音箱所需要的程式碼和函數,下圖二所示就是相關檔案所放的路徑,主要是 va.c 和 va_golden_tone.c。但是,在啟動 VA 函數之後,我們要先啟動 DSP 模組,其調用的函數及其參數,如下:
            //// Enable ADSP
                 value[0] = 1;     // 參數 1: enable, 0: disable
            control_cset("ADSP_Enable", 1, value);

圖二:SDK 所提供的智慧音箱程式碼

再來,需要啟動 VA 模組及其參數,如下:
            argv[0] = param1;    // 參數 "-v"
            argv[1] = param2;    // 參數 "1"
            va_main(2, argv);

上述的兩個動作運行後,系統便會進入智慧音箱的語音識別模式。在 va.c 中,定義了喚醒的關鍵字和指令,目前喚醒詞為 "hey siri",而指令則有 play music、stop music、next song、previous song...等。

系統整合

        當完成上面的 VA 模組後,我們可以開發晶片的周邊 I/O 介面,並將各項功能整合起來。介面可以參考先前的教學影片,從 SD 卡的 FAT 管理系統中讀取音檔,再呼叫 tinyPCM 函數庫,根據音檔的 wave header 格式,載入正確的參數到 snd_pcm_hw_params( ) 函數裡,接著依照指令來播放音檔,或停止音樂....等動作。

留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[筆記] Visual Studio 遠端偵錯的設定步驟

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

[應用] 藍芽 BLE client/server 架構:BLE remote controller

[模組] LD3320 離線語音辨識晶片與 ESP32 無線傳輸