构建简单的智能客服系统(三)——基于 UniMRCP 实现讯飞 TTS MRCP Server

article/2025/8/22 12:44:47

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


http://chatgpt.dhexx.cn/article/uTLm7wIR.shtml

相关文章

ROS语音交互系统_(2)利用讯飞TTS实现ROS下语音合成播报

前言 - Writing a Simple Publisher and Subscriber (C++) - ubuntu16.04外接音箱无声音 1、先前准备 (1)在~/catkin_ws/src目录下执行 $ catkin_create_pkg voice_system roscpp rospy std_msgs (2࿰

讯飞tts调用

目标&#xff1a;能在arm开发板上运行 拿到arm版本libmcs.so库后尝试集成到开发板&#xff0c;导入库后运行10102错误&#xff0c;查找官方错误码。 注意到官方给的例子有两个参数&#xff1a; const char* session_begin_params "engine_type local,voice_namexiaoya…

讯飞tts语音引擎_讯飞输入法A.I.语音引擎再升级 更强大更实用!

时代在进步,用手打字已OUT,眼下是语音的大时代。近日,讯飞输入法Android版和iOS版更新A.I.语音引擎,进一步优化通用语音识别效果,同时还基于说话人和使用场景,重点提升语音候选词、噪声环境、轻声说话及专有名词的识别准确率。正是科大讯飞技术创新、成果落地的真实投映。…

基于ROS2和科大讯飞的文字转语音TTS入门教程

基于ROS2和科大讯飞的语音转文字入门教程 基于ROS2和科大讯飞的文字转语音TTS入门教程1.环境搭建2.创建工程3.编译和执行 基于ROS2和科大讯飞的文字转语音TTS入门教程 本文将展示&#xff0c;如何利用ROS2和科大讯飞的TTS模块&#xff0c;实现简单的文字转语音功能。利用ROS2&…

巧用讯飞TTS进行文本合成语音(LINUX操作系统)

因为工作需要用到文本转语音文件&#xff0c;然后进行播放的应用场景。 我先后研究了三种开源的框架程序&#xff0c;festival、ekho和espeak。但实际运行后&#xff0c;效果很差&#xff0c;也没精力训练调试它们。 后来我突然想起来在科大讯飞是语音处理的老大&#xff0c;TT…

初探机器学习之使用讯飞TTS服务实现在线语音合成

最近在调研使用各个云平台提供的AI服务&#xff0c;有个语音合成的需求因此就使用了一下科大讯飞的TTS服务&#xff0c;也用.NET Core写了一个小示例&#xff0c;下面就是这个小示例及其相关背景知识的介绍。 一、什么是语音合成&#xff08;TTS&#xff09; 1.1 What is 语音合…

麒麟系统虚拟机安装教程

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 1.首先得安装VM Ware软件。 2.打开VM Ware&#xff0c;点击“文件”->“新建虚拟机”。 3.进入新建虚拟机向导&#xff0c;点击下一步。如下图&…

史上最最详细的win10虚拟机安装教程,手把手从头到尾

史上最最详细的win10虚拟机安装教程 1.安装VMware 12Pro 前天我安装了VM12&#xff0c;并安装了win10系统的虚拟机。遇到了很多问题&#xff0c;我想拿出来和大家分享一下解决办法。 首先&#xff0c;第一步先上下载地址&#xff1a; VMware 12下载地址 大家下载时记得选择普…

虚拟机安装教程

虚拟机安装教程   vmware10虚拟机是个软件&#xff0c;安装后可用来创建虚拟机&#xff0c;在虚拟机上再安装系统&#xff0c;在这个虚拟系统上再安装应用软件&#xff0c;所有应用就像操作一台真正的电脑&#xff0c;因此&#xff0c;我们可以利用虚拟机学习安装操作系统、…

Fedora虚拟机安装教程

Fedora虚拟机安装教程 &#xff08;作者&#xff1a;Baron_wu 禁止转载&#xff09; 获取VMware14 链接&#xff1a; https://pan.baidu.com/s/1WQuajxl2KOtcn9WYendglQ 提取码&#xff1a;2K32获取Fedora安装镜像 64bit &#xff1a; https://download.fedoraproject.org/pu…

win10虚拟机安装教程

win10虚拟机安装 下载iso镜像文件win10镜像安装步骤拍摄快照 下载iso镜像文件 首先我们需要准备一个win10的iso镜像系统&#xff0c;下载地址&#xff1a;https://msdn.itellyou.cn/ 我们选择最新版本就可以了&#xff0c;选择consumer editions版本&#xff08;其实选择两个…

VMware16虚拟机安装教程

一、VMware下载 VMware下载地址&#xff1a;https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html 我的电脑是Windows电脑&#xff0c;所以选择Workstation 16 Pro for Windows下载&#xff0c;如果你的电脑事Linux系统&#xff0c;选择Work…

deepin虚拟机安装教程

deepinISO镜像&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1yzxtAetA9eccO6pNFO6wTg 提取码&#xff1a;az78 --来自百度网盘超级会员V5的分享 deepin是Linux内核的&#xff0c;里面附带办公软件&#xff0c;今天小编就在虚拟机上体验一波&#xff01;开车&#x…

CentOS7虚拟机安装教程

第一步&#xff1a;打开虚拟机找到创建新的虚拟机 第二步&#xff1a;进入向导选择典型 第三步&#xff1a;选择稍后添加操作系统 第四步&#xff1a;选择linux CentOS 7的版本 第五步&#xff1a;自定义虚拟机名称和安装地址 第六步&#xff1a;指定磁盘大小&#xff0c;默认选…

Ubuntu 20.04 虚拟机安装教程

首先你需要下载 VMware&#xff0c;建议不要放于C盘&#xff0c;不会下载的建议看 哔哩哔哩Frank。下载 Ubuntu 20.04 镜像&#xff0c;也是建议不放于C盘&#xff0c;我放在了 E:\Ubuntu 20.04 iso 完成上诉步骤&#xff0c;打开VMware&#xff0c;点击创建新的虚拟机。选择 自…

Linux虚拟机安装教程

一、虚拟机的创建 我们在工作中会需要用到Linux环境&#xff0c;但Linux系统毕竟没有Windows系统用起来顺手。处于这种考虑&#xff0c;我们可以在电脑上安装一个Linux虚拟机&#xff0c;在虚拟机上虚拟出一套电脑所需要的资源。现在就开始进行VMware的安装。 我们下载完VMw…

虚拟机安装(详细教程)

我这个主要是前期的下载安装&#xff0c;后面的操作大家可以参考VirtualBox 安装Kali linux最新版&#xff08;超详细&#xff09;_Jokong的博客-CSDN博客_virtualbox安装kali 这个作者写的超级详细&#xff0c;小白完全跟得上 目录 官网地址&#xff1a; VirtualBox6.1.3…

最强卸载神器,使你的Windows绝对干净

前言 Uninstall Tool 是一款超级强大的软件卸载工具&#xff0c;它完全可以替代您Windows自带的”添加/删除程序”功能&#xff0c;超强的卸载能力可以卸载您安装的任何第三方软件应用&#xff0c;也可卸载注册表相关项让你的系统更清洁干净&#xff0c;但它有一个更加强大的功…

2345文件粉碎,文件强力删除工具无捆绑纯净提取版

前言 对比起其余文件粉碎工具来说&#xff0c;这款速度更快&#xff0c;成功率也更高&#xff0c;还是不错的 这里提供无捆绑并且纯净的2345文件粉碎工具&#xff0c;除去AvShellExt64.dll和AvShellExt.dll修改过几处十六进制&#xff0c;其余都是软件原版文件&#xff0c;可…

彻底删除顽固dll文件

对于一些顽固的软件&#xff0c;在卸载之后会有残留的 dll 文件保留&#xff0c;而且这个 dll 文件并不能删除,有的会绑定到进程中(一般容易绑定到expore.exe进程中)随电脑开机一起启动,在删除文件的时候就会提示有程序占用(或服务在运行等) 下面介绍一种彻底删除顽固 dll 文件…