密级公开
版本10D.2

AICP ASR MRCP开发手册

1. 概述#

1.1 功能介绍#

在电话呼叫等系统中一般使用MRCP接口同客户端的ivr系统进行语音识别交互,在AICP10.x平台的基础上增加对MRCP接口访问ASR能力的支持。

1.2 术语定义#

1.2.1 MRCPv2 协议#

媒体资源控制协议(Media Resource Control Protocol, MRCP)是一种通讯协议,用于媒体资源服务器向客户端提供各种语音服务,目前已定义的媒体资源服务有语音识别(Speech Recognition)、语音合成(Speech Synthesis)、录音(Recording)、说话人鉴别和确认(Speaker Verification and Identifi-cation)。 MRCP并不定义会话连接,不关心服务器与客户端是如何连接的, MRCP消息使用RTSP、SIP等作为控制协议,目前最新的 MRCPv2 版本使用SIP控制协议。(本文使用的是MRCPv2)

1.2.2 MRCP相关协议#

  • SIP(Session Initiation Protocol) 会话初始化协议,用于创建、修改、终止一个或多个参与者的会话。这些会议包括互联网电话,多媒体分发和多媒体会议。
  • SDP(Session Description Protocol) 会话描述协议,传递媒体流信息,允许会话描述的接收者去参与会话。定义了会话描述的统一格式,与SIP配合使用在MRCP中达到创建一个Media Control Channel的目的。
  • RTP(Real-Time Transport Protocol) 实时传输协议,适用于传输实时数据的应用程序,如音频、视频或模拟数据,可通过RTP的子协议RTCP(RTP Control Protocol)保证服务质量。在MRCP中负责对媒体资源进行传输。

1.3 参考资料#

UniMRCP官网
W3C语法文件规范
UniMRCP设计文档
UniMRCP服务配置

1.4 逻辑架构#

MRCP ServerAICP 10平台UniMRCPServerASR PluginASR 能力服务IVR/MRCPv2ClientSIPMRCPv2RTPControlMediaAudio/Text

1.4.1 交互流程#

IVR系统IVR系统MRCP接口服务MRCP接口服务ASR服务ASR服务Broker接口服务Broker接口服务NLU服务NLU服务本地磁盘本地磁盘创建会话通道创建识别资源资源创建完成会话创建完成loop[会话可复用]SET-PARAMS/DEFINE-GRAMMARRECOGNIZE/识别请求/语法文件语法文件解析识别模式创建识别参数设置loop[连续识别流程]语音数据传输opt通过脚本获取录音名字原始音频存储流式语音识别检测到语音开始START-OF-INPUT事件识别结果识别结果解析及过滤opt问题+QA参数问答请求问答结果问题答案根据结果脚本构造结果文本opt最终结果存储altINTERMEDIATE-RESULT事件+结果RECOGNITION-COMPLETE事件+结果销毁会话通道会话销毁完成

2. 识别模式#

2.1 识别模式#

MRCP接口服务通过调用ASR能力的Freetalk引擎,进行语音识别,输出结果以句子为单位。根据业务场景不同细化为:

  • 导航识别模式(voice-guide) 导航识别模式下,可通过语法文件参数选择是否使用语义打断识别逻辑,默认采用语音打断逻辑。检测到一句话完成后上报识别结果完成事件(RECOGNITION-COMPLETE),并退出识别过程。
  • 实时转写模式(speech-to-text) 实时转写模式下,MRCP接口服务端持续识别并上报识别结果中间事件(INTERMEDIATE-RESULT),正常识别中不会主动退出识别过程。

2.2 识别参数控制#

