出處:RT-Thread
作者:王胖胖
應用方案說明及使用場景描述:
本方案通過N32G457+RT-Thread,實現一個家庭語音助手,提供語音喚醒、多路開關、倒計時、鬧鐘提醒、天氣提醒、新聞播報、音樂播放等功能,為家庭生活增添便利和趣味性。
具體實現功能如下:
1.一鍵配網(未實現)
2.特定喚醒詞喚醒
3.語音控制多路開關
4.語音設置倒計時
5.語音設置鬧鐘(未實現)
6.語音播報天氣提醒
7.語音播報新聞
8.語音控制音樂播放
硬件平臺
N32G45XVL-STB開發板
軟件平臺
RT-Thread 4.0.4
RT-Thread Studio
功能模塊
ADC
Timer
msh
Serial
pyaudio
pyserial
百度實時語音識別realtime-asr
百度語音合成tts
全家福
初步方案
語音識別是本項目的核心,一般有語音識別模塊、在線語音識別、離線語音識別等三種方案。一開始覺得語音識別模塊、在線語音識別沒有技術含量,離線語音識別才能最大限度的發揮開發板的性能。于是春節期間查閱了不少離線語音識別的資料,最終確定了MFCC+DTW的離線語音識別方案。節后事情比較多,中斷了很長時間。等再拾起來的時候,發現沒有想象中那么簡單,像FFT/DCT等DSP運算不是新手能輕易搞定的。距離截稿時間已經沒幾天了,無奈只能選擇降級方案。
降級方案
降級后的方案是使用ADC采樣音頻信號,交由上位機(或ESP8266)進行在線語音識別。ADC進行了配置之后,給VREF接上3.3V,測試正常??蓡栴}還是出現了,首先是自制的音頻放大電路的放大能力不足,遠達不到3.3v的上限,導致采樣精度不足;其次是音頻采樣需要8k的采樣速率,也就是125us采樣一次,而系統定時器最小周期默認是10ms,就算配置成1ms也是不能滿足需求的。文檔里的高精度定時器還需要進一步研究,無奈只能再次降級。
再次降級
復制
def process_instruct(instruct):
"""
處理語音指令
"""
instruct = str(instruct).replace("。", "").replace("?", "")
cmd = ""
voice = ""
match instruct:
case "小白小白":
cmd = "mini_rgb up"
voices = "在呢|嗯|爺爺在此".split("|")
random.shuffle(voices)
voice = voices[0]
case "打開紅燈":
cmd = "light_control red on"
voice = "紅燈已打開"
case "關閉紅燈":
cmd = "light_control red off"
voice = "紅燈已關閉"
case "打開綠燈":
cmd = "light_control green on"
voice = "綠燈已打開"
case "關閉綠燈":
cmd = "light_control green off"
voice = "綠燈已關閉"
case "打開藍燈":
cmd = "light_control blue on"
voice = "藍燈已打開"
case "關閉藍燈":
cmd = "light_control blue off"
voice = "藍燈已關閉"
case "天氣":
cmd = "mini_rgb up"
voice = "有你的每一天都是晴天"
case "幾點了":
cmd = "mini_rgb up"
now = time.strftime("%Y年%m月%d日%H點%M分%S秒", time.localtime())
voice = "現在是" + now
case "早上好":
cmd = "mini_rgb up"
voice = "morning"
case "我想聽歌":
cmd = "mini_rgb up"
voice = "一閃一閃亮晶晶,滿天都是小星星"
case "倒計時五秒鐘":
cmd = "count_down 5"
voice = "已為您設置好倒計時"
case "新聞":
cmd = "mini_rgb up"
voice = "【一眼新聞丨3月16日貝果財經早間資訊】中國塞爾維亞駕*互認正式生效;106班上海入境國際航班將更改入境點;鄧倫偷逃稅被處罰并追繳1.06億元;最高法明確電商不得以拆封為由拒絕退貨;茅臺回應潘長江直播事件;白俄羅斯和俄羅斯將在能源交易中放棄使用美元;英國將取消所有新冠疫情旅行限制措施;韓國開發全球首個可拉伸無失真元顯示技術;美國航天局證實:美航天員將乘俄飛船返回......"
case "再見":
cmd = "mini_rgb down"
voice = "再見"
case _:
cmd = "mini_rgb down"
voices = "不知道你說了什么|不懂".split("|")
random.shuffle(voices)
voice = voices[0]
if cmd != "":
logger.info('cmd:'+cmd)
cmd = cmd + "\n"
cmd = cmd.encode("ascii")
n32_serial.write(cmd)
if voice != "":
tts_file = tts(voice)
if tts_file != "":
play_audio(tts_file)
再次降級后,使用上位機通過pyaudio進行音頻錄制,語音片段通過websocket上傳至百度實時語音接口進行語音識別,返回的結果轉換為指令通過pyserial寫入開發板,觸發對應動作,同時通過百度語音合成tts生成對應語音回復,通過pyaudio播放?;緦崿F了前期預定目標。
總結
由于是第一個硬件項目,經驗有限加上知識儲備不足,一開始的想法并沒有完全實現出來,只能一再降級,好在也不辱使命,完成了作品。后期我會繼續完善這個項目,把離線語音識別方案實現出來,真正發揮這塊開發板的價值!
bilibili:https://gitee.com/grinow/home-voice-assistant
gitee:https://www.bilibili.com/video/BV1gU4y1o7XJ/
-
單片機
+關注
關注
6008文章
44062瀏覽量
622642 -
語音識別
+關注
關注
38文章
1650瀏覽量
111896 -
RT-Thread
+關注
關注
31文章
1176瀏覽量
38993 -
語音助手
+關注
關注
7文章
229瀏覽量
26675 -
N32G457
+關注
關注
0文章
16瀏覽量
854
發布評論請先 登錄
相關推薦
評論