[模組] 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 下調用函數。
參考資料
[6] 測試的源代碼
[7] 專題研究 樂鑫 ESP32 影片
留言
我個人在測試的時候使用Nodemcu-32s編譯,但卻編譯錯誤,
可以的話,我想參考大大您的電路接線圖
我是使用Nodemcu-32s在IDE編譯,請問是使用參考資料6裡的兩個檔案壓縮,然後安裝zip程式庫嗎?
感謝您的回覆;
還再跟您請教,指令可以繼續使用原廠微雪範例的指令嗎?
因為編譯後,好像變成是裡面一些指令的問題。
誠摯希望您再次的回覆。
謝謝您~
然後將辨識的關鍵字透過 SPI 傳入到模組裡面,屬於新增關鍵字(指令)的動作
這個指令必須用漢語拼音定義在一個 struct 裡面。當模組開始辨識時,
便會比對關鍵字的指令是在 struct array 的第幾個,這就是辨識結果。