呼叫中心短语音识别

一、接口描述

1. 功能描述

将呼叫中心场景下语音转换成文字。

2. 能力说明

语音识别 API 针对呼叫中心场景进行了模型训练和优化,以提高识别准确率。

3. 音频要求

  1. 建议的音频格式:wav、mp3、amr
  2. 建议的音频采样率:8000 Hz
  3. 建议的声道数:单声道
  4. 单次请求的音频时长限制:60 秒以内

4. 接口使用

平台为每个 API 提供试用体验服务,您在 AI 市场选择“免费试用”规格下单后,即可开始体验业内领先的人工智能 API 服务。 免费试用服务具有调用量、QPS 限制,如需更高性能的 API 服务,可以提交咨询工单,联系京东 AI 扩容购买。

在获得使用权限后,您可使用已经封装好的 SDK 参照 接口鉴权 规则进行相应开发,整体流程详见 接入流程

5. Android / iOS开发

为了方便 Android 和 iOS 集成该 API,我们提供了对应的 SDK 供开发者使用,请到下面的链接下载和使用:

二、请求说明

1. 接口地址

https://aiapi.jd.com/jdai/cc_asr

2. 请求方式

post

3. 请求参数

(1)query 请求参数

公共请求参数

名称 类型 必填 示例值 描述
appkey string 80d2b762ecb86593f9668526920f46c 您的 appkey,可在买家中心控制台中获取
timestamp long 1541491668060 请求的时间戳,精确到毫秒,timestamp 有效期 5 分钟
sign string 2e148773a0337a8f2200ba90d445f083 签名,根据规则MD5(secretkey + timestamp)

(2)header 请求参数

业务请求参数

名称 类型 必填 示例值 描述
Content-Type string application/octet-stream 内容类型:
不可用的 Content-Type:
- multipart/form-data
- application/x-www-form-urlencoded
Domain string call_center 模型领域:
- call_center,呼叫中心场景,音频采样率需要为8000Hz。
Application-Id string *123456789 产品ID:
- 业务方应用名称,由业务方在客户端自行生成
Request-Id string *56a847e6-84c0-4c01-bf4b-d566f2d2dd11 请求ID:
- *注意:示例值仅供参考,正式使用请务必通过 uuid 生成
- 对于同一次请求 Request-Id 需要保持一致,多次请求使用同一个将会产生不可预知的错误
Sequence-Id int -1 语音传输分段号:
- 从 1 开始依次递增,最后一段语音取负值,分为下述两种情况:
1. 在一个 Request-Id 中,上传整个音频文件(整包请求)时:填 -1
2. 在一个 Request-Id 中,音频文件分段上传(流式分包请求)时,遵循默认规则依次递增。例如:一次语音识别请求中,音频分 10 次上传,则 Sequence-Id 依次为:1,2,3,4,5,6,7,8,9,-10
Asr-Protocol int 1 通信协议版本号:
- 默认填 1
Net-State int 2 客户端网络状态:
- NETSTATE_NO_NETWORK = 0;
- NETSTATE_NO_WIFI_MOBILE = 1;
- NETSTATE_WIFI = 2;
- NETSTATE_CDMA = 3;
- NETSTATE_EDGE = 4; //移动 2.5G
- NETSTATE_EVDO_0 =5;
- NETSTATE_EVDO_A = 6;
- NETSTATE_GPRS = 7;
- NETSTATE_HSDPA = 8; //联通 3G
- NETSTATE_HSPA = 9;
- NETSTATE_HSUPA = 10;
- NETSTATE_UMTS = 11;
- NETSTATE_EHRPD = 12;
- NETSTATE_EVDO_B = 13;
- NETSTATE_HSPAP = 14;
- NETSTATE_IDEN = 15;
- NETSTATE_LTE = 16;
- NETSTATE_UNKOWN_MOBILE = 20;
Applicator int 1 业务方信息:
- 0:内部业务方
- 1:外部业务方
Property JSON {...} 语音识别请求参数:
- 注意:如果 Sequence-Id 为 1 或 -1 时,则 Property 参数必填;其他情况下,该参数可选填
  • Property 参数
