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

从今天的章节开始,我们将逐一介绍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.0338SPEAK3214

Channel-Identifier:23eb10a@speechsynth

Content-Type: application/ssml+xml

Content-Length: 213

xml:lang="en-US">

Please leave a message after the beep.

F2 (speechsynth → client)的回复消息如下:

MRCP/2.0 119 3214200IN-PROGRESS

Channel-Identifier: 23eb10a@speechsynth

Speech-Marker: timestamp=857206027059

F3 (speechsynth → client):

MRCP/2.0 156SPEAK-COMPLETE3214 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 187SPEAK3215

Channel-Identifier: 23eb10a@speechsynth

Content-Type: text/uri-list

Content-Length: 70

F2 (speechsynth → client):

Channel-Identifier: 23eb10a@speechsynth

Speech-Marker: timestamp=857206027059

F3 (client → speechsynth):

MRCP/2.0 67PAUSE3216

Channel-Identifier: 23eb10a@speechsynth

F4 (speechsynth → client):

MRCP/2.0 105 3216 200COMPLETE

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

Channel-Identifier:23eb10a@speechsynth

Active-Request-Id-List:3215

F7(speechsynth→client):

MRCP/2.0155SPEAK-COMPLETE3215COMPLETE

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 打断可以使用在以下两种场景中:

语音识别引擎和语音合成资源是各自独立的。

语音识别引擎和语音合成资源耦合度非常高,它们之间需要紧密配合。通常可能是同一厂家的产品。

在以上的使用场景中,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:lang="en-US">

Here is your track. You may pause at anytime by simply

saying pause.

F2 (speechsynth → client):

MRCP/2.0 118 9200200 IN-PROGRESS

Channel-Identifier: 23eb10a@speechsynth

Speech-Marker: timestamp=857206027059

F3 (speechrecog → client):

MRCP/2.0 134START-OF-INPUT10001 IN-PROGRESS

Channel-Identifier:a123c31f@speechrecog

Input-Type:speechProxy-Sync-Id:392812

F4(client→speechsynth):

MRCP/2.0103BARGE-IN-OCCURRED9201

Channel-Identifier:23eb10a@speechsynth

Proxy-Sync-Id:392812

F5(speechsynth→client):

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

--0a23bf1020

Content-Type: application/ssml+xml

Content-Length: 198

xml:lang="en-US">

Say operator to speak with a customer representative

--0a23bf1020--

F2 (speechsynth → client):

MRCP/2.0 118 5000 200IN-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):

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-Type:application/pls+xml

Content-Length:302

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

Content-Type: application/ssml+xml

Content-Length: 184

xml:lang="en-US">

You have a new message from Francesca.

F4(speechsynth→client):

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

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180713G0LTOY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券