快速开始

Release Notes

版本 日期 说明
0.1.0 2018.02.22 第一版!
0.1.2 2018.03.19 压缩性能优化
0.1.3 2018.03.29 新增切句配置
0.1.4 2018.07.09 增加扩展信息,语音识别文本流携带毫秒级时间戳,完整句携带语速

接入准备

  • 参考“流程说明”—>“免费服务申请”完成权限申请;
  • 点击智能电销及实时语音识别-MrcpServer完成MrcpServer下载;
  • 开发环境依赖:

    • Linux 64位 centos 6u3
    • gcc: 482 以上libc,CXX11,百度提供gcc4.8.2压缩包,存放于libs目录下,解压后执行bootstrap.sh完成默认配置
    • curl : 7.33
    • ssl : 1.0.1i
    • daemontools 守护进程
    • 须有root账户权限运行,curl、ssl服务器未安装或版本不够,请自行安装或升级。
  • 开发机对conf/recogplugin.json配置中“app.serverAddress”(服务访问)、“app.authAddress”(鉴权)地址开放公网访问权限;

  • 详见下文“测试mrcpserver”,运行自带paasclient,熟悉mrcpserver的运行情况

并发限制

受内存,核数限制,4核8G内存,并发数为20。

语音流改造

要求项 取值要求
音频格式 PCM
采样率 8KHz
采样精度 16bits
声道 单声道
实时语音流发送间隔 20ms~160ms内任意10的倍数,建议最佳发送间隔160ms
压缩选项 压缩为原始大小的1/8,节省带宽,但是音频质量会有损失
分轨 为保证识别效果,进行话者分离,拆分通话双侧音频流为两通路

输出

key 值说明
格式 详见下文识别结果说明
语音识别 实时逐字识别文字,由静音检测识别出的完整句,文字对应开始&结束时间,完整句对应语速
语义识别 utf8编码,意图、槽位
输出方式 回调,实时返回

语速 = 完整句字数 / 秒。其中,单个单词整体算作1个字,不会按实际字母数统计。

目录结构

${SERVER_ROOT}
|--- bin    // 服务可执行程序
    |--- control // 启动脚本
    |--- bootstrap.sh // 初始化环境
|--- conf // 配置文件
    |--- recogplugin.json // 识别插件配置文件
|--- data  // 数据资源
|--- include // 头文件
|--- lib     // 依赖库
|--- libs    // 依赖库
|--- log // 日志目录
|--- plugin // 插件及依赖

参数配置

识别相关配置文件目录 ${SERVER_ROOT}/conf/recogplugin.json ,参考“流程说明”—>“免费账号和服务申请”流程,进入应用“概览”页面,点击左侧导航“应用列表”,查询“API Key”和“Secret Key”。必须修改

"app.appKey": "API Key",  
"app.appSecret": "Secret Key", 
"app.scope": "brain_bicc",

其他参数,无特殊需求,无需修改,保持现状。

配置项说明

key 类型 必选 说明 默认值
app.appKey string Y app key -
app.appSecret string Y app secret -
app.compress bool Y 是否开启压缩。为解决带宽,默认压缩 true
app.machineName string N 器唯一标识。
建议填写mac地址(移除冒号,如14-10-9f-df-45-4f)或有唯一性含义的hostname
app.serverAddress string Y 服务器地址(若使用https必须libcurl支持) -
app.authAddress string Y 验证服务地址(若使用https必须libcurl支持) -
app.upload.threads number N 上传线程数(根据并发数和实际网络状况与我们沟通后修改) 4
app.upload.duration number N 上传线程超时时间(秒,根据实际网络状况与我们沟通后修改) 900
log.toStandardOutput 0/1 Y 日志是否输出至标准输出 1
log.toFile 0/1 Y 日志是否输出至文件 0
log.filename string Y SDK日志输出文件名
log.plugin.filename string Y 插件日志输出文件名
log.maxLogFileSize number N 日志文件最大限制 10 1024 1024
log.enableDebug 0/1 Y 开启Debug日志 -
log.enableInfo 0/1 Y 开启Info日志 -
log.enableWarning 0/1 Y 开启Warning日志 -
log.immediateFlush 0/1 Y 日志是否实时flush -
userparams string N 用户定制化参数
app.scope string Y 使用的服务。
brain_bicc: 实时识别。

关于 userparams 参数
目前支持的参数包括:

  • 结果返回模式
"sentenceHandler": {
    "client": "STANDARD_COMPLETED",
    "agent": "STANDARD_COMPLETED"
}

client 和 agent表示对应用户与坐席的返回类型设置,支持的结果返回模式包括

含义 备注
STANDARD_COMPLETED 完整句切句 屏蔽掉所有过程句子,只下发完整句。
NONE 实时翻译结果 默认值,逐字识别结果及完整句

识别结果

识别结果通过回调,返回的字段说明如下:

key 说明 必选 内容
appId 标识所属app
callId 知识所属call
roleCategory 知识所属于角色 AGENT,座席;CLIENT,客户
category 知识类型 TXT,文本;
INTENT,意图;
KNOWLEDGE,知识;
SPEECH,合成语音(url地址);
EVENT,事件
content 知识内容 返回的知识的内容
triggerTxt 触发知识的文本 string
triggerTime 触发知识的时间 timestamp
extJson 扩展字段 扩展字段
logId 本次返回标识 String

extJson字段说明

