MRCP v2.0 规范 - RFC6787中文翻译(4)
- MRCPv2规范
除非另有说明,否则MRCPv2消息都是以UTF-8(RFC 3629 [RFC3629]进行Unicode编码,以表示多种不同的语言。例如,DEFINE-GRAMMAR(第9.8节)是一个这样的例外,因为它的主体可以包含任意指定编码的任意XML。MRCPv2还允许在其他字符集中表示消息正文(例如,ISO 8859-1 [ISO.8859-1.1987]),因为在某些语言环境中,其他字符集已被广泛使用。MRCPv2报头(MRCP消息的第一行)和报头字段名称仅使用UTF-8的US-ASCII子集。
消息行由CRLF终止(回车,然后换行)。此外,消息中的某些参数可能包含二进制数据或跨越多行的记录。这些字段具有与参数相关联的长度值来表明消息体的长度。
MRCPv2消息集包括从客户端到服务端的请求、从服务端到客户端的响应,以及从服务端到客户端的异步事件。所有这些消息包括一个起始行,一个或多个标题字段,一个表示标题字段的结束空行(即CRLF之前没有任何内容的行),以及一个可选的消息体。
通用消息 |
= |
起始行 消息头 |
|
|
CRLF [消息体] |
消息体 |
= |
*OCTET |
起始行 |
= |
请求行/响应行/事件行 |
消息头 |
= |
1*(通用头/资源头/通用字段) |
资源头 |
= / / / |
synthesizer-header recognizer-header recorder-header verifier-header |
消息正文包含资源相关和消息相关的数据,用于承载数据的实际媒体类型在定义各个消息的部分中指定。通用头字段在6.2节中描述。如果消息包含正文,则消息必须包含指示消息正文中的数据的媒体类型和编码的内容标题。
MRCP请求、响应和事件消息(在以下部分中描述)中包含MRCP版本信息。关于版本排序,合规性要求和版本号升级,版本兼容性规则遵循[H3.1]。版本信息由’MRCP’(与[H3.1]中的”HTTP”相对)或”MRCP/2.0”(与[H3.1]中的’HTTP/1.1’相对)表示。要符合此规范,客户端和服务端发送MRCPv2消息必须指定MRCP版本的’MRCP/2.0’。使用MRCP-VERSIOn的ABNF产品可以在5.2,5.3和5.5节中找到。
MRCP版本 = "MRCP" "/" 1*2DIGIT "." 1*2DIGIT
message-length字段以Byte为单位指定包括起始行的消息的长度,message-length必须是消息开始的第二个字段,这是为了使消息的框架和解析更简单。message-lengt字段指定消息的长度,包括编码后消息正文中的数据。注意,该值可以通过零填充的(带前导零)作为固定长度的整数给出,以消除或减少消息长度值由于消息长度而改变的情况下的低效率。与MRCP中的所有长度一样,该值将被解释为基数为10的数字。特别是,前导零不表示该值将被解释为实际数字。
消息长度 = 1*19DIGIT
以下示例MRCP交互展示了正确的消息长度值。消息长度的值已从规范中的所有其他示例中删除,并替换为”...”,以减少这些示例中的小消息长度计算错误的混淆。
C->S: MRCP/2.0 877 INTERPRET 543266
Channel-Identifier:[email protected] Interpret-Text:may I speak to Andre Roy Content-Type:application/srgs+xml
Content-ID:<[email protected]> Content-Length:661
<?xml version="1.0"?>
<!-- the default grammar language is US English -->
<grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="en-US" version="1.0" root="request">
<!-- single language attachment to tokens -->
<rule id="yes">
<one-of>
<item xml:lang="fr-CA">oui</item>
<item xml:lang="en-US">yes</item>
</one-of>
</rule>
<!-- single language attachment to a rule expansion -->
<rule id="request"> may I speak to
<one-of xml:lang="fr-CA">
<item>Michel Tremblay</item>
<item>Andre Roy</item>
</one-of>
</rule>
</grammar>
S->C: MRCP/2.0 82 543266 200 IN-PROGRESS
Channel-Identifier:[email protected]
S->C: MRCP/2.0 634 INTERPRETATION-COMPLETE 543266 200 COMPLETE
Channel-Identifier:[email protected] Completion-Cause:000 success
Content-Type:application/nlsml+xml Content-Length:441
<?xml version="1.0"?>
<result xmlns="urn:ietf:params:xml:ns:mrcpv2" xmlns:ex="http://www.example.com/example" grammar="session:[email protected]">
<interpretation>
<instance name="Person">
<ex:Person>
<ex:Name> Andre Roy </ex:Name>
</ex:Person>
</instance>
<input> may I speak to Andre Roy </input>
</interpretation>
</result>
所有MRCPv2消息,响应和事件必须携带信道标识符头字段,以便服务端或客户端可以区分来自共享相同传输连接的不同控制信道的消息。
在第8-11节中资源特定的头字段描述中,除非特别列为允许,否则不允许对该资源的方法(请求,响应或事件)使用头字段。此外,’此头字段可能出现在方法X上’描述表示该方法允许头字段,但不需要在该方法的每个实例中使用。
5.2 请求
MRCPv2请求由请求行后跟消息头部分和可选请求消息的特定数据组成。
从客户端到服务端的请求消息在第一行中包括要应用的方法、该请求的方法标记以及正在使用的协议的版本、
请求行 = mrcp-version SP message-length SP method-name
SP request-id CRLF
mrcp-version字段是客户端正在使用的MRCP协议版本。
message-length字段指定消息的长度,包括起始行。
有关mrcp-version和message-length字段的详细信息,请参见第5.1节。
method-name字段标识客户端向服务端发出的特定请求。每个资源都支持MRCPv2方法的子集。每个资源的子集在相应资源的规范部分中定义。
method-name |
= |
generic-method |
|
/ |
synthesizer-method |
|
/ |
recognizer-method |
|
/ |
recorder-method |
|
/ |
verifier-method |
request-id字段是唯一标识符,可表示为客户端创建并发送到服务端的无符号32位整数。 客户端必须在MRCP会话中对连续请求使用单调递增的请求ID,请求ID空间是线性的,因此空间不会重复,并且可以使用简单的无符号比较操作来检查有效性。 客户端可以为其第一个请求选择任何初始值,但建议使用一个小整数以避免在长会话中耗尽空间。如果服务端收到重复或无序请求,服务端必须拒绝响应代码为410的请求。由于request-id的范围限定为MRCP会话,因此它们在会话中的所有TCP连接和所有资源通道中都是唯一的。
服务端资源必须在对请求的响应中使用客户端分配的标识符。如果请求未同步完成,与此请求关联的异步事件必须携带客户端分配的请求ID。
request-id = 1*10DIGIT
5.3 响应
在接收并解析请求之后,服务端资源回复MRCPv2响应消息。响应消息由响应行和消息头部分以及包含特定方法可选消息体组成。
response-line = mrcp-version SP message-length SP request-id
SP status-code SP request-state CRLF
mrcp-version字段必须包含请求服务端支持的版本否则它必须包含服务端支持的最高版本的MRCP。
message-length字段指定消息的长度,包括起始行。有关mrcp-version和message-length字段的详细信息,请参见第5.1节。
响应中使用的request-id必须与相应请求消息中发送的请求id匹配
状态代码字段是一个3位数字代码,表示请求的成功或失败或其他状态。
status-code = 3DIGIT
请求状态字段指示请求启动的操作是挂起,进行还是完成。COMPLETE状态表示请求已处理完成,并且该资源将不再有具有该请求ID的客户端的事件或其他消息。PENDING状态表示请求已放入队列中,并将按先进先出顺序处理。IN-PROGRESS状态表示正在处理请求但尚未完成。PENDING或IN-PROGRESS状态表示可以使用该请求ID传递更多事件消息。
request-state |
= |
"COMPLETE" |
|
/ |
"IN-PROGRESS" |
|
/ |
"PENDING" |
5.4 状态码
状态代码分为成功(2xx),客户端调用失败(4xx)和服务端调用失败(5xx)代码下。
5.5 事件
服务端可能需要将状态的改变或特定事件的发送给客户端。当请求未立即完成且响应返回PENDING或IN-PROGRESS状态时,来自服务端的事件消息向客户端指示请求的中间结果和事件将发送给客户端。事件消息由事件标题行后跟消息标题部分和包含特定于事件消息的数据的可选消息体组成。标题行具有相应请求和状态值的request-id,如果请求已完成,请求状态值为COMPLETE,这是交互的最后一个事件,否则为IN-PROGRESS。
event-line = mrcp-version SP message-length SP event-name
SP request-id SP request-state CRLF
此处使用的mrcp版本与请求/响应行中使用的版本相同,是服务端上运行的最高版本的MRCP。message-length字段指定消息的长度,包括起始行。有关mrcp-version和message-length字段的详细信息,请参见第5.1节。事件名称标识媒体资源生成的事件的属性。不同的资源有不同有效事件名称集据图请参阅文档的相应资源特定部分。
event-name = synthesizer-event
/ recognizer-event
/ recorder-event
/ verifier-event
事件中使用的请求标识必须与关联此事件的请求中发送的请求标识匹配
请求状态表明与此事件关联的请求/命令是否完成或仍在进行中或者其它异常状态,请求的最终事件具有COMPLETE状态,指示请求已完成。