1. 概述
最近的項(xiàng)目中需要用到語(yǔ)音播報(bào),本來(lái)在電腦上好好的用百度生成mp3然后用pysound播放,但是板子沒(méi)有3.5mm的音頻接口呢,只能另辟他法。
音頻的輸出最后都是模擬量的輸出而已,要不板子能輸出模擬量,要不就是找一個(gè)芯片幫我輸出模擬量。如果想自己輸出模擬量,就只能用DA的gpio口。估計(jì)音頻數(shù)字轉(zhuǎn)模擬沒(méi)有我想的那么簡(jiǎn)單吧,網(wǎng)上根本連這樣想的都沒(méi)有;剩下的就只能選擇用訊飛芯片了,板子的串口輸出到訊飛,讓它合成語(yǔ)音模擬量并輸出到音響。
百度和google上的教程比較散也比較雜,沒(méi)有太多干貨,于是坑還是要自己踩,踩完的坑記錄好過(guò)程,以備后用。
2. 硬件實(shí)圖
先看看裝好的實(shí)物圖片,一個(gè)樹莓派(pi3),一個(gè)XFS5152CE的開(kāi)發(fā)板,一個(gè)手工音響。
板子的細(xì)節(jié)圖
訊飛芯片的接線圖
3. 接線圖
如上面表示的幾個(gè)接線點(diǎn)
- pi(左1)-->訊飛(2),pi(右3)-->訊飛(1),給訊飛的板子供電。
- pi(右4)-->訊飛(8),pi(右5)-->訊飛(10),串口的RXD<-->TXD是反接的,一邊發(fā)一邊接受。
- 訊飛4,6接口接入音響的正負(fù)音頻線,這個(gè)線序沒(méi)什么講究。
開(kāi)啟串口
硬件接好后,首先要開(kāi)啟樹莓派的串口。這里有個(gè)概論要清楚就是樹莓派的串口原來(lái)是給console用的,就是默認(rèn)我們可以用串口工具當(dāng)ssh來(lái)管理樹莓派。所以我們要關(guān)閉管理功能而但一般的串口做通信用。
關(guān)于這部分網(wǎng)上的教程也是什么都有,感覺(jué)現(xiàn)在抄襲的比較多,也不管對(duì)不對(duì)就發(fā)出來(lái),還是蠻坑的。下面是我自己的方法(特指樹莓派的pi3)
進(jìn)入首選項(xiàng)-->Raspberry Pi Configuration
-
關(guān)閉Interfaces里的Serial Console并開(kāi)啟Serial Port
串口 -
打開(kāi)
sudo nano /boot/config.txt
文件經(jīng)過(guò)上一步的配置在config.txt最后一行可以看到已經(jīng)添加了
enable_uart=1
在它的下面我們繼續(xù)加上
dtoverlay=pi3-miniuart-bt
sudo reboot
重啟后GPIO14和GPIO15就可以用來(lái)連接串口通信了
安裝工具
-
安裝minicom
Minicom是linux下一個(gè)非常輕便的串口調(diào)試工具,不過(guò)用法還是要學(xué)一下。因?yàn)檩p便,安裝就比較方便。
打開(kāi)終端,輸入安裝命令
sudo apt-get install minicom
安裝好后,配置端口
sudo minicom -s
進(jìn)入Serial port setup
Serial port setup
樹莓派的串口默認(rèn)名稱為ttyAMA0,所以修改為/dev/ttyAMA0
AMA0
回車,回車,再保存
save
退出minicom
exit
退出之后要重新以十六進(jìn)制方式打開(kāi)sudo minicom -H
-
使用echo發(fā)送數(shù)據(jù)
echo是linux的輸出命令如
echo hello
,echo也可以把數(shù)據(jù)輸入到設(shè)備,因?yàn)檫@里我們用的是十六進(jìn)制,所以用到echo的-e,-n參數(shù)。-e表示十六進(jìn)制,-n表示最后不會(huì)自動(dòng)加換行符。查看XFS5152CE的芯片開(kāi)發(fā)指南,最簡(jiǎn)單的就是查看一下芯片的當(dāng)前狀態(tài)了
狀態(tài)
在終端輸入,用十六進(jìn)制方式發(fā)送數(shù)據(jù)到ttyAMA0串口sudo echo -en "\xfd\x00\x01\x21" > \dev\ttyAMA0
回車后,可以發(fā)現(xiàn)minicom收到
4F
表示芯片處于空閑狀態(tài)再來(lái)一個(gè)語(yǔ)音播報(bào)的例子
soundsudo echo -en "\xfd\x00\x0a\x01\x00\xbf\xc6\xb4\xf3\xd1\xb6\xb7\xc9" > \dev\ttyAMA0
就可以聽(tīng)到動(dòng)聽(tīng)的科大訊飛的聲音了。
編寫代碼
有了上述的步驟之后,我們就可以動(dòng)手寫代碼了,人生苦短,只能選python啊:smile:
-
安裝串口包
這個(gè)估計(jì)也沒(méi)得選擇,我們只有一個(gè)包可以安裝
pip3 install pyserial
當(dāng)然也有教程說(shuō)可以這樣安裝,但如果上面的成功就沒(méi)有必要安裝下面的了
sudo apt-get install python3-serial
-
編寫代碼
直接給出代碼,隨便了點(diǎn),并沒(méi)有用class方法:smile:
import serial try: portx="/dev/ttyAMA0" bps=115200 timex=None ser=serial.Serial(portx, bps) result=ser.write(bytes.formhex("fd000a0100bfc6b4f3d1b6b7c9")) print("write len:", result) ser.close() except Exception as e: print("err:", e)
運(yùn)行效果
運(yùn)行享受最后的結(jié)果