大家好,我是阿樂。
今天教大家給LD3320語音識別模塊加上語音交互的功能。
上節課已經教大家將LD3320語音識別模塊使用起來了,但是使用的時候是我們單方面說出命令,機器識別後並沒有給我們一些視覺上或者聽覺上的應答反饋,總覺得缺少點什麼,所以今天我就教大家給語音識別模塊加上語音交互的功能,我們問一句,模塊答一句,這樣多有意思,這也使得這個機器更加人性化,實用性更強。
好的,介紹一下我們今天將會用到的新模塊,就是這個東西,下圖是實物圖:
模塊型號名稱是MP3-TF-16P,別看它體積不大,功能可是很強大的。簡單來說,它就是一個音樂播放器,可以用來播放U盤、TF卡、NOR FLASH裡的MP3、WAV、WMA格式的音頻文件,同時它也可以作為電腦的音效卡,用來播放電腦的聲音。它也可以作為讀卡器,通過USB連接電腦後就可以更新TF卡裡的內容,用來更新文件。還有更關鍵的一點是,它價格很便宜,幾塊錢的東西,很是值得我們入手來開發學習。
這個小東西能用來放音樂,放廣播,它不僅支持通過按鍵來選曲、調音量,還可以通過單片機來操作,這也就是說,我們可以通過編程,通過串口來發指令,指定它什麼時候放哪首歌曲,放多大的音量,中途插不插播廣告等,根本不用我們動手,程序上就解決了。這就很有靈性了,我們上節課學習了LD3320語音識別模塊,它識別到我們的指令後可以對IO口做一系列的操作,用來輸出高低電平或者從串口發送數據,我們這樣把它倆撮合到一起,這不就成了嘛,一個具有語音交互功能的語音識別系統就這樣誕生了。
來,先來看看這個小傢伙的這些引腳都有什麼作用。看圖:
它一共有16個腳,左上角為第一個腳,是模塊的電源輸入引腳,輸入電壓範圍是3.3-5V,建議用5V供電。
第二個腳是RX,是UART 串行數據輸入。
第三個腳是TX,是UART 串行數據輸出。
第四個腳是DAC_R,是音頻輸出右聲道,可驅動耳機或者輸出音頻信號給功放。
第五個腳是DAC_L,是音頻輸出左聲道。
第六個腳是SPK2,是接小喇叭+的,可以驅動小於3W的喇叭。
第七個腳是GND,接電源負極。
第八個腳是SPK1,是接小喇叭-的。
第九個腳是IO1,是觸發口,默認上一曲(長按音量-)。
第十個腳也是GND。
第十一個腳是IO2,也是觸發口,默認下一曲(長按音量+)。
第十二個腳是ADKEY1,AD口1,當觸發時是第一段(長按循環第一段)。
第十三個腳是ADKEY2,AD口2,當觸發時是第五段(長按循環第五段)。
第十四個腳是USB+,USB+ DP,接U盤或插電腦的USB口。
第十五個腳是USB-,USB- DM,接U盤或插電腦的USB口。
最後一個是BUSY引腳,它是播放指示,有音頻播放時是輸出低電平,沒有音頻播放時是輸出高電平。
好,到這一步我們要理一下思路啦,對於命令的傳輸我們通過串口來發送,當語音識別模塊識別到我們的命令後,讓它通過串口給這個MP3模塊發送一串指令,這MP3模塊接收到指令後,就播放相對應的MP3文件,這樣不就實現了系統對我們的應答了嘛。
比如我設置這個語音識別模塊的一級口令為「創客小秘」,我叫一聲「創客小秘」,語音識別模塊識別成功後就給MP3模塊發送一個指令,指定播放一個MP3文件,而這個文件的內容是「主人,我在」,這樣就完成了一個交互的過程。
好,先把硬體連接好,我畫了個簡單的電路圖:
左邊這個是語音識別模塊,右邊的是MP3模塊,它們電源正極和地都需要接,這個不用說,然後就是數據的傳輸了,通過串口來,它們的RX和TX交叉來接,RX接TX,TX接RX,這就完成了,很簡單。當然,如果我們還要去控制家電,那就像上節課一樣通過一個三極體控制繼電器就好了。我這裡增加了一路是用來控制這個小風扇的開與關的,IO口控制三極體,然後三極體直接控制風扇。
好,接下來講講怎樣生成我們需要的MP3文件,我們先設想一下對話的過程,簡單舉五個例子吧,第一句,就是我說出一級口令,我叫一聲「創客小秘」,語音識別模塊識別成功後回我一句「主人,我在」;
第二句,我說「打開繼電器」, 語音識別模塊識別成功後回我一句「好的」,同理,我說「關閉繼電器」回我「好的」。第三句,我說「打開風扇」,回我「已開風扇」。第四句,我說「關閉風扇」,回我「已關風扇」。第五句,我說「拜拜」,回我「主人再見,很高興為您服務!」
好,下一步就是生成MP3文件了,我們需要生成的MP3文件有:1、主人,我在;2、好的;3、已開風扇;4、已關風扇;5、主人再見,很高興為您服務!
生成這些MP3文件我用的軟體是朗讀女,我們只要輸入文字,它就會合成語音,選擇想要的發音人,然後就可以直接生成MP3文件啦,非常好用。當然還有其它軟體,比如靈雲朗讀軟體、TTS語音合成工具、訊飛快讀等,大家根據自己需要來選用。
好,我們生成這些MP3文件後,把它們拷貝到TF卡裡,然後把卡插到MP3播放模塊上就可以了。
到此為止,我們硬體上的準備已經就緒,接下來要做的就是要修改程序。到這一步要跟大家說一下控制這個MP3模塊播放的指令和格式。舉個例子,指定播放一個MP3文件的指令是這樣的:7E FF 06 03 00 00 01 FE F7 EF,很長吧,我們從語音模塊通過串口給MP3模塊發這一串東西,MP3模塊收到後就知道這是要播放第一個MP3文件了,在這裡簡單說一下每個字節表示的意思:7E是起始位,固定不變的,都要有它;FF這是這個模塊的版本信息,也是固定不變的;06,指的是從上一字節開始,到後面的字節個數,也就是說,從FF開始,到06 03 00 00 01為止,一共有六個字節。然後這個03在這裡,指的是指定曲目播放,也是固定不變的。00在這裡指的是不需要反饋信息,如果是01,就是要反饋信息,這裡的反饋信息指的是MP3播放模塊反饋給語音識別模塊的信息。到這個00 01,這裡指的是歌曲序號,00是數據高字節,01是數據低字節,低字節01在這裡表示的就是播放第一首歌曲。FE和F7指的是累加和校驗,是用來給數據查錯的,最後一位EF是結束位,當接收到這一位,就說明整個數據發送完畢了。在這裡可能大家聽得比較懵逼,它設置那麼複雜的指令是為了提高數據傳輸時的準確性,大家聽不懂也沒關係,懂得有這麼一回事就得了。在這裡我們要重點關注的是03 00 00 01這四個字節,代表的就是指定播放第一首歌曲,不需要信息反饋。
好,看下面的圖片,MP3模塊官方給出的例程,在這裡我只給大家簡單介紹3個函數,首先是這個串口發送函數,就是把我們上面的這一串東西發送出去的函數,你看它最先發送出去的是起始位的7E,然後通過一個自加循環,i++,按順序的把這一串數據全部發送出去,後面EF就是結束位了。
如下圖,往下這個是求和校驗函數,為什麼要這個函數呢,它是怕數據在傳輸的過程中出錯,經過這個函數處理,配合下一個要講的函數,它就知道這個數據在傳輸的過程有沒有出錯。舉個例子,比如原先我是想傳00010001這個數據,結果數據在傳輸的過程中受到幹擾,有一位數據受到影響由0變成1了,那在接收的那一端收到的數據可能就變成了00010011了,如果沒有校驗函數去校驗,接收端就無法判斷數據的準確性,這就很容易出現大問題,所以這個函數存在的意義就在這裡了。這個函數在這裡具體是怎麼校驗的就不深入給大家講了,解釋進去又是另一片天地了。
再看到下邊的圖片,圖片上面那個是Uart_SendCMD函數,我們一起結合下面main函數裡的操作來看,如下圖:
先看下面的main函數,在main函數裡首先初始化串口寄存器,然後執行Uart_SendCMD這個函數,這個函數的括號裡有3個數據,0x03指的是播放指定的MP3文件,中間的0指的是無需反饋,0x01指的是播放第一首歌曲,這三個數據會分別賦值給上面這個函數括號裡的CMD、feedback和dat,然後大家看到上邊Uart_SendCMD函數裡邊,CMD放畫紅色橫線1的位置,feedback放畫紅色橫線2的位置,dat放畫紅色橫線3的位置,而且這個dat分高字節和低字節的,這6個字節的數據是不是就是我們剛才講過的從FF開始到01的這6個,是了吧,然後進行校驗,最後就把這些數據通過串口給發送出去了。
好,我們需要做的就是把這3個函數複製粘貼到語音識別模塊的大程序中去,進行融合,如下圖:
然後我們在語音識別程序處理函數這裡加上我們想要播放的音樂就得了,還記得我們剛才生成的MP3文件嗎?我們按順序放到TF卡裡,第一首是「主人,我在」,第二首是「好的」,第三首是「已開風扇」,第四首是「已關風扇」,第五首是「主人再見,很高興為您服務」。
來啦,如下圖:
當我們說出一級口令,識別成功後我們就調用第一首音樂,把這個函數放過來,裡面三個數據就是0x03,0,0x01,0x01在這裡指的就是播放第一首歌曲嘛,就是播放「主人我在」。
好,然後下面,如下圖:
打開繼電器關閉繼電器都是調用「好的」這個MP3文件,那我們把這個函數放過來,裡面三個數據就是0x03,0,0x02。0x02在這裡指的就是播放第二首歌曲。
同理,看下面的圖片:
當我說出「打開風扇」時,調用的就是第三首歌曲,IO口給個高電平;當我說出「關閉風扇」時,調用的就是第四首歌曲,IO口給個低電平。
看上面的圖片,最後,當我說出拜拜時,IO口不用做任何操作,只發送串口數據,調用「主人再見,很高興為您服務!」這個MP3文件,一樣的,我們把這個函數放過來,裡面三個數據就是0x03,0,0x05,後面的這個0x05在這裡指的就是播放第五首歌曲。
好的,這就完成了編程的整個過程,我們將程序編譯下載,就完成了給語音識別模塊添加語音交互的這個功能,整個過程有點繁瑣,也有點難度,需要大家有一定的基礎,在這裡主要是給大家粗略看一下開發的大致框架與過程,給大家提供一個思路,大家也可以根據自己的需求加入更好的創意和想法,還是挺好玩的一個作品。
最後附上詳細視頻教程:
好的,本期視頻就講這麼多,後面再給這個語音控制系統加一個無線傳輸數據、無線控制的功能,比如在家裡,我想在一個房間通過語音識別,去控制另一個房間的燈的開關,那就需要一個無線模塊去完成通訊了,我們先做一對一的,看進度可以的話再做一對多,不斷完善豐富我們的系統。
本期教程就到這裡了,我們下期再見,拜拜。