1. 概述
最近的項目中需要用到語音播報,本來在電腦上好好的用百度生成mp3然后用pysound播放,但是板子沒有3.5mm的音頻接口呢,只能另辟他法。
音頻的輸出最后都是模擬量的輸出而已,要不板子能輸出模擬量,要不就是找一個芯片幫我輸出模擬量。如果想自己輸出模擬量,就只能用DA的gpio口。估計音頻數(shù)字轉模擬沒有我想的那么簡單吧,網上根本連這樣想的都沒有;剩下的就只能選擇用訊飛芯片了,板子的串口輸出到訊飛,讓它合成語音模擬量并輸出到音響。
百度和google上的教程比較散也比較雜,沒有太多干貨,于是坑還是要自己踩,踩完的坑記錄好過程,以備后用。
2. 硬件實圖
先看看裝好的實物圖片,一個樹莓派(pi3),一個XFS5152CE的開發(fā)板,一個手工音響。

板子的細節(jié)圖

訊飛芯片的接線圖

3. 接線圖

如上面表示的幾個接線點
- pi(左1)-->訊飛(2),pi(右3)-->訊飛(1),給訊飛的板子供電。
- pi(右4)-->訊飛(8),pi(右5)-->訊飛(10),串口的RXD<-->TXD是反接的,一邊發(fā)一邊接受。
- 訊飛4,6接口接入音響的正負音頻線,這個線序沒什么講究。
開啟串口
硬件接好后,首先要開啟樹莓派的串口。這里有個概論要清楚就是樹莓派的串口原來是給console用的,就是默認我們可以用串口工具當ssh來管理樹莓派。所以我們要關閉管理功能而但一般的串口做通信用。
關于這部分網上的教程也是什么都有,感覺現(xiàn)在抄襲的比較多,也不管對不對就發(fā)出來,還是蠻坑的。下面是我自己的方法(特指樹莓派的pi3)
進入首選項-->Raspberry Pi Configuration
-
關閉Interfaces里的Serial Console并開啟Serial Port
串口 -
打開
sudo nano /boot/config.txt文件經過上一步的配置在config.txt最后一行可以看到已經添加了
enable_uart=1在它的下面我們繼續(xù)加上
dtoverlay=pi3-miniuart-btsudo reboot重啟后GPIO14和GPIO15就可以用來連接串口通信了
安裝工具
-
安裝minicom
Minicom是linux下一個非常輕便的串口調試工具,不過用法還是要學一下。因為輕便,安裝就比較方便。
打開終端,輸入安裝命令
sudo apt-get install minicom安裝好后,配置端口
sudo minicom -s進入Serial port setup
Serial port setup
樹莓派的串口默認名稱為ttyAMA0,所以修改為/dev/ttyAMA0
AMA0
回車,回車,再保存
save
退出minicom
exit
退出之后要重新以十六進制方式打開sudo minicom -H -
使用echo發(fā)送數(shù)據(jù)
echo是linux的輸出命令如
echo hello,echo也可以把數(shù)據(jù)輸入到設備,因為這里我們用的是十六進制,所以用到echo的-e,-n參數(shù)。-e表示十六進制,-n表示最后不會自動加換行符。查看XFS5152CE的芯片開發(fā)指南,最簡單的就是查看一下芯片的當前狀態(tài)了
狀態(tài)
在終端輸入,用十六進制方式發(fā)送數(shù)據(jù)到ttyAMA0串口sudo echo -en "\xfd\x00\x01\x21" > \dev\ttyAMA0回車后,可以發(fā)現(xiàn)minicom收到
4F表示芯片處于空閑狀態(tài)再來一個語音播報的例子
soundsudo echo -en "\xfd\x00\x0a\x01\x00\xbf\xc6\xb4\xf3\xd1\xb6\xb7\xc9" > \dev\ttyAMA0就可以聽到動聽的科大訊飛的聲音了。
編寫代碼
有了上述的步驟之后,我們就可以動手寫代碼了,人生苦短,只能選python啊:smile:
-
安裝串口包
這個估計也沒得選擇,我們只有一個包可以安裝
pip3 install pyserial當然也有教程說可以這樣安裝,但如果上面的成功就沒有必要安裝下面的了
sudo apt-get install python3-serial
-
編寫代碼
直接給出代碼,隨便了點,并沒有用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)
運行效果
運行享受最后的結果








