树莓派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)

这样改完了之后,再唤醒小白的时候她就会说:“在的呢”,而不是叮了。