您当前的位置是:  首页 > 新闻 > 国内 >
 首页 > 新闻 > 国内 >

MRCP协议学习笔记-语音合成资源中的请求处理

2018-07-13 15:56:57   作者: james.zhu   来源:CTI论坛   评论:0  点击:


  从今天的章节开始,我们将逐一介绍MRCP协议栈中媒体处理方式的内容。语音合成是我们今天重点介绍的内容。MRCP的语音合成处理是对普通文本或描述文本文件,然后实时通过媒体传输合成的语音。在前面的章节中,我们曾经介绍过其两种基本的类型,为了本章节的内容,这里我们再次回忆一下这些内容。MRCP中的语音合成包括两种基本的媒体处理类型:一直是basicsynth,另外一种是speechsynth。前者的媒体处理类型仅能支持简单的语音合成和非常有限的单词构成;后者则可以支持全功能的语音合成和丰富的单词语义,同时支持文本的渲染和其语音转化合成功能。此此章节和接下来的章节中,我们将重点介绍这两种媒体类型的method,事件和头域的使用方式。
  1、在讨论媒体处理类型时,我们以前也讨论了SSML的描述语法。这些语法可以支持不同的媒体处理类型和能力。首先,我们介绍一下两个媒体资源类型所支持的SSML语法格式,请求方法,事件消息,状态机和一些特别的头域。
  下面的列表中列出了两种媒体资源类型所支持的相应的SSML要素以及输入格式。
  语音合成的媒体资源类型支持七个请求消息和两个事件消息。七个请求的method分别是:
  两个事件消息分别是:
  语音合成媒体资源支持一个状态机。状态机是由MRCP的客户端来发起驱动,媒体资源自己本身则产生事件消息。
  支持的各种特别的头域列表:
  2、现在,我们讨论一下经常使用的具体的method方法。SPEAK method 有两个目的: 提供语音合成的输入,然后快速发起语音合成和媒体流数据。在SPEAK请求消息体中可包含:
  • inline 的SSML描述语法(application/ssml+xml);
  • 外部SSML的URL或文本列表;
  • inline的文本或多外部的消息;
  3、合成媒体资源使用的是先进先出的队列处理机制,因此处理过程是按照顺序执行,接收顺序也是如此。当媒体资源接收到SPEAK请求时,如果媒体资源在空闲状态,回复的响应请求状态则是IN-PROGRESS 的消息;如果媒体资源是在讲话状态或暂停状态时,响应的请求返回消息则是PENDING,表示此请求正在队列中。这里读者要注意,在合成请求中使用的一些语音参数是具有一定优先级的。最高优先级的是SSML描述语言,其次是SEPAK 请求中的相关语音参数:Voice-,Prosody-,Speaker-Profile 和 Speech-Language 头;最低优先级是会话默认值,它们使用SET-PARAMS和其接下来的后续method请求。以下是一个SPEAK请求示例图:
  其相应的客户端到服务器端响应消息如下:
  F1(client→speechsynth):
  • MRCP/2.0338 SPEAK 3214
  • Channel-Identifier:23eb10a@speechsynth
  • Content-Type: application/ssml+xml
  • Content-Length: 213
  • <?xml version="1.0" encoding="UTF-8"?>
  • <speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
  • xml:lang="en-US">
  • Please leave a message after the beep.
  • <audio src="beep.wav"/>
  • </speak>
  F2 (speechsynth → client)的回复消息如下:
  • MRCP/2.0 119 3214 200 IN-PROGRESS
  • Channel-Identifier: 23eb10a@speechsynth
  • Speech-Marker: timestamp=857206027059
  F3 (speechsynth → client):
  • MRCP/2.0 156 SPEAK-COMPLETE 3214 COMPLETE
  • Channel-Identifier: 23eb10a@speechsynth
  • Speech-Marker: timestamp=861500994355
  • Completion-Cause: 000 normal
  4。如果MRCP客户端对语音资源媒体讲话表示一些内容命令时,PAUSE请求method可以用来支持对合成媒体资源发出暂停语音输出的请求。当语音输出暂停以后,媒体资源会响应一个带200 OK的状态码。如果在一个会话中,发出PAUSE 请求后,SPEAK不是一个活动的状态,媒体资源服务器端必须对客户端返回一个带“Method not valid in this state” 的402 错误状态码。如果SPEAK请求是在活动状态时,服务器端则必须返回一个Active-Request-Id-List,这个头包含已被暂停的SPEAK 请求ID(注意,F4)。以下是一个暂停的示例图:
 
  相应的PAUSE 请求消息流程图如下:
  F1 (client → speechsynth):
  • MRCP/2.0 187 SPEAK 3215
  • Channel-Identifier: 23eb10a@speechsynth
  • Content-Type: text/uri-list
  • Content-Length: 70
  • http://www.example.com/file01.ssml
  • http://www.example.com/file02.ssml
  F2 (speechsynth → client):
  • MRCP/2.0 118 3215 200 IN-PROGRESS
  • Channel-Identifier: 23eb10a@speechsynth
  • Speech-Marker: timestamp=857206027059
  F3 (client → speechsynth):
  • MRCP/2.0 67 PAUSE 3216
  • Channel-Identifier: 23eb10a@speechsynth
  F4 (speechsynth → client):
  • MRCP/2.0 105 3216 200 COMPLETE
  • Channel-Identifier: 23eb10a@speechsynth
  • Active-Request-Id-List: 3215
  5、RESUME请求是对暂停的请求重启。当语音生产重启后,服务器端会对客户端返回一个200 消息。Active-Request-Id-List 头中会说明重启的请求ID(注意 F6)。当服务器端处于空闲状态时,服务器收到RESUME 请求时,它必须返回一个“402 Method not valid in this state” 消息。以下是一个重启的示例图:
  这里,我们借用了前面的暂停消息流程,所以忽略了前面暂停的部分消息,仅展示重启的消息流程(F5->F7)。
  F5(client→speechsynth):
  • MRCP/2.068 RESUME 3217
  • Channel-Identifier:23eb10a@speechsynth
  F6(speechsynth→client):
  • MRCP/2.01053217200 COMPLETE
  • Channel-Identifier:23eb10a@speechsynth
  • Active-Request-Id-List:3215
  F7(speechsynth→client):
  • MRCP/2.0155SPEAK-COMPLETE 3215 COMPLETE
  • Channel-Identifier:23eb10a@speechsynth
  • Speech-Marker:timestamp=861500994355
  • Completion-Cause:000 normal
  6、STOP请求是对服务器端发出停止请求,通知服务器端停止处理语音输出。如果在请求的消息中没有携带Active-Request-Id-List,它说明在处理过程中的SPEAK请求已经停止,任何在等待队列中SPEAK请求已经从队列中移除。如果一个STOP请求成功停止了一个或多个PENDING 或IN-PROGRESS SPEAK 请求,则返回一个200 Success,并且在返回的200 消息中包含通过Active-Request-Id-List列出已经成功停止的请求ID。以下是一个STOP 请求的示例图:
  F1(client→speechsynth):
  MRCP/2.0143 SPEAK 4000
  Channel-Identifier:23eb10a@speechsynth
  Content-Type:text/plain
  Content-Length:28
  Thankyou.Pleasecallagain.
  F2(speechsynth→client):
  MRCP/2.0122 4000 200 IN-PROGRESS
  Channel-Identifier:23eb10a@speechsynth
  Speech-Marker:timestamp=857206027059
  F3(client→speechsynth):
  MRCP/2.066 STOP 4001
  Channel-Identifier:23eb10a@speechsynth
  F4(speechsynth→client):
  MRCP/2.0145 4001 200 COMPLETE
  Channel-Identifier:23eb10a@speechsynth
  Speech-Marker:timestamp=861500994355
  Active-Request-Id-List:4000
  7、如果当一个活动的SPEAK请求中携带了头Kill-On-Barge-In, 并且这个值设置为true的时候,BARGE-IN-OCCURRED请求会明确执行一个对STOP 请求的操作。BARGE-IN-OCCURRED的目的是MRCP 客户端对媒体资源服务器端通信时,对服务器端发出的一个输入事件,例如摁了DTMF按键或说话输入触发了收入的事件。语音合成资源服务器则根据输入的数据来决定是否执行结束输入的流程。BARGE-IN-OCCURRED 打断可以使用在以下两种场景中:
  1. 语音识别引擎和语音合成资源是各自独立的。
  2. 语音识别引擎和语音合成资源耦合度非常高,它们之间需要紧密配合。通常可能是同一厂家的产品。
  在以上的使用场景中,MRCP客户端的工作方式类似于一个proxy 代理的方式。它从服务器端接收到一个START-OF-INPUT事件,然后马上对服务器端发送一个BARGE-IN-OCCURRED 打断事件。如果是两个服务器耦合度非常高的话,在接下来的由客户端发出的BARGE-IN-OCCURRED请求中,MRCP客户端会添加一个Proxy-Sync-Id 头。如果服务器端已经开始处理打断事件的话,这个头会支持服务器端来决定进一步的处理流程。在MRCP这样的设计的目的就是MRCP客户端无需获悉MRCP服务器端是否直接在服务器使用了打断的流程。
  如果BARGE-IN-OCCURRED请求导致一个或多个SPEAK请求结束时,服务器端会返回一个 200 Success, 并且包含一个Active-Request-Id-List头来通知结束的请求ID。如果没有结束SPEAK 请求的话,服务器端仍然返回200 Success,当然不会包含任何Active-Request-Id-List头值。以下示例是一个打断过示例图:
  这里,我们假设语音识别已经通过RECOGNIZE 开启了识别的请求状态,这里没有显示。“internal barge-in message”使用在语音识别和合成服务器耦合工作的状态中。现在让我们看一下具体的消息发送流程:
  F1 (client → speechsynth):
  MRCP/2.0 376 SPEAK 9200
  Channel-Identifier: 23eb10a@speechsynth
  Content-Type: application/ssml+xml
  Content-Length: 251
  <?xml version="1.0" encoding="UTF-8"?>
  <speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
  xml:lang="en-US">
  Here is your track. You may pause at anytime by simply
  saying pause.
  <audio src="track01.wav"/>
  </speak>
  F2 (speechsynth → client):
  MRCP/2.0 118 9200 200 IN-PROGRESS
  Channel-Identifier: 23eb10a@speechsynth
  Speech-Marker: timestamp=857206027059
  F3 (speechrecog → client):
  MRCP/2.0 134 START-OF-INPUT 10001 IN-PROGRESS
  Channel-Identifier:a123c31f@speechrecog
  Input-Type:speechProxy-Sync-Id:392812
  F4(client→speechsynth):
  MRCP/2.0103 BARGE-IN-OCCURRED 9201
  Channel-Identifier:23eb10a@speechsynth
  Proxy-Sync-Id:392812
  F5(speechsynth→client):
  MRCP/2.01449201 200 COMPLETE
  Channel-Identifier:23eb10a@speechsynth
  Speech-Marker:timestamp=861500994355
  Active-Request-Id-List:9200
  8、CONTROL请求是从客户端发出的命令,通知语音合成资源服务器客户端需要对客户端说出的说话语音数据进行修改。简单来说,就是客户端通知语音合成服务器对刚才已说语音修改通知,可能客户端对前面讲话需要调整相关数据,例如可能调整说话人速度,说话人其他参数(Voice-或者Prosody-)等。这个调整可能完全取决于语音合成服务器端的功能支持,调整参数的设置通过CONTROL请求中添加头值Jump-Size 来实现。注意,它仅能支持IN-PROGRESS SPEAK 请求。
  如果CONTROL应用到了SPEAK请求中,服务器端回复一个200 Success消息,消息中包含Active-Request-Id-List 头,而且带一个活动的SPEAK 请求的ID。这个ID表示应用了CONTROL的ID。如果CONTROL发出以后,没有任何SPEAK请求是在IN-PROGRESS 状态的话,服务器端返回一个“402 Method not valid in this state”。
  这里有一个比较特别的情况需要大家注意。当MRCP 客户端在CONTROL请求中设定了Jump-Size 头时,此跳转超过了当前SPEAK请求起始值时,这个活动的请求会重新从起始值启动,并且在响应中包含一个Speak-Restart 为true的头。同样,当MRCP 客户端在CONTROL请求中设定了Jump-Size 头时,此跳转超过了当前SPEAK请求结束值时,这个活动的请求会马上结束,携带了一个SPEAK-COMPLETE事件。以下是一个CONTROL的示例图:
  具体的CONTROL的消息流程如下:
  F1(client→speechsynth):
  MRCP/2.0529 SPEAK 5000
  Channel-Identifier:23eb10a@speechsynth
  Content-Type:multipart/mixed;
  boundary=0a23bf1020
  Content-Length:388--0a23bf1020
  Content-Type: text/uri-list
  Content-Length: 32
  http://www.example.com/menu.ssml
  --0a23bf1020
  Content-Type: application/ssml+xml
  Content-Length: 198
  <?xml version="1.0" encoding="UTF-8"?>
  <speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
  xml:lang="en-US">
  Say operator to speak with a customer representative
  </speak>
  --0a23bf1020--
  F2 (speechsynth → client):
  MRCP/2.0 118 5000 200 IN-PROGRESS
  Channel-Identifier: 23eb10a@speechsynth
  Speech-Marker: timestamp=857206027059
  F3 (client → speechsynth):
  MRCP/2.0 114 CONTROL 5001
  Channel-Identifier: 23eb10a@speechsynth
  Jump-Size: +3 Second
  Prosody-volume:+20%
  F4(speechsynth→client):
  MRCP/2.01455001 200 COMPLETE
  Channel-Identifier:23eb10a@speechsynth
  Active-Request-Id-List:5000
  Speech-Marker:timestamp=861500994355
  F5(speechsynth→client):
  MRCP/2.0156 SPEAK-COMPLETE  5000 CO MPLETE
  Channel-Identifier:23eb10a@speechsynthSpeech-Marker:timestamp=865795961651
  Completion-Cause:000normal
  9、DEFINE-LEXICON 请求是客户端要求语音合成资源服务器加载或卸载此会话中的语法文件。DEFINE-LEXICON请求发出后,它要求当语音合成资源服务器在空闲状态时,加载一些可能出现的大容量的语法文件。在请求中使用Load-Lexicon 头来表示加载语法文件,这里默认设置问true,表示默认加载;如果是false,则表示下载语法文件。语法文件的数据格式可以支持在消息体中的inline的消息数据,也可以使用外部的URL(text/uri-list)支持外部的数据格式。如果DEFINE-LEXICON 请求失败的话,例如,因为平台的不同导致的语法格式不支持或者访问出现问题的话,则会返回一个407 错误状态码(407 Method or operation failed)。
  如果MRCP客户端需要加载多个语法文件的话,可以通过SPEAK请求,在请求中通过Lexicon-Search-Order头来设定。头值中可以包含外部URL或session:URIs(引入inline 数据)。注意,加载语法文件时,SSML语法文件的优先级会高于Lexicon-Search-Order 设定的优先级。以下是一个DEFINE-LEXICON的示例图:
  我们通过一个DEFINE-LEXICON的请求响应流程来整个说明消息流程:
  F1(client→speechsynth):
  MRCP/2.0468 DEFINE-LEXICON 6999
  Channel-Identifier:23eb10a@speechsynth
  Content-ID:names@example.com
  Content-Type:application/pls+xml
  Content-Length:302<?xmlversion="1.0"encoding="UTF-8"?>
  F2 (speechsynth → client):
  MRCP/2.0 74 6999 200 COMPLETE
  Channel-Identifier: 23eb10a@speechsynth
  F3 (client → speechsynth):
  MRCP/2.0 362 SPEAK 7000
  Channel-Identifier: 23eb10a@speechsynth
  Lexicon-Search-Order: <session:names@example.com>
  Content-Type: application/ssml+xml
  Content-Length: 184
  <?xml version="1.0" encoding="UTF-8"?>
  <speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
  xml:lang="en-US">
  You have a new message from Francesca.
  </speak>
  F4(speechsynth→client):
  MRCP/2.01187000 200 IN-PROGRESS
  Channel-Identifier:23eb10a@speechsynth
  Speech-Marker:timestamp=857206027059
  F5(speechsynth→client):
  MRCP/2.0156 SPEAK-COMPLETE 7000 COMPLETE
  Channel-Identifier:23eb10a@speechsynth
  Speech-Marker:timestamp=861500994355
  Completion-Cause:000 normal
  在今天的章节中,我们主要介绍了媒体资源请求的处理流程。MRCP 请求处理包含了七个主要的请求方式,我们针对这七个请求方式通过每个请求的基本介绍,错误码,并且结合示例图和请求的流程消息来加以完整的说明。
  在接下来的部分章节中,我们继续介绍媒体资源的事件和一些头域值参数设置。
     



  unimrcp-MRCP协议学习分享,QQ群号:208136295
  关注微信公众号:asterisk-cn,获得有价值的行业分享
  freepbx 技术论坛:www.ippbx.org.cn
  Asterisk, freepbx技术文档: www.freepbx.org.cn
  欧米(Omni)智能客服解决方案
  融合通信商业解决方案,协同解决方案首选产品:www.hiastar.com
  unimrcp-MRCP协议学习分享,QQ群号:208136295
  关注微信公众号:asterisk-cn,获得有价值的行业分享
  freepbx 技术论坛:www.ippbx.org.cn
  Asterisk, freepbx技术文档: www.freepbx.org.cn
  欧米(Omni)智能客服解决方案
  融合通信商业解决方案,协同解决方案首选产品:www.hiastar.com
【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

专题