背景

本系列主要目标初步完成一款智能音箱的基础功能,包括语音唤醒、语音识别(语音转文字)、处理用户请求(比如查天气等,主要通过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

合成中文拉长音的问题

由于中文不是以中文句号“。”结尾的,在文本后添加句号即可

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