通过语法文件中参数节点,可动态调节每个会话的识别参数,可调内容包括:

  • 是否启动no-input计时器(start-input-timers
  • 静音头部超时时间(no-input-timeout
  • 识别内容超时时间(recognition-timeout
  • 语音检测灵敏度(sensitivity-level
  • 静音尾部检测时间(speech-complete-timeout
  • 识别领域属性(property

3. 对接说明#

AICP平台MRCP对接方式,采用传入语法文件的方法,可控制识别参数、识别语言领域、热词优化功能、语义打断功能、broker接口调用功能。 语法文件总览: 使用时请按需要进行裁剪避

<?xml version="1.0" encoding="utf-8"?>
<grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="en-US" version="1.0" mode="voice" root="service">
<rule id="service">
<ruleref uri="#voice-guide" />
</rule>
<rule id="voice-guide">
<!-- 识别语言领域属性 -->
<property>cn_8k_common</property>
<!-- 识别参数节点 -->
<asr-params>no-input-timeout=10000;recognition-timeout=15000;sensitivity-level=0.18;speech-complete-timeout=500;sa-output-speed=0;sa-output-volume=0;sa-check-emotion=0</asr-params>
<!-- 语义识别节点 -->
<semantic-interrupt>{"enable":1,"force_interrupt_word_count":6, "allow_interrupt_duration":100,
"blacklist":{"enable_flag":1, "allow_match_blacklist_count":6,"word_list":"嗯|知道了"},"whitelist":{"enable_flag":1,"word_list":"白名单"}}</semantic-interrupt>
<!-- 访问broker节点 -->
<need-qa>{ "address": "http://10.10.10.161:8080/CSRBroker/queryAction", "userId": "123456.98765","qa":{"xxx":"yyy"}</need-qa>
<!-- 热词引用节点 -->
<userword><ruleref uri="#wordlist" /></userword>
<!-- 热词ID -->
<userwordid>abcdefg</userwordid>
<!-- 识别结果回调,可用于结果HTTP POST发送给第三方进行记录或上屏使用 -->
<result-callback-url tag="yibot">http://10.1.16.106:8888/v2/ws</result-callback-url>
</rule>
<!-- 热词定义节点 -->
<rule id="wordlist">
<one-of>
<item>捷通华声[jie2 tong1 hua2 sheng1]</item>
</one-of>
</rule>
</grammar>

注:xml各个节点的内容保持在一行书写,避免解析xml出现异常

3.1 识别模式设置#

通过以下配置格式配置该节点内容,可控制识别模式

<rule id="service">
<ruleref uri="#voice-guide" />
</rule>

当配置了具体识别模式后,需要创建对应的实际节点参数,参考以上voice-guide模式的格式即可。支持的识别模式有:

  • voice-guide
  • speech-to-text

3.1.1 voice-guide单句交互模式#

  • 应用场景
    • 应用在需要多轮对话的场景,如导航、外呼等。
  • ASR模式
    • 内部使用ASR引擎的continue模式,携带本次识别的第一句识别结果,通过MRCP识别完成事件RECOGNITION-COMPLETE返回给调用者。
  • 工作时序图
MRCP Client客户端MRCP Server接口服务会话创建INVITE200 OKACKloop[会话资源可复用]识别请求RECOGNIZE200 IN-PROGRESS消息响应START-OF-INPUTRECOGNITION-COMPLETE停止识别optSTOP200 OK会话结束BYE200 OK

3.1.2 speech-to-text连续转写模式#

  • 应用场景
    • 应用在只进行连续实时转写的场景。如通话内容全文录音记录等。
  • ASR模式
    • 内部使用ASR引擎的continue模式,以句子为单位,通过MRCP事件连续输出给调用者每一句的识别结果。连续转写模式流程中引入了中间识别事件,在原有识别事件
    recognizer-event = "START-OF-INPUT"
    / "RECOGNITION-COMPLETE"
    / "INTERPRETATION-COMPLETE"
    / "INTERMEDIATE-RESULT" ///< 扩展事件
    中新扩展了INTERMEDIATE-RESULT事件,使其能携带结果信息。因为是实时转写,MRCP接口服务一般不会主动上报RECOGNITION-COMPLETE,除非MRCP Server遇到识别不可继续下去的严重错误,才会上报。
  • 注1:该识别事件是非标准mrcp协议规定,固使用前需定提客户端已经实现对INTERMEDIATE-RESULT事件的解析及处理
  • 注2:连续转写该模式下,超时时间相关逻辑无效
  • 工作时序图
    MRCP Client客户端MRCP Server接口服务会话创建INVITE200 OKACKloop[会话资源可复用]识别请求RECOGNIZE200 IN-PROGRESS消息响应START-OF-INPUTINTERMEDIATE-RESULT...INTERMEDIATE-RESULT停止识别optSTOP200 OK会话结束BYE200 OK

3.2 识别领域及语言设置#

配置格式如下:

<!-- 识别领域属性 -->
<property>cn_8k_common</property>

根据实际场景配置正确参数,如节点不存在,缺省默认为cn_8k_common 例如:

配置串说明
cn_8k_common8K 人机
cn_8k_zhijian8K 人人

3.3 识别参数设置#

配置格式如下:

<!-- 识别参数节点 -->
<asr-params>no-input-timeout=10000;recognition-timeout=15000;sensitivity-level=0.18;speech-complete-timeout=500;sa-output-speed=0;sa-output-volume=0;sa-check-emotion=0</asr-params>

参数含义如下:

字段名含义范围说明
no-input-timeout未检测到输入时超时门限[0,30000];单位ms;默认:10000当开始识别后,未检测到语音(即开始讲话)的时间片累计超过此设定阈值后,
MRCP接口发送识别完成事件RECOGNITION-COMPLETE给客户端,事件原因填充为no-input-timeout,同时终止本次识别。
start-input-timers是否启动no-input定时器{true,false},默认false当值为false是,虽然开始识别,但是不启用no-input内部计时,也即不做no-input-timeout的时间片累计。
recognition-timeout识别时语音超时门限[0,60000];单位ms;默认:30000当识别开始(检测到语音)时,超过该阈值依然没有匹配到识别结果,
MRCP接口发送识别完成时间RECOGNITION-COMPLETE给客户端,有识别结果时事件原因填充为recognition-timeout
speech-complete-timeout识别完成后需要接收的静音时长[0,30000];单位ms;默认:500输出结果前留给尾部检测所需静音时长,原理等同于静音尾断点检测时长。
sensitivity-level语音检测灵敏度[0,1.0];默认0.15语音检测过程中低于该门限的语音将被当做静音数据,同VAD断点检测阈值
sa-output-speed语速检测开关[0,1];无设置时,以本地配置文件为准识别完成后输出对应脚本可编程项,配合结果脚本可返回给用户
sa-output-volume音量检测开关[0,1];无设置时,以本地配置文件为准识别完成后输出对应脚本可编程项,配合结果脚本可返回给用户
sa-output-emotion情绪检测开关[0,1];无设置时,以本地配置文件为准识别完成后输出对应脚本可编程项,配合结果脚本可返回给用户

3.4 语义打断参数设置#

配置格式如下:

<!-- 语义识别节点 -->
<semantic-interrupt>{
"enable":1,"force_interrupt_word_count":6,
"allow_interrupt_duration":100,
"blacklist":{"enable_flag":1, "allow_match_blacklist_count":6,"word_list":"嗯|知道了"},
"whitelist":{"enable_flag":1,"word_list":"白名单"}}
</semantic-interrupt>

3.4.1 功能概述#

在mrcp接口中增加对识别结果的判断来返回打断TTS播报的interrupt标识。在使用语义打断的情况下,服务端判断如果语法文件中有语义打断的语法文件,则服务端asr识别采用continue-rt模式,语音流实时传输, mrcp接口层根据rt模式下返回的分片结果来判断是否进行打断。mrcp结果返回仍为一次整句的识别结果, asr有识别结果但是并未有打断的时候,识别结果不通过mrcp对外返回,如“嗯”、“好的”等未触发语义打断逻辑的识别内容。

3.4.2 打断逻辑流程#

3.4.2.1 打断逻辑流程描述#

判断是否进行打断的逻辑原则和优先级顺序如下:

  1. 在识别时间小于“不允许打断时间阈值”的情况下,无论如何都不进行打断;
  2. 当识别结果超过“直接打断阈值”时,发送打断标识并打断,返回识别结果;
  3. 当时别结果未超过“直接打断阈值”:
    • 检测到白名单,则进行打断,返回识别结果;
    • 识别结果未超过“黑名单生效阈值”、未检测到白名单且识别结束,不进行打断;
    • 识别结果超过“黑名单生效阈值”、检测到黑名单则不打断;
    • 识别结果超过“黑名单生效阈值”、未检测到黑名单且识别结束,发送打断标识并打断,返回识别结果。
3.4.2.2 打断逻辑流程图#

语义匹配逻辑仅在 start-input-timers定时器未开启时生效

伪码术语:

  • recog_duration:已识别时间片(单位ms)
  • recog_word_count:已识别字符个数
  • allow_interrupt_duration:开始允许打断时间门限(单位ms),首次识别打断事件延迟生成时间,即保护TTS播报的最少时间
  • whitelist:白名单
  • blacklist:黑名单
  • allow_match_blacklist_count;黑名单生效字数阈值
  • force_interrupt_word_count: 强制打断阈值门限
  • start_of_input:返回给ivr用于打断的事件
  • recog_text:识别结果
  • interrupt_flag:打断标记默认0
recog_duration累计recog_word_count统计recog_duration>=allow_interrupt_durationstart_of_inputyesinterrupt_flag==1&&未发送start_of_input?yesrecog_word_count>=force_interrupt_word_countinterrupt_flag=1返回识别结果yes本句话识别完成?yesrecog_text in whitelistinterrupt_flag=1返回识别结果yes本句话识别完成?yesrecog_word_count>=allow_match_blacklist_countrecog_text in blacklistyes忽略识别结果start_of_input返回识别结果yes本句话识别完成?ASR流式识别yes

3.4.3 打断逻辑约束条件#

  1. 强制打断阈值门限要根据实测效果合理选取,不宜过短,否则可能出现误打断情况较多
  2. 黑名单生效字数阈值要小于强制打断门限,不宜过长,否则黑名单处理逻辑将可能不会执行
  3. 开始允许打断时间门限时间,不宜过长,否则打断产生时间过于滞后,影响用户体验
  4. 黑名单构造时单词长度不应该超过,强制打断阈值,否则该单词也不会生效
  5. 语义打断语法文件中节点内容没有传输有效的内容时将会返错,中断识别
  6. 语义打断的黑白名单匹配逻辑仅在start-input-timers:false时进行(防止TTS播报之后正常识别内容落在名单逻辑中而被忽略的情况)

3.4.4 语义打断黑白名单节点参数#

语义打断节点参数包括:

  • 是否启动语义打断 enable (0:不启用,1:启用)
  • 强制打断时字符阈值 force_interrupt_word_count(单位:字符个数)
  • 开始允许打断时间门限 allow_interrupt_duration(单位:ms)
  • 黑名单内容blacklist
  • 白名单内容whitelist
3.4.4.1 黑名单节点说明#

黑名单节点参数包括:

  • 是否启用黑名单功能(0:不启用,1:启用)
  • 黑名单生效字数阈值(单位:字符个数)
  • 黑名单词表内容(每个词使用 “|” 分割开)
"blacklist":
{
"enable_flag": 1,
"allow_match_blacklist_count": 2,
"word_list": "嗯|你好|你说"
}
3.4.4.2 白名单节点说明#

白名单节点参数包括:

  • 是否启用白名单功能(0:不启用,1:启用)
  • 白名单词表内容(每个词使用 “|” 分割开)
"whitelist":
{
"enable_flag": 1,
"word_list": "没时间|等一下|报警了"
}

3.4.5 识别结果处理说明#

  1. 当识别了多句话之后才触发了白名单打断逻辑,从触发打断那一句话起向后拼接所有识别结果,触发打断之前的独立语句将会被忽略。如果此时前一句话识别完成,后一句话未完成,未完成句子的直接丢弃。
  2. 当识别过程中触发了黑名单的语句将会被忽略掉。
  3. 识别结果存在标点符号的将会过滤掉标点符号后再比对。

3.5 访问Broker问答接口#

配置格式如下:

<!-- 访问broker节点 -->
<need-qa>{ "address": "http://10.10.10.161:8080/CSRBroker/queryAction", "userId": "123456.98765","qa":{"xxx":"yyy"}}</need-qa>
  • 其中address为broker问答接口地址
  • 其中userId为用户标识,当该参数不为空时,请求broker接口时在qa节点下会带回该字段内容,否则会填入channelid作为userId标识给broker接口。
  • 其中qa为需要透传的相关参数,mrcp接口会在该根下拼接"query":"识别内容"等字段。例如访问broker时的包体为:
    {
    "xxx":"yyy",
    "userId": "123456.98765",
    "query": "今天天气如何",
    "timeStart":600,
    "timeEnd":1000,
    "sendTime":123456,
    "audioFile":"123456ABDE.pcm"
    }

mrcp接口不再校验qa节点下json字段及内容,可方便方案层透传自己的定制化参数

3.6 热词节点的使用#

配置格式1如下:

<rule id="voice-guide">
<!-- 热词引用节点 -->
<userword><ruleref uri="#wordlist" /></userword>
</rule>
<!-- 热词定义节点 -->
<rule id="wordlist">
<one-of>
<item>用户热词</item>
<item>捷通华声[jie2 tong1 hua2 sheng1]</item>
</one-of>
</rule>
  • 其中#wordlist为定义热词标签的引用
  • <rule id="wordlist">为实际定义的热词标签,每一个<item>表示一个热词

配置格式2如下:

<rule id="voice-guide">
<!-- 热词ID节点 -->
<userwordid>abcdefg</userwordid>
</rule>
  • 其中abcdefg应该通过平台HTTP接口预先创建,确保mrcp调用前已经存在
  • userwordid的优先级高于配置1中的userword词表

3.7 识别结果回调#

配置识别结果回调

<!-- 识别结果回调,可用于结果HTTP POST发送给第三方进行记录或上屏使用 -->
<result-callback-url tag="yibot">http://10.1.16.106:8888/v2/ws</result-callback-url>
  1. 其中tag标签用于区分不同厂家的post格式
  2. 节点内容为回调接口地址
  3. 配置文件aicp_asr_mrcp.toml中设置对应生成格式脚本例如: intermediate_result_post_process=../script/guangda_result_post_process.lua

4. 版本记录#

接口版本平台支持版本组件及支持版本修改内容
10.0.010C.1aicp_asr_mrcp 10.6.0适配中兴ivr识别流程
10.0.010C.0aicp_asr_mrcp 10.5.0监控接口修改
10.0.010B.3aicp_asr_mrcp 10.4.0放开对broker的json格式限制
10.0.010B.2aicp_asr_mrcp 10.3.0新增tag标签适配网关查找
redis支持哨兵密码
10.0.010B.1aicp_asr_mrcp 10.2.0支持toml配置
10.0.010A.2aicp_asr_mrcp 10.0.0初始版本