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