名称 类型 必填 示例值 描述
autoend bool false 服务端自动断尾检测功能开关:
- false:不开启断尾检测
- true:开启断尾检测
platform string Linux&Centos&7.3 平台信息:
格式:{系统信息}&{设备信息}&{系统版本号}
- 系统信息:如 Android,iOS,Linux,Windows
- 设备信息:如 Pixel 3,iPhone X 等
- 系统版本号:设备系统版本,如 2.3.3,4.2.1 等
- 示例:Android&Pixel 3&7.1;iOS&iPhone X&11.4.1
version string 0.0.0.1 客户端版本号
encode JSON {...} 音频参数
biasing_context JSON {...} 动态语言模型参数
  • encode 参数
名称 类型 必填 示例值 描述
channel int 1 音频声道数:
- 只支持单声道音频,单声道填 1
format string wav 音频格式:
- 支持wav,amr,mp3 格式
sample_rate int 8000 音频采样率:
- 呼叫中心场景仅支持 8kHz,填 8000
post_process int 0 数字后处理:
- 0:根据服务端配置是否进行数字后处理
- 1:强制开启数字后处理(开启后,会把结果中的数字汉字转换成阿拉伯数字。例如,识别结果中的"一千"会转成"1000")
- -1:强制关闭数字后处理(关闭后,结果中的数字为汉字数字。例如,"一千")
partial_result int 0 实时部分识别结果:
- 0:根据服务端配置是否返回实时部分识别结果
- 1:强制开启实时部分识别结果(开启后,在识别过程中会实时返回部分识别结果,每次返回的内容都是从语音开头到当前的识别结果,最后返回的结果即是整句的识别结果)
- -1:强制关闭实时部分识别结果(关闭后,在识别过程中无识别结果返回,最后一次请求后返回整句识别结果)
punc_end_process int 0 最终结果标点符号处理:
- 0:根据服务端配置是否增加标点符号
- 1:强制开启整句识别结果标点符号处理(开启后,会把最后整句的识别结果做标点处理。例如,"非常好。")
- -1:强制关闭整句识别结果标点符号处理(关闭后,最后整句的识别结果不会做标点处理。例如,"非常好")
punc_partial_process int 0 实时部分识别结果标点符号处理:(punc_end_process控制最后整句识别结果是否有标点,punc_partial_process控制实时部分识别结果是否有标点,若为打开实时部分识别结果返回,则此配置项不起作用)
- 0:根据服务端配置是否对实时部分识别结果增加标点符号
- 1:强制开启实时部分结果标点符号处理(开启后,会把实时部分识别结果中增加标点处理。例如,"质量很好,")。
- -1:强制关闭实时部分结果标点符号处理(关闭后,不会对实时部分识别结果做标点处理。例如,"质量很好")
dynamic_lm int 0 动态语言模型功能:
- 0:根据服务端配置是否做动态语言模型
- 1:强制开启动态语言模型功能
- -1:强制关闭动态语言模型功能
  • biasing_context 参数(动态语言模型相关参数),若要使用此功能,需要先打开dynamic_lm参数
名称 类型 必填 示例值 描述
context_id string 1 动态语言模型 ID:
- 示例值,填 1
phrase array ["康巴斯顿", "马可波罗"] 动态语言模型短语

(3)body 请求参数

填充待识别的音频数据(二进制)。 音频数据可按照自定义长度进行切分,按顺序分包上传,并与 header 请求参数中的 Sequence-Id 参数的顺序保持对应。

4. 请求代码示例

建议您使用我们提供的 SDK 进行调用,SDK 获取及调用方式详见本页接口描述中的 4.接口使用

Python:

# 注意:
# audiofile:待识别的音频文件
# packagelen:音频切分长度

#coding=utf-8
import requests
import json
import time
import uuid
import hashlib
from urllib.parse import urlencode
import sys
import importlib
importlib.reload(sys)

url = 'https://aiapi.jd.com/jdai/cc_asr'

encode = {
    'channel':1,
    'format':'wav',
    'sample_rate':8000,
    'partial_result':-1,
    'punc_partial_process':-1,
    'punc_end_process':-1,
    'post_process':-1
}

