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);