树莓派python3.7语音助手开发笔记(3)
下面安装一些必要的Python库
#pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ rpi.gpio
这是树莓派和Python的接口库
#pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ requests
网络通讯,会做爬虫的也可以使用urllib.request
#pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pydub
这个是做音频转化的,因为在树莓派上使用playsound一类的库的时候出现了各种问题,具体的后面再说。
然后安装pyttsx3
这个库是我刚开始做识别的时候用的,发现他的语音合成的声音是真的。。。
但还是安装了这个库是我看中了它的持续运行的一个效果。
#pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pyttsx3
这个库在我开发期间官方进行了更新,但更新的最新版本有bug,会让Linux系统去安装MacOs的依赖库,然后就会报错
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-u0ufe8k_/pyobjc-framework-Security/
这就要我们去Pypi官网搜索pyttsx3并下载一个历史版本的轮子(whl文件),然后在进行安装(实测2.71可正常安装)
#pip3 install pyttsx3-2.71-py3-none-any.whl
最后是利用维纳滤波来将我们的声音做降噪处理的库(如果大家会MatLab的话,可以用MatLab做个脚本,再通过Python引用)
这个库是做降噪用的,原因是,这个助手我们要拿去参加比赛(本人现大一,如果有写的不好的地方,请多多指正),比赛会场很嘈杂,所以需要降噪,如果只是家里使用就无需降噪了。
这个库是别人开发的一个包,叫做nextpow2,和MatLab里的维纳滤波函数同名(传送门),将整个下载下来之后,将里面的enhance_speech单拉出来使用即可。
现在终于到开发的阶段了,首先要改下snowboy的回调函数,让它实现我们想要的功能。
这里呢我想把它叮的那一声替换成说一句话,这样听起来也比较顺耳一些。
import pyttsx3
from aip import AipSpeech
from pydub import AudioSegment
APP_IP = '你的APP_IP'
API_KEY = '你的API_KEY'
SECRET_KEY = '你的秘钥'
client = AipSpeech(APP_IP, API_KEY, SECRET_KEY)
#因为用的是百度的API所以需要去百度API平台注册并创建一个应用,获得API接口
def voice(text):#文字转语音函数
result = client.synthesis(text, 'zh', 1, {
"vol": 3,
"per": 0
}) #这里是给百度的一些参数,具体的还是参考下百度的技术文档
path = "/voices/botvoice" #这里需要到根目录下创建一个voices文件夹,单独存储这些音频文件
mp3_path = path + ".mp3"
wav_path = path + ".wav"
if not isinstance(result, dict):
with open(mp3_path, 'wb') as f: #这里要做一个转换,因为百度合成后的是mp3文件,直接保存wav文件播放的时候会出问题
f.write(result)
f.close()
sound = AudioSegment.from_mp3(mp3_path)
sound.export(wav_path, format="wav")
return wav_path #返回wav音频的绝对路径
然后定义我们自己的回调函数。
import os
import pyttsx3
engine = pyttsx3.init() #初始化engine
def own_callback():
os.system("aplay " + voice("在的呢")) #因为使用一些播放库的时候会出现各种各样的问题,所以这里直接选择ALSA播放
engine.runAndWait() #保持运行
#os.system("cd .. && python3 XiaoBai.py") #这个是后期开启我们的小白使用的
还有demo中的model改成自己的,这样就不用每次运行都要输下pmdl文件了
model = "xiaobai.pmdl"
然后将函数替换
#把下面detected_callback改成自己的
detector.start(detected_callback=own_callback,
interrupt_check=interrupt_callback,
sleep_time=0.03)
这样改完了之后,再唤醒小白的时候她就会说:“在的呢”,而不是叮了。
来源:CSDN
作者:CMChristel
链接:https://blog.csdn.net/CMChristel/article/details/104152166