1. 概述
最近的项目中需要用到语音播报,本来在电脑上好好的用百度生成mp3然后用pysound播放,但是板子没有3.5mm的音频接口呢,只能另辟他法。
音频的输出最后都是模拟量的输出而已,要不板子能输出模拟量,要不就是找一个芯片帮我输出模拟量。如果想自己输出模拟量,就只能用DA的gpio口。估计音频数字转模拟没有我想的那么简单吧,网上根本连这样想的都没有;剩下的就只能选择用讯飞芯片了,板子的串口输出到讯飞,让它合成语音模拟量并输出到音响。
百度和google上的教程比较散也比较杂,没有太多干货,于是坑还是要自己踩,踩完的坑记录好过程,以备后用。
2. 硬件实图
先看看装好的实物图片,一个树莓派(pi3),一个XFS5152CE的开发板,一个手工音响。
板子的细节图
讯飞芯片的接线图
3. 接线图
如上面表示的几个接线点
- pi(左1)-->讯飞(2),pi(右3)-->讯飞(1),给讯飞的板子供电。
- pi(右4)-->讯飞(8),pi(右5)-->讯飞(10),串口的RXD<-->TXD是反接的,一边发一边接受。
- 讯飞4,6接口接入音响的正负音频线,这个线序没什么讲究。
开启串口
硬件接好后,首先要开启树莓派的串口。这里有个概论要清楚就是树莓派的串口原来是给console用的,就是默认我们可以用串口工具当ssh来管理树莓派。所以我们要关闭管理功能而但一般的串口做通信用。
关于这部分网上的教程也是什么都有,感觉现在抄袭的比较多,也不管对不对就发出来,还是蛮坑的。下面是我自己的方法(特指树莓派的pi3)
进入首选项-->Raspberry Pi Configuration
-
关闭Interfaces里的Serial Console并开启Serial Port
-
打开
sudo nano /boot/config.txt
文件经过上一步的配置在config.txt最后一行可以看到已经添加了
enable_uart=1
在它的下面我们继续加上
dtoverlay=pi3-miniuart-bt
sudo reboot
重启后GPIO14和GPIO15就可以用来连接串口通信了
安装工具
-
安装minicom
Minicom是linux下一个非常轻便的串口调试工具,不过用法还是要学一下。因为轻便,安装就比较方便。
打开终端,输入安装命令
sudo apt-get install minicom
安装好后,配置端口
sudo minicom -s
进入Serial port setup
树莓派的串口默认名称为ttyAMA0,所以修改为/dev/ttyAMA0
回车,回车,再保存
退出minicom
退出之后要重新以十六进制方式打开sudo minicom -H
-
使用echo发送数据
echo是linux的输出命令如
echo hello
,echo也可以把数据输入到设备,因为这里我们用的是十六进制,所以用到echo的-e,-n参数。-e表示十六进制,-n表示最后不会自动加换行符。查看XFS5152CE的芯片开发指南,最简单的就是查看一下芯片的当前状态了
在终端输入,用十六进制方式发送数据到ttyAMA0串口sudo echo -en "\xfd\x00\x01\x21" > \dev\ttyAMA0
回车后,可以发现minicom收到
4F
表示芯片处于空闲状态再来一个语音播报的例子
sudo 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)
运行效果
运行享受最后的结果