UNIMRCP 代码走读

摘要:
为了提供基于UNIMRCP的ASR或TTS服务,用户需要实现能够提供真正ASR和TTS功能的插件。UNIMRCP提供了ASR和TTS插件的演示示例,使基于演示的开发更加方便快捷。UNIMRCP演示中的语音回调条目为:static_bool_tdemo_recog_stream_ writedemo中的主要处理流程是检查语音有效性并进行状态转换。UNIMRCP演示中的语音回调条目是:static_bool_tdemo_synth_stream_readdemo中的主要处理流程是从固定音频中读取一帧内容并将其填充到帧中。系统将此数据帧转换为RTP消息并发送出去。
基于UNIMRCP1.5.0的代码走读 与 填坑记录

1. server启动配置加载

入口:unimrcp_server.c  

static apt_bool_t unimrcp_server_load(mrcp_server_t *mrcp_server, apt_dir_layout_t *dir_layout, apr_pool_t *pool);

通过root下的几个主要字节点分别进行处理,对应处理函数如下:

unimrcp_server_properties_load : properties加载

unimrcp_server_components_load :componets加载,包括各个功能的plugin

unimrcp_server_settings_load : 

unimrcp_server_profiles_load :

unimrcp_server_misc_load :

2.消息处理链路

  系统启动时会为每个plugin启动一个任务处理线程,循环函数在:  apt_consumer_task.c:apt_consumer_task_run()

  具体消息处理在 : apt_task.c : apt_task_msg_process()  ——》apt_task_vtable_t.process_msg() ——》会调用到每个plugin定时时注册的函数

  MRCP消息解析 : apt_text_message.c:apt_message_parser_run()

ASR与TTS实现 

UNIMRCP是MRCP协议的封装,并没有真实实现ASR或TTS的能力。基于UNIMRCP提供ASR或TTS服务,用户需要自己实现能提供真实ASR和TTS能力的plugin。UNIMRCP提供了ASR和TTS的plugin的demo示例,基于demo开发更加方便快捷。

3. ASR实现

UNIMRCP的ASR实现demo在文件plugins路径下demorecog模块,demo_recog_engine.c文件中。

a.SIP交互: SIP交互用于协商ASR过程中双方进行MRCP消息交互和媒体交互使用的端口和媒体格式等信息。  这一块一般无需改动,如果存在格式限制,可在配置文件 conf/unimrcpserver.xml 中配置 settings -> rtp-settings -> codecs ,如:

<codecs own-preference="false">PCMU PCMA L16/96/8000 PCMU/97/16000 PCMA/98/16000 L16/99/16000</codecs>

b.MRCP消息交互: MRCP服务器收到RECOGNIZE消息以接受语音识别请求,进入ASR流程。demo_recog_channel_recognize 方法封装了RECOGNIZE消息的处理。进入这个函数,表示收到一个语音识别请求,此请求处理成功后,会进入语音回调流程。

c.rtp交互: rtp交互也即媒体的交互。进入语音回调流程后,rtp交互也随之开始。UNIMRCP的demo中语音回调入口是:

static apt_bool_t demo_recog_stream_write(mpf_audio_stream_t *stream, const mpf_frame_t *frame) 

 demo中的主要处理流程是

  (1)检查语音有效性,进行状态转换。调用 mpf_activity_detector.c 中如下方法:

MPF_DECLARE(mpf_detector_event_e) mpf_activity_detector_process(mpf_activity_detector_t *detector, const mpf_frame_t *frame)

  

  (2)状态转换成功后返回发送ASR识别响应。调用如下方法(demo中返回固定识别结果)

static apt_bool_t demo_recog_recognition_complete(demo_recog_channel_t *recog_channel, mrcp_recog_completion_cause_e cause)

  

业务基于UNIMRCP进行ASR开发时,在demo基础上,至少需做两点

  (1) 在 demo_recog_stream_write 回调中取出音频,提供给识别服务进行识别。注意这里的回调是基于帧的概念回调的。(一次回调拿到的数据是10ms的数据)

  (2) 再 demo_recog_recognition_complete 调用时,将识别结果的值设置为真实的ASR识别服务的识别结果。

4.TTS实现

UNIMRCP的ASR实现demo在文件plugins路径下 demosynth 模块,demo_synth_engine.c 文件中。

