unimrcp Message Usage

MRCP Message Usage

一、MRCP Message 格式

MRCP message 有三种类型:

  • 从 client 发向 server 的请求(MRCP_MESSAGE_TYPE_REQUEST)
  • 从 server 发送 client 的响应(MRCP_MESSAGE_TYPE_RESPONSE)
  • 从 server 发送 client 的异步事件(MRCP_MESSAGE_TYPE_EVENT)

MRCP message 结构:
mrcp-message = start-line
        header-section
        [body]
start-line:
 start-line = request-line / response-line / event-line
header-section:
 header-section = 1*(generic-header / resource-header)
 resource-header = recognizer-header / synthesizer-header / recorder-header
body:
 包含指定的资源和消息内容

二、创建 MRCP Message

创建的消息包括:请求、响应、事件。创建消息主要通过一下三个函数。

2.1 mrcp_application_message_create 函数

mrcp_application_message_create 函数通常用于 client 创建 MRCP message。这个函数会创建一个 MRCP message 消息并且基于指定的 session 和 通道参数去初始化它。

2.2 mrcp_response_create 函数

mrcp_response_create 函数用于 server plugin 创建 MRCP 响应。

2.3 mrcp_event_create 函数

mrcp_event_create 函数用于 server plugin 创建 MRCP 事件。

三、对 Header 的操作

3.1 给通用头部域设置字符标识符

获取通用头部:

mrcp_generic_header_t *generic_header = mrcp_generic_header_get(message);

设置 content-type 类型:

apt_string_assign(&generic_header->content_type,"application/synthesis+ssml",message->pool);
mrcp_generic_header_property_add(message,GENERIC_HEADER_CONTENT_TYPE);

设置 Content-Id 域:

apt_string_assign(&generic_header->content_id,"content-1",message->pool);
mrcp_generic_header_property_add(message,GENERIC_HEADER_CONTENT_ID);

设置头部的其他域都是类似的方法。

3.2 从通用头部域获取字符标识符

获取通用头部:

mrcp_generic_header_t *generic_header = mrcp_generic_header_get(message);

检测头部是否有 Content-Type 的值,如果有,则记录下来:

if(mrcp_generic_header_property_check(message,GENERIC_HEADER_CONTENT_TYPE) ==
TRUE) {
 generic_header->content_type
}

检测头部是否有 Content-Id 的值,如果有,则记录下来:

if(mrcp_generic_header_property_check(message,GENERIC_HEADER_CONTENT_ID) ==
TRUE) {
 generic_header->content_id
}

对于其它头部的内容,都以这样的方法记录下来。

3.3 给资源头部域设置字符标识符

获取资源头部:

mrcp_synth_header_t *synth_header = (mrcp_synth_header_t*) mrcp_resource_header_get(message);

设置 Voice-Age 头部:

synth_header->voice_param.age = 28;
mrcp_resource_header_property_add(message,SYNTHESIZER_HEADER_VOICE_AGE);

设置 Speaker-Profile 头部:

apt_string_assign(&synth_header->speaker_profile,"profile-1",message->pool);
mrcp_resource_header_property_add(message,SYNTHESIZER_HEADER_SPEAKER_PROFILE);

其它资源头的设置方式和这个类似。

3.4 从资源头部域获取字符标识符

获取资源头部:

mrcp_synth_header_t *synth_header = (mrcp_synth_header_t*) mrcp_resource_header_get(message);

检测头部是否有 Voice-Age 的值 ,如果有,则记录下来:

if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_VOICE_AGE)  Universal Speech Solutions LLC | Operating on Header Fields 9 == TRUE) { 
	synth_header->voice_param.age
}

检测头部是否有 Speaker-Profile 的值 ,如果有,则记录下来:

if(mrcp_resource_header_property_check(message,SYNTHESIZER_HEADER_SPEAKER_PRO FILE) == TRUE) {
	synth_header->speaker_profile
}

其它资源头的获取方式和这个类似。

3.5 使用键值对的方式设置头字段

1.创建一个头部
一下有几个函数创建头部:
APT_DECLARE(apt_header_field_t*) apt_header_field_create(const apt_str_t *name, const apt_str_t *value, apr_pool_t *pool) 函数:

apt_str_t name, value;
apt_header_field_t *header_field;
apt_string_set(&name,"Content-Type");
apt_string_set(&value,"application/synthesis+ssml");
header_field = apt_header_field_create(&name,&value,message->pool);

APT_DECLARE(apt_header_field_t*) apt_header_field_create_c(const char *name, const char *value, apr_pool_t *pool) 函数:

apt_header_field_t *header_field = apt_header_field_create_c("ContentType","application/synthesis+ssml",message->pool);

APT_DECLARE(apt_header_field_t*) apt_header_field_create_from_line(const apt_str_t *line, char separator, apr_pool_t *pool) 函数:

apt_str_t line;
apt_header_field_t *header_field;
apt_string_set(&line,"Content-Type=application/synthesis+ssml");
header_field = apt_header_field_create_from_line(&line,'=',message->pool);

2.将创建的头部添加到 message 头部

mrcp_message_header_field_add(message,header_field);

3.6 遍历头部域

头字段存储在一个环(apr_ring_t)中,该环又是一个通用的双链表。下面的代码演示如何透明地迭代指定消息的头字段。

apt_header_field_t *header_field = NULL;
while( (header_field =
mrcp_message_next_header_field_get(message,header_field)) != NULL ) {
 printf("%s: %s\n", header_field->name.buf, header_field->value.buf);
}

四、设置 message 主题

通常,消息体是从消息池中分配内存的,并且具有和消息相同的生命周期。

apt_string_assign(&message->body,"Hello world",message->pool);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值