key 说明 必选 内容
completed 识别文本状态 取值1和3。1,过程中逐字识别结果;3,vad切分产生的完整句
snStartTime 文本开始时间 毫秒级,样例:00:00.100
snStopTime 文本结束时间 毫秒级,样例:00:01.100
speed 完整句语速 完整句字数 / 秒。其中,单个单词整体算作1个字,不会按实际字母数统计。

返回示例:

<result>
    <interpretation grammar="" confidence="1.0">
        <instance>
            <callId>20913-35009.1520997556725710129-423467</callId>
            <logId>02bbdf02-c00a-45eb-ae9d-6a7a6d1f74b9_8</logId>
            <rolecategory>AGENT</rolecategory>
            <categotyId>TXT</categotyId>
            <extJson>
                <snStartTime>00:01.600</snStartTime>
                <snStopTime>00:09.759</snStopTime>
                <speed>5.39</speed>
            </extJson>
        </instance>
        <input mode="speech">医学考试时间</input>
    </interpretation>
</result>

使用mrcpserver

  1. 每次替换MrcpServer安装包,都需要在${SERVER_ROOT}/ 目录,root权限下执行 sh bootstrap.sh ,主要功能:完成百度自带gcc4.8.2的环境配置。
  2. 启动:${SERVER_ROOT}/bin目录执行 ./control start
  3. 停止:${SERVER_ROOT}/bin目录执行 ./control stop
  4. 重启:${SERVER_ROOT}/bin目录执行 ./control restart
  5. 查看服务状态:${SERVER_ROOT}/bin目录执行 ./control status

服务启动中遇到的问题:

  • 若执行control start失败,请按照以下步骤排查服务

1、在${SERVER_ROOT}/bin目录执行

[root@xxx bin]$ ./unimrcpserver 
bash: ./unimrcpserver: /opt/compiler/gcc-4.8.2/lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory,

说明bootstrap.sh执行失败,请移步压缩包自带README文件,手动完成gcc4.8.2的配置。

2、若单独启动unimrcpserver正常,命令行直接输入“supervise”,若supervise非系统命令,说明守护进程安装失败,请检查守护进程。

  • 日志中的常见错误

    错误信息 解决
    err_code":210 recogplugin.json中填写app.appKey,app.appSecret
    Config 'app.scope' empty recogplugin.json中填写app.scope
    err_code":321 鉴权失败,
    检查本机是否可以访问recogplugin.json中app.authAddress对应地址
    "err_code":322 百度智能云端服务访问失败,
    检查本机是否可以访问recogplugin.json中app.serverAddress对应地址
    408 ACK Timeout conf/unimrcpserver.xml 同时配置内网、外网IP,SIP三次握手建立连接,
    client请求server地址为内网地址,
    但server返回status 200包给client使用的是client的外网地址,client未接收到。
    可对server抓包,确认返回ip是否符合预期
    Quota limit reached: Concurrency exceeded 访问量超过可用额度,
    一次SIP连接创建,配额+1,
    请注意,需client向server发送SIP断开,释放配额,
    若不主动断开,百度侧将在15分钟之后自动释放配额

测试mrcpserver

运行测试client: 请至${SERVER_ROOT}/bin目录,运行 ./paasclient, 输入run recog


默认ip为:本机内网地址

默认sip端口为:8060

默认rtp端口为:5000-6000

配置外网ip、更改端口配置详见压缩包自带README文件

当前paasclient代码逻辑为支持一次识别结果返回,与MrcpServer能力无关,MrcpServer可支持连续识别结果返回。

客户端要求

保持一通电话单侧(坐席|客户)使用同一个SIP连接。

SIP头部扩展参数P-UserData(可选字段),携带callid及roleid,格式说明及事例如下:

字段 含义 值类型 默认值 备注
callid 一通电话唯一标识 String 格式需要满足 ^[0-9a-zA-Z_\.-]{16,128}$ 正则要求
roleid 角色标识 int 1 可选。0-坐席,1-客户

示例

c sip:39.107.25.82:5060 SIP/2.0   
Via: SIP/2.0/UDP 114.215.196.183:5092;rport;branch=z9hG4bKHXm44FX131NFF   
Max-Forwards: 70 
From: <sip:114.215.196.183:5092>;tag=BcjjUe581cFUj 
To: <sip:39.107.25.82:5060> 
CSeq: 118054628 INVITE 
User-Agent: CCP 
P-UserData:callid=aaa79db9-7b80-1236-08a2-00163e02342e,roleid=1
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, PRACK, MESSAGE, SUBSCRIBE, NOTIFY, REFER, UPDATE
Supported: timer, 100rel 
Content-Type: application/sdp 
Content-Disposition: session
Content-Length: 334

重要提示,P-UserData为非必须扩展字段。
返回结果

MRCP/2.0 709 RECOGNITION-COMPLETE 2 COMPLETE
Channel-Identifier: b6c5e7958133499c@speechrecog
Completion-Cause: 000 success
Content-Type: application/nlsml+xml
Content-Length: 522

<?xml version="1.0" encoding="utf-8"?>
<result>
    <interpretation grammar="" confidence="1.0">
        <instance>
            <callId>20913-35009.1520997556725710129-423467</callId>
            <logId>02bbdf02-c00a-45eb-ae9d-6a7a6d1f74b9_8</logId>
            <rolecategory>AGENT</rolecategory>
            <categotyId>TXT</categotyId>
            <extJson>
                <snStartTime>00:01.600</snStartTime>
                <snStopTime>00:09.759</snStopTime>
                <speed>5.39</speed>
            </extJson>
        </instance>
        <input mode="speech">医学考试时间</input>
    </interpretation>
</result>