a.SIP交互: SIP交互用于协商ASR过程中双方进行MRCP消息交互和媒体交互使用的端口和媒体格式等信息。  这一块一般无需改动,如果存在格式限制,可在配置文件 conf/unimrcpserver.xml 中配置 settings -> rtp-settings -> codecs ,如:

<codecs own-preference="false">PCMU PCMA L16/96/8000 PCMU/97/16000 PCMA/98/16000 L16/99/16000</codecs>

b.MRCP消息交互: MRCP服务器收到SPEAK消息以接受语音合成请求,进入TTS流程。

static apt_bool_t demo_synth_channel_speak(mrcp_engine_channel_t *channel, mrcp_message_t *request, mrcp_message_t *response)

 方法封装了SPEAK消息的处理。进入这个函数,表示收到一个语音识别请求,此请求处理成功后,会进入语音回调流程。

c.rtp交互: rtp交互也即媒体的交互。进入语音回调流程后,rtp交互也随之开始。UNIMRCP的demo中语音回调入口是:

static apt_bool_t demo_synth_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *frame)

 demo中的主要处理流程是

  (1)从固定音频中读取一帧内容,并填充到 frame 中,由系统将这一帧数据转换为RTP消息发送出去。

  (2)音频读取完后发送完成消息,以结束TTS语音流程

/* send asynch event */
mrcp_engine_channel_message_send(synth_channel->channel,message);

  

业务基于UNIMRCP进行TTS开发时,在demo基础上,至少需做两点

  (1) 在 demo_synth_channel_speak 回调中读取出要合成语音的文本内容,提交给TTS服务进行合成。

  (2) 在 demo_synth_stream_read 回调中,将合成得到的语音按帧顺序填充到buffer中。由于MRCP是实时协议,因此TTS服务也要求能实时合成,一般从收到请求到第一个字合成音出来会有一定延时,这时可以先填充空白音。

免责声明:文章转载自《UNIMRCP 代码走读》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Postgresql安装解决Chrome调试(debugger)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pyttsx3--文字转语音库

写在前面,部分window由于是盗版影响,部分语音库存在问题,报错无效的类字符串或者没有注册的类那么可能是win7 tts语音有问题体,提醒可以去下载相应补丁链接:https://pan.lanzou.com/i0h951cimport pyttsx3#初始化engine=pyttsx3.init()#test1engine.say('小说说的真好')e...

CentOS 5下freeswitch中集成使用ekho实现TTS功能二

三:以上Festival安装完成以后回到ekho安装目录: 执行./configure --enable-festival 前 更改configure 1:替换 #AC_DEFINE(ENABLE_FESTIVAL,,[Enable Festival]) #LIB_FESTIVAL="${srcdir}/lib/libFestival.a ${srcdir...

如何使用华为机器学习服务和Kotlin实现语音合成

1. 引言   你曾遇到过这种情况吗?一本小说太长,要花很长时间阅读,但如果有app能自动为你阅读,就会省时很多。因此,将文本转换成语音的工具应运而生。华为机器学习服务(HUAWEI ML Kit)具备语音合成(Text To Speech, TTS)功能,能让app快速实现从文本到语音的转换。TTS可以将文本转换成人声。这也可以通过默认方法实现,但这些方...

C#语音朗读文本 — TTS的实现

TTS, Text To Speech的缩写,是使用语音朗读文本的技术。目前,在国内应用较多的是排队叫号系统 Windows 平台的TTS,通常使用的是微软自带的 Speech API。 Windows XP 自带的是 Speech API 5.1,默认是只支持英文的。如果要朗读中文,需要安装LangPack,里面支持简体中文,不过,是个男生的发音。...

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

最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍。 一、什么是语音合成(TTS) 1.1 What is 语音合成? 将文字信息转化为声音信息,给应用配上“嘴巴”,这就是语音合成。 Note:语音合成和语音识别技术是实现人机语音通...

用TTS实现文本转语音

最近被toefl单词虐成狗::>_<::   想做一个可以自动把单词转成语音的软件,这样就可以在路上戴耳机边走边听啦~ 用微软的TTS语音库可以很容易地实现。早期的TTS要想实现中英文混合朗读还很麻烦,然而Win10里自带的新版SDK已经解决了这个问题。可以自动识别出中文和英文。这点超赞~ 注意:如果用的是英文版系统,需要先安装中文Speech...