Property = {
    'platform':'Linux&Centos&7.3',
    'version':'0.0.0.1',
    'autoend':False,
    'encode':encode
}

query = {
    'appkey':'your appkey',
    'timestamp':'',
    'sign':''
    }

secretkey = 'your secretkey'

def test_single(audiofile, packagelen):
    query['timestamp'],query['sign'] = sign(secretkey)
    url_query = '?'.join([url, urlencode(query)])
    headers = {
        'Content-Type':'application/octet-stream',
        'Domain':'call_center',
        'Application-Id':'123456789',
        'Request-Id':str(uuid.uuid1()),
        'Sequence-Id':str(-1),
        'Asr-Protocol':str(1),
        'Net-State':str(2),
        'Applicator':str(1),
        'Property':json.dumps(Property)
    }
    seq = 1
    with open(audiofile, 'rb') as f:
        while True:
            body=f.read(int(packagelen))
            if not body or len(body) < int(packagelen):
                headers['Sequence-Id'] = str(-seq)
            else:
                headers['Sequence-Id'] = str(seq)
            print(headers)
            r = requests.post(url_query, headers=headers, data=body)
            print(r.text)
            seq += 1
            if not body or len(body) < int(packagelen):
                break

def sign(secretkey):
    m = hashlib.md5()
    nowTime = int(time.time() * 1000)
    before = secretkey + str(nowTime)
    m.update(before.encode('utf8'))
    return str(nowTime), m.hexdigest()

if __name__ == '__main__':
    audiofile = sys.argv[1] if len(sys.argv) > 2 else audiofile
    packagelen = sys.argv[2] if len(sys.argv) > 2 else packagelen
    test_single(audiofile, packagelen)

三、返回说明

1. 返回参数

(1)公共返回参数

名称 类型 示例值 描述
code string 1000 参见下方错误码-系统级错误码
charge boolean false 或 true false:不扣费, true:扣费
remainTimes long 1305 剩余调用次数;免费api:每天剩余调用次数;收费api:剩余次数;无限制时为-1
remainSeconds long 1223456 剩余调用时间(s);免费api:-1;收费api:剩余调用时间;无限制时为-1
msg string 查询成功 参见下方错误码-系统级错误码
result object {...} 查询结果

(2)业务返回参数

服务器返回的识别结果采用 JSON 格式:

名称 类型 示例值 描述
request_id string 56a847e6-84c0-4c01-bf4b-d566f2d2dd11 请求ID
status int 0 状态码
index int -1 返回结果编号,负数表示全部最终结果
message string 语音数据为空 错误信息
content array [{"text": "你好 京东"}] 识别结果

2. 返回示例

{
    "code": "10000",
    "charge": false,
    "remainTimes": 4998,
    "remainSeconds": -1,
    "msg": "查询成功",
    "result": {
        "request_id": "56a847e6-84c0-4c01-bf4b-d566f2d2dd11",
        "status": 0,
        "index": -1,
        "message": "",
        "content": [
            {
                "text": "你好 京东"
            }
        ]
    }
}

四、错误码

1. 系统级错误码

详见返回码

2. 业务错误码

业务错误码(status) message 说明
31001 "speech data is empty." 语音数据为空
31002 "speech data is too long." 语音数据过长,单次请求音频时长限制为 60 秒内
31003 "request params error." 请求参数出错,缺少 Request-Id、Sequence-Id 或 Application-Id 等。
31004 "speech data file header error." 音频头部格式解析错误
31005 "speech sample rate or channel error." 音频采样率或通道数错误
31006 "speech format error." 音频格式错误
32001 "codec error." 服务内部音频解码错误
32002 "am server internal error." 服务内部 am-server 模块错误
32003 "connect to decoder server error." 无法访问 decoder-server 服务
33001 "decoder server internal error." 服务内部 decoder-server 模块错误
33002 "decoder invoke error." 服务内部语音识别解码失败
Copyright © JD AI Platform all right reserved,powered by GitbookFile Modify: 2021-05-21 22:10:38

results matching ""

    No results matching ""