构建简单的智能客服系统(三)——基于 UniMRCP 实现讯飞 TTS MRCP Server
上一篇我们封装了科大讯飞接口实现了 UniMRCP ASR Plugin,这篇文章我们再简单说一下 TTS 的实现。
MRCP plugin
以下内容请参考《基于 UniMRCP 实现讯飞 ASR MRCP Server》:
- UniMRCP 的编译、安装运行
- UniMRCP plugin 的加载、调用流程
- UniMRCP plugin 的新建
- 讯飞 SDK 的导入
调用讯飞 API 实现 plugin
引用头文件
1 2 3 4 5 6 7 8 9 |
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h>#include "qtts.h" #include "msp_cmn.h" #include "msp_errors.h" #include "mpf_buffer.h" |
channel 新增变量
新增 buffer 用于存放 TTS 转化后的语音:
1 2 3 4 |
struct xfyun_synth_channel_t { ...mpf_buffer_t *audio_buffer; } |
讯飞 login
因为编写 ASR plugin 的时候我们已经调用过,这里可以省略。
语音合成
跟 ASR 不同,TTS 的请求一下子就发送过来,没有一个长时间处理语音流的过程。所以我们把 session 的创建销毁直接放在一个处理过程中即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
static apt_bool_t xfyun_synth_text_to_speech(const char* src_text, const char* params, mpf_buffer_t *buffer) {int ret = -1;const char* sessionID = NULL;int synth_status = MSP_TTS_FLAG_STILL_HAVE_DATA;unsigned int audio_len = 0;sessionID = QTTSSessionBegin(params, &ret);if (MSP_SUCCESS != ret){apt_log(APT_LOG_MARK, APT_PRIO_WARNING,"[xfyun] QTTSSessionBegin failed, error code: %d.", ret);return FALSE;}ret = QTTSTextPut(sessionID, src_text, (unsigned int)strlen(src_text), NULL);if (MSP_SUCCESS != ret){apt_log(APT_LOG_MARK, APT_PRIO_WARNING,"[xfyun] QTTSTextPut failed, error code: %d.",ret);QTTSSessionEnd(sessionID, "TextPutError");return FALSE;}apt_log(APT_LOG_MARK, APT_PRIO_WARNING,"[xfyun] 正在合成 ...");while (1) {/* 获取合成音频 */const void* data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);if (MSP_SUCCESS != ret)break;if (NULL != data){mpf_buffer_audio_write(buffer, data, audio_len);}if (MSP_TTS_FLAG_DATA_END == synth_status)break;usleep(150*1000); //防止频繁占用CPU}if (MSP_SUCCESS != ret){apt_log(APT_LOG_MARK, APT_PRIO_WARNING,"[xfyun] QTTSAudioGet failed, error code: %d.",ret);QTTSSessionEnd(sessionID, "AudioGetError");return FALSE;}/* 合成完毕 */ret = QTTSSessionEnd(sessionID, "Normal");if (MSP_SUCCESS != ret){apt_log(APT_LOG_MARK, APT_PRIO_WARNING,"[xfyun] QTTSSessionEnd failed, error code: %d.",ret);return FALSE;}return TRUE; } |
xfyun_synth_channel_request_dispatch
处理 SYNTHESIZER_SPEAK 消息时调用转换接口。转换完成后,调用如下接口触发媒体流事件:
1 |
mpf_buffer_event_write(synth_channel->audio_buffer, MEDIA_FRAME_TYPE_EVENT); |
传递语音流
xfyun_synth_stream_read
中读取 audio_buffer 中的语音流发送给客户端:
1 2 3 4 5 6 |
static apt_bool_t xfyun_synth_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *frame) { ...mpf_buffer_frame_read(synth_channel->audio_buffer,frame); ... } |
修改配置文件
重新编译安装后,我们还需要修改配置文件,使用我们自己的 engine。编辑conf/unimrcpserver.xml
文件,启用我们自己的 engine:
1 2 |
<engine id="Demo-Synth-1" name="demosynth" enable="false"/> <engine id="XFyun-Synth-1" name="xfyunsynth" enable="true"/> |
运行后就可以看到 xfyunsynth 被加载了。
源码
GitHub:MRCP-Plugin-Demo,该 Demo 只是实现基本流程,还有很多可以完善的地方,如处理 synth 请求的参数。
Q&A
UniMRCP Custom Development Q&A
构建简单的智能客服系统(三)——基于 UniMRCP 实现讯飞 TTS MRCP Server相关推荐
- 构建简单的智能客服系统(二)——基于 UniMRCP 实现讯飞 ASR MRCP Server
通过实现 UniMRCP 的 plugin,我们可以封装讯飞.百度.阿里等厂家的 ASR 接口,实现我们自己的 MRCP 服务器. 什是 MRCP 媒体资源控制协议(Media Resource Co ...
- 春松客服:通过开源加云原生模式,大规模交付智能客服系统 | Chatopera
什么是智能客服系统 客服系统可以说,在 20 世纪六十年代,就成为现代企业的基础了,美国贝尔实验室最早研发商用计算机,就是为了实现在呼叫中心自动化的调度电话网络的接线,也就是说,是客服系统的高强度的作 ...
- 从0进入智能客服系统
我们会产生一个想法:能不能有一个机器人来回答这些重复的问题,它能 24 小时的工作不用休息,降低客户成本,还能挖掘聊天记录里面的一些有价值的知识点.这就是智能客服产生的背景. 1. 智能客服系统 智能 ...
- 海底捞 如何打造全渠道+全场景的智能客服系统?
选型宝直播访谈:海底捞 如何打造全渠道+全场景的智能客服系统? 01 直播简介 说起客服系统,大家可能会首先想到呼叫中心(Call Center),想到那些熟悉的客服号码:10086.95588.12 ...
- 瓜子二手车封宇:瓜子IM智能客服系统数据架构设计
本文根据封宇在2018年10月18日[第十届中国系统架构师大会(SACC2018)]现场演讲内容整理而成. 讲师介绍: 封宇,瓜子二手车高级技术专家,中国计算机学会专业会员.2017年2月入职瓜子二手 ...
- 瓜子IM智能客服系统的数据架构设计(整理自现场演讲)
本文由ITPub根据封宇在[第十届中国系统架构师大会(SACC2018)]现场演讲内容整理而成. 1.引言 瓜子业务重线下,用户网上看车.预约到店.成交等许多环节都发生在线下.瓜子IM智能客服系统的目 ...
- python 使用gensim和pickle包,模拟智能客服系统
开发环境 mac + python3.6.3 思路讲解 现在一些智能客服系统,号称是机器人客服,其实也就是事先训练好了一些对话模型,从而看起来更精准智能,看着也高大上一些.其实可以分为三个部分: 1. ...
- 为什么越来越多的企业选择智能客服系统?
现在智能客服系统越来越普遍,但是大部分的企业在配备智能客服系统的同时也会配置人工客服.因为目前为止,智能客服并不可以完全取代人工客服.智能客服系统之所以能够受到众多企业的青睐,主要是存在以下几点原因: ...
- 一个智能客服系统的设计思路
一.目标 随着移动互联网发展,许多线下服务都搬到了网络平台上,人们也越来越习惯于通过互联网来获得服务,这大大节省了时间,提高了办事效率.但线上服务面向的用户群体大,同类问题多,这就要求互联网平台提高服 ...
- Live800:全渠道智能客服系统,助力企业打造全渠道客户中心
在新消费环境下,用户移动化.在线化是一个不可逆转的趋势,如何与客户建立连接.增强接触点,成为企业的核心竞争力.企业的价值有多大?发展潜力有多大?取决于企业所能连接客户的数量及强度,这是对以往产品销量的 ...
最新文章
- python官方网站地址-index
- 通过angular.js实现MVC的基本步骤
- 每周「Paper + Code」清单:句子嵌入,文本表示,图像风格转换
- 如何在Bash脚本中将Heredoc写入文件?
- ios tabbar中间凸起_移动端开发基础【21】tabBar 配置
- 游戏中的数学:向量数学(vector math)
- 一款秒杀wireshark和burpsuite的国产网络分析神器,你还没用过?
- 【机器学习】:朴素贝叶斯
- python 百度ai json解析_百度AI接口调用
- 微信oa服务器,微信oa系统是什么?微信如何与oa系统进行结合?
- 【手把手教你如何从Tushare库下载股票数据,并保存在硬盘当中,第一篇数据过滤】
- ioppc技术_广东电网有限责任公司河源供电局基于IOPPC线路光纤网络智能态势感知技术研究技术服务等5个项目采购公告...
- matlab单双极性眼图程序,求通信大神讲讲这个matlab程序每一段的意思
- Linux 服务器自动连接校园网,selenium + geckodriver + firefox浏览器
- 穿搭网在线头像试衣间
- 【解题报告】2017-2018 8th BSUIR Open Programming Contest-C Good subset 线性基+线段树
- 开源智能电子名片系统源码 含小程序完整前后端+搭建教程
- 计算机mac是什么,修改计算机的MAC地址有什么用
- Visual Studio 2022离线下载
- 使用Unity模拟人群疏散的资料整理
热门文章
- “私域”和“会员制”有什么区别?
- 魅族开售跳票,创饥饿营销新高度?
- fudanNLP-使用
- python统计人的视角_Python--统计人的视角
- 缠中说禅 教你炒股票 全集列表
- matlab 图像傅里叶逆变换,用MATLAB实现图像的傅里叶变换.ppt
- 三相PWM整流器dq解耦控制
- 网络交换机怎么连接硬盘录像机、网络交换机怎么连接摄像头
- MATLAB如何导出高分辨率的模型图片、PDF
- java真香表情包_真香表情包 - 真香微信表情包 - 真香QQ表情包 - 发表情 fabiaoqing.com...