snowboy+sherpa-onnx+Rasa+Coqui实现语音音箱【语音助手】

news2024/11/25 20:33:51

背景

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

合成中文拉长音的问题

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postgresql源码(111)dms框架进程信号发送与处理流程

信号处理整体流程 信号从bgworker发出后,主进程将ParallelMessagePending置为true,下次CHECK_FOR_INTERRUPTS()时,会进入信号处理逻辑中:HandleParallelMessages。进入信号处理逻辑后,首先遍历所有现存的ParallelCont…

护网专题简单介绍

护网专题简单介绍 一、护网红蓝队介绍1.1、网络安全大事件1.2、护网行动由来1.3、护网行动中的角色二、红队介绍2.1、红队所需技能2.2、红队攻击流程 三、蓝队介绍3.1、蓝队所需技能3.2、蓝队防守四阶段3.3、蓝队前期准备 四、常见安全厂商介绍4.1、常见安全厂商 五、常见安全产…

Softing工业获得自动化产品安全开发流程认证

Softing工业获得了TV Sd颁发的IEC 62443-4-1产品安全开发流程认证。 (IEC 62443-4-1认证确保网络安全) 截至2023年6月,位于德国哈尔和纽伦堡的工厂以及罗马尼亚克卢日的Softing工业研发部门已获得IEC 62443-4-1:2018标准的认证。该认证流程由…

Ajax-概念、Http协议、Ajax请求及其常见问题

Ajax Ajax概念Ajax优缺点HTTP协议请求报文响应报文 Ajax案例准备工作express基本使用创建一个服务器 发送AJAX请求GET请求POST请求JSON响应 Ajax请求出现的问题IE缓存问题Ajax请求超时与网络异常处理Ajax手动取消请求Ajax重复发送请求问题 Ajax概念 AJAX 全称为Asynchronous J…

《孙子兵法》快速概览,有哪些章节?趣讲《孙子兵法》【第2讲】

《孙子兵法》快速概览,有哪些章节?趣讲《孙子兵法》【第2讲】 《孙子兵法》十一家注是一个有名的版本,十一家注是曹操、杜牧等十一人注释,曹操是真正的军事家,是名副其实的大咖。总共三卷十三篇,比较难记住…

Unity 3D中使用tilemap创建关卡地图,瓦片间隙有漏缝

我们使用一张图片来作为Sprite图集,创建地形图: 运行后,会发现,瓦片之间似乎总是有间距。 检查了图片发现,并不是图片边界存在间隙。 最后发现问题是出在图片资源中的线性过滤属性值: 在设计界面就能够看…

【三维编辑】SPIn-NeRF:多视图分割与感知修复(CVPR 2023)

文章目录 摘要一、简介二、相关工作1.Image Inpainting2.NeRF 操作3. 背景: NeRF 知识 三、方法3.1.多视图分割3.1.1掩码初始化3.1.2基于nerf的分割 3.2.多视图 Inpainting3.2.1 RGB先验3.2.2深度先验3.2.3基于patch 的优化3.2.4掩码精炼 四、实验五、安装与代码讲解1.项目安装…

一篇文章看懂Apipost Mock功能怎么用

在接口开发过程中,Mock功能可以帮助开发者快速测试和验证接口的正确性和稳定性,以便快速迭代和修复问题。Apipost推出智能Mock功能,可以在智能期望中填写一些触发条件,开启后,Apipost会根据已设置的触发条件&#xff0…

Linux-GPIO 配置pull up、pull down、no pull

author daisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主 https://blog.csdn.net/qq_40715266?typeblog 系列基于RK3568的Linux驱动开发——GPIO知识点(一)_daisy.skye的博客-CSDN博客基于RK3568的Linux驱动开发—— GPIO知识点(二&#…

【H5】盘点HTML5新特性

html5总的来说比html4多了十个新特性,但其不支持ie8及ie8以下版本的浏览器 文章目录 一、语义标签二、增强型表单三、音频和视频四、Canvas绘图五、SVG绘图六、地理定位七、拖放API八、Web Worker九、Web Storage十、WebSocket 一、语义标签 html5语义标签&#x…

Maven的安装与配置(包含所有细节)

一、idea版本和maven配对 这里是很多新手都会遇到的大坑,一定要先将自己的idea版本和maven进行版本配配对。 Maven3.6.3版本兼容问题 注意:针对一些老项目 还是尽量采用 3.6.3版本,针对idea各个版本的兼容性就很兼容 IDEA 2022 兼容maven 3.8…

肠道重要菌属——埃希氏菌属 (Escherichia), 肠道炎症和生态失调相关

谷禾健康 —变形菌门 —γ变形菌纲 —肠杆菌目 —肠杆菌科 —埃希氏菌属 埃希氏菌属 (Escherichia),是一种常见的细菌。其中最著名的种是大肠杆菌(Escherichia coli),大肠杆菌是一种厌氧菌,通常生活在人和动物的肠道中…

echarts 日常设计感图表

饼图 pieChart(id) {const data {value:100,type:aaa}let angle 0; //角度,用来做简单的动画效果的let count echarts.init(document.getElementById(id));let option {title: [{text: "{a|" data.value "}{c|%}",x: "center"…

super父类 事物

一个没有事物的方法。 调用他的父类里有事物的方法。 无论this 和 super 都会让父类事物方法没有事物。 如果写了super.class 文件里面,就是super调用。 如果没写,就是this调用,坑爹 测试,把父类注入,事物才生效。

Redis——特性介绍与应用场景

Redis特性介绍 In-memory data structrues 众所周知,MySQL是一种关系型数据库,其通过表的结构存储数据,就类似于建立了一个excel表格来存储数据。但是像视频这类数据并不适合存储在关系型数据库中,因此存在非关系型数据库——通…

用例拆分情况考虑方案

文章目录 1、方案一方案概述方案分析(1) 把对应图商地图的逻辑给分离开(2) 要使用命令行的方式执行方法 2、方案二3、最终决定 1、方案一 方案概述 每个图商(GD、BD、自建)拆分成单独的类 把参数化的几个图商类别拆分成对应的图商类,在每个类…

服务器数据恢复-EXT3分区误删除邮件的数据恢复案例

服务器数据恢复环境: 一台服务器有一组由8块盘组建的RAID5阵列,EXT3文件系统。 服务器故障: 由于工作人员的误操作导致文件系统中的邮件丢失。用户需要恢复丢失的邮件数据。 服务器数据恢复过程: 1、将故障服务器中所有磁盘以只…

LabVIEW开发分段反射器测试台

LabVIEW开发分段反射器测试台 随着对太空的观察需求越来越远,而不是当前技术(如哈勃望远镜)所能达到的,有必要增加太空望远镜主镜的尺寸。但是,增加主镜像的大小时存在几个问题。随着反射镜尺寸的增加,制造…

车载开发能不能入?Android实属卷不动了

随着智能化的快速发展,车载开发成为了汽车行业中的一个重要领域。车载开发是指开发和设计车载系统中的软件和硬件,以实现车辆的智能化和互联化。在当前汽车行业竞争激烈的市场环境下,车载开发岗位具有广阔的发展前景。 随着人们对智能化的需…