上一篇我们封装了科大讯飞接口实现了 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相关推荐

  1. 构建简单的智能客服系统(二)——基于 UniMRCP 实现讯飞 ASR MRCP Server

    通过实现 UniMRCP 的 plugin,我们可以封装讯飞.百度.阿里等厂家的 ASR 接口,实现我们自己的 MRCP 服务器. 什是 MRCP 媒体资源控制协议(Media Resource Co ...

  2. 春松客服:通过开源加云原生模式,大规模交付智能客服系统 | Chatopera

    什么是智能客服系统 客服系统可以说,在 20 世纪六十年代,就成为现代企业的基础了,美国贝尔实验室最早研发商用计算机,就是为了实现在呼叫中心自动化的调度电话网络的接线,也就是说,是客服系统的高强度的作 ...

  3. 从0进入智能客服系统

    我们会产生一个想法:能不能有一个机器人来回答这些重复的问题,它能 24 小时的工作不用休息,降低客户成本,还能挖掘聊天记录里面的一些有价值的知识点.这就是智能客服产生的背景. 1. 智能客服系统 智能 ...

  4. 海底捞 如何打造全渠道+全场景的智能客服系统?

    选型宝直播访谈:海底捞 如何打造全渠道+全场景的智能客服系统? 01 直播简介 说起客服系统,大家可能会首先想到呼叫中心(Call Center),想到那些熟悉的客服号码:10086.95588.12 ...

  5. 瓜子二手车封宇:瓜子IM智能客服系统数据架构设计

    本文根据封宇在2018年10月18日[第十届中国系统架构师大会(SACC2018)]现场演讲内容整理而成. 讲师介绍: 封宇,瓜子二手车高级技术专家,中国计算机学会专业会员.2017年2月入职瓜子二手 ...

  6. 瓜子IM智能客服系统的数据架构设计(整理自现场演讲)

    本文由ITPub根据封宇在[第十届中国系统架构师大会(SACC2018)]现场演讲内容整理而成. 1.引言 瓜子业务重线下,用户网上看车.预约到店.成交等许多环节都发生在线下.瓜子IM智能客服系统的目 ...

  7. python 使用gensim和pickle包,模拟智能客服系统

    开发环境 mac + python3.6.3 思路讲解 现在一些智能客服系统,号称是机器人客服,其实也就是事先训练好了一些对话模型,从而看起来更精准智能,看着也高大上一些.其实可以分为三个部分: 1. ...

  8. 为什么越来越多的企业选择智能客服系统?

    现在智能客服系统越来越普遍,但是大部分的企业在配备智能客服系统的同时也会配置人工客服.因为目前为止,智能客服并不可以完全取代人工客服.智能客服系统之所以能够受到众多企业的青睐,主要是存在以下几点原因: ...

  9. 一个智能客服系统的设计思路

    一.目标 随着移动互联网发展,许多线下服务都搬到了网络平台上,人们也越来越习惯于通过互联网来获得服务,这大大节省了时间,提高了办事效率.但线上服务面向的用户群体大,同类问题多,这就要求互联网平台提高服 ...

  10. Live800:全渠道智能客服系统,助力企业打造全渠道客户中心

    在新消费环境下,用户移动化.在线化是一个不可逆转的趋势,如何与客户建立连接.增强接触点,成为企业的核心竞争力.企业的价值有多大?发展潜力有多大?取决于企业所能连接客户的数量及强度,这是对以往产品销量的 ...

最新文章

  1. python官方网站地址-index
  2. 通过angular.js实现MVC的基本步骤
  3. 每周「Paper + Code」清单:句子嵌入,文本表示,图像风格转换
  4. 如何在Bash脚本中将Heredoc写入文件?
  5. ios tabbar中间凸起_移动端开发基础【21】tabBar 配置
  6. 游戏中的数学:向量数学(vector math)
  7. 一款秒杀wireshark和burpsuite的国产网络分析神器,你还没用过?
  8. 【机器学习】:朴素贝叶斯
  9. python 百度ai json解析_百度AI接口调用
  10. 微信oa服务器,微信oa系统是什么?微信如何与oa系统进行结合?
  11. 【手把手教你如何从Tushare库下载股票数据,并保存在硬盘当中,第一篇数据过滤】
  12. ioppc技术_广东电网有限责任公司河源供电局基于IOPPC线路光纤网络智能态势感知技术研究技术服务等5个项目采购公告...
  13. matlab单双极性眼图程序,求通信大神讲讲这个matlab程序每一段的意思
  14. Linux 服务器自动连接校园网,selenium + geckodriver + firefox浏览器
  15. 穿搭网在线头像试衣间
  16. 【解题报告】2017-2018 8th BSUIR Open Programming Contest-C Good subset 线性基+线段树
  17. 开源智能电子名片系统源码 含小程序完整前后端+搭建教程
  18. 计算机mac是什么,修改计算机的MAC地址有什么用
  19. Visual Studio 2022离线下载
  20. 使用Unity模拟人群疏散的资料整理

热门文章

  1. “私域”和“会员制”有什么区别?
  2. 魅族开售跳票,创饥饿营销新高度?
  3. fudanNLP-使用
  4. python统计人的视角_Python--统计人的视角
  5. 缠中说禅 教你炒股票 全集列表
  6. matlab 图像傅里叶逆变换,用MATLAB实现图像的傅里叶变换.ppt
  7. 三相PWM整流器dq解耦控制
  8. 网络交换机怎么连接硬盘录像机、网络交换机怎么连接摄像头
  9. MATLAB如何导出高分辨率的模型图片、PDF
  10. java真香表情包_真香表情包 - 真香微信表情包 - 真香QQ表情包 - 发表情 fabiaoqing.com...