背景
本系列主要目标初步完成一款智能音箱的基础功能,包括语音唤醒、语音识别(语音转文字)、处理用户请求(比如查天气等,主要通过rasa自己定义意图实现)、语音合成(文字转语音)功能。
coqui主要在项目中完成接收rasa响应的内容,根据文本内容生成语音(TTS)。
本文用到的一些安装包在snowboy那一篇的必要条件、和rasa的安装中已经完成了部分构建,coqui的api调用部分会把相关代码写到snowboy项目中,生成好语音文件后调用本机播放语音。
语音唤醒文章地址:
snowboy 自定义唤醒词 实现语音唤醒【语音助手】
sherpa-onnx文章地址:
snowboy+新一代kaldi(k2-fsa)sherpa-onnx实现离线语音识别【语音助手】
rasa文章地址:
snowboy+sherpa-onnx+Rasa实现聊天机器人【语音助手】
参考文章
coqui的github地址:
GitHub - coqui-ai/TTS: 🐸💬 - a deep learning toolkit for Text-to-Speech, battle-tested in research and production
实践
下载安装Coqui
仅使用他的语音合成功能
pip install TTS
正常情况下安装成功就能调用api使用合成功能了,由于网络等原因可能一次pip install并不能解决安装问题,本文的后半部分会列出安装过程中可能出现的错误及解决办法
下载coqui提供的模型
列出支持的模型
tts --list_models
目前我看到的只有一个中文模型
tts_models/zh-CN/baker/tacotron2-DDC-GST
接下来我们下载这个模型
tts --model_name tts_models/zh-CN/baker/tacotron2-DDC-GST --text "你好。"
这句话会下载模型并在当前文件夹下生成一个wav文件,不出意外会播放“你好”这句话。
然后我们可以再下载一个英文呢模型
tts_models/en/jenny/jenny,我随便选了一个模型
tts --model_name "tts_models/en/jenny/jenny" --text "hello"
这句话会下载模型并在当前文件夹下生成一个wav文件,不出意外会播放“hello”这句话。
现在我们就准备好了两个模型,能用他来合成中英文了,当然句子中不能有中英文混装的情况,出现中英文混装可以split生成一堆文件,拼接成一个整句话的wav,这个暂时不讨论。
集成到snowboy
coquitts.py
首先在snowboy示例中创建调用coqui api的py文件,用来接收文本,返回一个音频文件地址
cd /home/test/snowboy/examples/Python3/
touch coquitts.py
vim coquitts.py
from TTS.api import TTS
import time
# 判断中英文,其中正则完全匹配成功就是英文,否则按中文处理
# string 文本内容
# return True 英文;False 中文
def check_en_str(string):
import re
pattern = re.compile('^[A-Za-z0-9.,;:!?()_*\$"\'\s]+$')
if pattern.fullmatch(string):
return True
else:
return False
global ttsen, ttszh
# 初始化coqui tts
def init():
global ttsen, ttszh
ttsen = TTS(model_name="tts_models/en/jenny/jenny",progress_bar=False,gpu=False)
ttszh = TTS(model_name="tts_models/zh-CN/baker/tacotron2-DDC-GST", progress_bar=False, gpu=False)
# 语音合成(文本转语音)
# text 文本内容
# return 音频文件地址 or None
def tts(text):
if len(text)==0:
return None
try:
filename='tts' + str(int(time.time())) + '.wav'
if check_en_str(text):
global ttsen
ttsen.tts_to_file(text=text, file_path=filename)
else:
global ttszh
if text.endswith('。'):
ttszh.tts_to_file(text=text, file_path=filename)
else:
ttszh.tts_to_file(text=text+"。", file_path=filename)
return filename
except:
return None
修改保存之后,就可以通过dome.py调用了
demo.py
在rasa的demo.py上构建
vim demo.py
import snowboydecoder
import signal
import os
import offlinedecode
import rasabot
import coquitts
interrupted = False
def signal_handler(signal, frame):
global interrupted
interrupted = True
def interrupt_callback():
global interrupted
return interrupted
# 初始化语音识别
offlinedecode.init()
# 初始化语音合成
coquitts.init()
# 唤醒词模型文件
model = '../../model/hotword.pmdl'
# capture SIGINT signal, e.g., Ctrl+C
signal.signal(signal.SIGINT, signal_handler)
detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5)
print('Listening... Press Ctrl+C to exit')
# 录音之后的回调
# fname 音频文件路径
def audio_recorder_callback(fname):
text = offlinedecode.asr(fname)
# 打印识别内容
print(text)
# 问问rasa
resp = rasabot.ask(text)
print(resp)
# 语音合成
ttsfile = coquitts.tts(resp)
if ttsfile != None:
# 播放音频文件
snowboydecoder.play_audio_file(fname=ttsfile)
# 删除录音文件
if isinstance(fname, str) and os.path.exists(fname):
if os.path.isfile(fname):
os.remove(fname)
# main loop
detector.start(detected_callback=snowboydecoder.play_audio_file,
audio_recorder_callback=audio_recorder_callback,
interrupt_check=interrupt_callback,
sleep_time=0.03)
detector.terminate()
编辑完成保存,然后测试是否有识别成功
测试集成效果
cd /home/test/snowboy/examples/Python3/
python demo.py
成功之后会播放音频文件,然后删除本地录音文件。
过程中的问题处理
安装慢
pip install 直接安装可能会报connection相关错误,可以直接从pypi的包仓库下载指定版本的封装包
https://pypi.org/project/
比如下载gruut_lang_en-2.0.0这个版本
我们可以从网站中直接搜索gruut_lang_en-2.0.0
点击这个downloadfiles -> gruut_lang_en-2.0.0.tar.gz
下载之后直接运行 pip install gruut_lang_en-2.0.0.tar.gz
实现的效果和pip安装一样,只要慢都可以采取这种方式
依赖安装包
pip install nltk
pip install numba==0.57.0
apt-get install libmecab-dev
apt install libmecab2
pip install MeCab
pip install mecab-python3
mecab
如果出现mecab相关的错误,
比如/usr/local/etc/mecabrc文件没找到,
no such file or directory: /var/lib/mecab/dic/debian/dicrc
https://github.com/SamuraiT/mecab-python3/issues/51
pip install unidic-lite
blinker
apt-get remove blinker
sudo -H pip install --ignore-installed -U blinker
coqui模型问题
只要执行tts --model_name xxx模型,首次执行会在/root下创建模型文件夹,但是可能由于网络问题下载失败,第二次执行就直接报错了,需要手动删除模型文件夹,重新执行tts语句,模型文件夹地址
cd ~/.local/share/tts
rm -rf xxx
合成中文拉长音的问题
由于中文不是以中文句号“。”结尾的,在文本后添加句号即可