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


實驗說明

        使用離線語音辨識晶片 LD3320,獲得辨識結果後透過 ESP32S 無線模組傳輸到另一塊無線模組上顯示出結果,如下圖一所示。

無線模組 ESP32

        無線模組 ESP 系列是上海樂鑫所開發,經由安信可二次開發後推廣,模組提供 AT command (UART) 的方式進行控制,但這種方式使用起來總是覺得隔了一層紗,有層距離感,操控上反應或速度不夠即時。幸運的是,隨著這塊模組的生態系越來越成熟,使用者也越多了,ESP 模組已經能像 Arduino 一樣,可以在 Arduino IDE 環境下開發編譯並下載,同時不少開發者也分享各類無線模組的案例,方便我們拿來參考 [1][2]。
        研究過程中,發現 ESP32S 上面的 FLASH 所屬的接腳不能直接拿來當作 GPIO 使用,因為這樣會影響到 IDE 燒錄,FLASH D0-D3 + CMD + SCK 正好對應到 GPIO 6-11,電路規劃時得避開使用這幾根 I/O。另外,這塊 ESP32S 模組有提供 3.3V 和 5V 輸出,正好 LCD_I2C 模組需要吃 5V 電壓,而語音辨識晶片吃 3.3V 電壓,能同時滿足開發的需求。
圖一:以無線傳輸語音辨識的結果

        ESP32S 是同時具有 WiFi 和藍芽功能的模組,實驗中,我們使用模組的藍芽傳輸功能,並參考範例中的 BluetoothSerial 程式,通訊的一端代碼是 Bluetooth Master,另一端為 Bluetooth Slave,下圖二是兩邊代碼的說明。將 Slave 端設定藍芽名稱 (ESP32-ASR) 後,等待 Master 來連接,在 Master 端則對名稱 (ESP32-ASR) 發出連線請求,接著雙方就會自動連接成功。

圖二:藍芽通訊雙方的原始碼

離線語音辨識

        LD3320 是十年前的語音辨識晶片 [3],主要辨識中文,已不是新鮮貨。它不需要連上雲端,只要設定好辨識的字句儲存到晶片的暫存器內,它就能進行離線辨識。優點是辨識過程很快,而且是不特定人的辨識方式,對於設定後的字句,其辨識準確率算不錯的 (在無噪音干擾環境下)。然而,其缺點是針對不特定語句的辨識,如果講了一段不是一開始設定給晶片的字句,晶片辨識後,通常會給出不正確的結果。比如,我們設定給晶片的字句是 "打開" "關閉"...之類,但是我們講了一句 "你好" 這類無關的字句,它可能會給出 "打開" 的結果,這可能會造成嚴重的操作。當然,現在已經有不少雲端的語音辨識服務,也許借助大公司的服務是更好的選擇。
        開發 LD3320 時,我們要把欲辨識的中文語句建立成表,再寫入晶片內,如下圖所示。C++ 語法的編譯過程不可能接受中文字,所以程式碼的中文語句是以漢語拼音為基準,每個語句則對應一個 ID 編號,晶片將辨識出的結果以編號方式告知我們,例如:"二十五" 和 "二五" 都代表數值 25,那我們就會將這兩個語句定義同一個 ID 編號。
圖三:建立辨識的語句表

        將 LD3320 驅動程式寫在 ESP32S 模組上,測試的結果錄製成底下影片,請參考。說完一句話後,辨識的結果很快地顯示在 LCD 模組上。

        在 Arduino IDE 環境,我自己移植原廠提供的範例程式碼 (給51晶片使用的),先把源代碼移植到 STM32 晶片上,驗證功能都可以正常運作後,才興起移植到 ESP32 的念頭。不過有個小問題,要把源代碼的 C 語言改寫成 C++ class 的方式 [6],這樣才能方便在 Arduino IDE 下調用函數。

參考資料

留言

匿名說…
請問大大您是如何將ESP32S 與LD3320 連接在一起的?
我個人在測試的時候使用Nodemcu-32s編譯,但卻編譯錯誤,
可以的話,我想參考大大您的電路接線圖
漢亞科技說…
雙方都採用SPI介面相連接,購買具有SPI介面的LD3320模組。
匿名說…
您好
我是使用Nodemcu-32s在IDE編譯,請問是使用參考資料6裡的兩個檔案壓縮,然後安裝zip程式庫嗎?
漢亞科技說…
zip 裡面的 .C 和 .h 放到 Arduino IDE 環境下編譯
匿名說…
您好
感謝您的回覆;
還再跟您請教,指令可以繼續使用原廠微雪範例的指令嗎?
因為編譯後,好像變成是裡面一些指令的問題。
誠摯希望您再次的回覆。
謝謝您~
漢亞科技說…
透過 SPI 方式控制模組的各個暫存器
然後將辨識的關鍵字透過 SPI 傳入到模組裡面,屬於新增關鍵字(指令)的動作
這個指令必須用漢語拼音定義在一個 struct 裡面。當模組開始辨識時,
便會比對關鍵字的指令是在 struct array 的第幾個,這就是辨識結果。
匿名說…
感謝您的回覆

此網誌的熱門文章

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

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

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

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

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

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