接口说明
上传语音文件进行分析,文件通常来自用户的呼叫中心;需要注意的几点:
- 需要提供语音文件URL,要求如下:
- 保证公网可访问,同时URL必须是域名,不支持ip;
- 质检完成后,在控制台复核文件时,播放录音使用的仍然是此时提供的url,所以需要保证url长期可用,关于如何保障录音安全,请查看 安全配置
- 系统在处理完成后会立即将文件删除,不会保存文件副本
- 接口会返回taskId,用户有2种方式获取结果:
- 回调:通过在参数中指定
callbackUrl
,在任务完成后由系统主动发起回调;接到回调后再通过getResult
接口获取详细结果
- 轮询:通过此接口返回的taskId轮询
getResult
接口异步获取结果,判断返回中的status
是否完成;由于任务通常需要几分钟的时间完成,需要每次轮询最好等待30秒
- 系统支持单轨文件自动分轨,但为保证分轨准确率,呼叫中心的文件应该尽量保存成双轨
- 需要正确指定语音文件采样率,错误的采样率会导致转写结果错误;通常呼叫中心产生的录音是8K,Mac系统可以用
afinfo <fileName>
来查看;Windows系统可以安装开源软件FFmpeg来查看
- 对于单轨文件,需要指定分轨规则以便区分客服还是客户,可以通过以下2种方式:
- 设置autoSplit为1,同时指定recognizeRoleDataSetId;recognizeRoleDataSetId是某个数据集的ID,因为在创建数据集时已经指定了分轨规则,所以将复用此数据集的规则
- 设置autoSplit为1,同时指定serviceChannelKeywords;serviceChannelKeywords是一组客服可能说的关键词列表;请确保选择那些区别性比较高的关键词
- 对于双轨文件,需要指定哪个轨是客服,哪个轨是客户,可以通过以下2种方式:
- 设置autoSplit为0,同时指定serviceChannel和clientChannel,分别表示客服角色位于哪个轨(比如0),客户角色位于哪个轨(比如1);通常音轨都是从0开始编号,2个轨就是0,1;具体0是客服还是客户,需要用户自行确认
- 设置autoSplit为1,同时指定serviceChannelKeywords,表示通过关键词来确定哪个轨是客服
- 通过参数指定过哪些规则,可以通过以下2种方式:
- 设置ruleIds,指定规则的ID,缺点是如果需要过更多规则,那么需要修改此参数
- 设置ruleBusinessNames,指定规则所在的业务线,优点是如果需要过更多规则,不需要修改此参数,只需要在创建规则时,把规则添加到某个业务线
入参UploadAudioDataRequest说明
属性 |
值类型 |
是否必须 |
说明 |
jsonStr |
String |
是 |
完整Json字符串信息,具体内容参见以下详细信息 |
请求参数与Json字符串信息
属性 |
值类型 |
是否必须 |
说明 |
callList |
List
|
是 |
待检的语音集合,QltyChkCallLine详细属性见下面描述 |
autoSplit |
Integer |
否 |
多数情况下适用于单轨录音,取值:0、1,是否自动分轨,1为自动分轨,0为不分轨;默认:1;若指定为1,则表示上传的音频为单轨; 自动分轨会额外占用处理时间 |
recognizeRoleDataSetId |
Long |
否 |
适用于单轨录音,指定分轨规则:首先通过控制台创建数据集,配置好分轨规则,记录下数据集ID,则本次上传的文件会复用指定数据集的分轨规则 |
serviceChannelKeywords |
List
|
否 |
多数情况下适用于单轨录音,指定客服轨的关键词,请确保选择那些区别性比较高的关键词 |
serviceChannel |
Integer |
否 |
适用于双轨录音,取值:0、1,指定客服的声音轨道,默认0,即第0轨为客服;单轨文件忽略此参数 |
clientChannel |
Integer |
否 |
适用于双轨录音,取值:0、1,指定客户的声音轨道,默认1,即第1轨为客户;单轨文件忽略此参数 |
ruleIds |
List
|
否 |
规则id列表,用于指定录音文件过哪些规则,若不指定,则会过所有规则;注意:单个文件允许最大规则数为100,如果超过100,则会截取前100个规则;如果未指定,则会过所有规则,如果所有规则数超过100,则会取最近创建的100个 |
ruleBusinessNames |
List
|
否 |
业务线名称列表,另一种方式来指定过哪些规则;与ruleIds不同的是,将会过业务线下的所有规则;适用于规则经常变化的场景:新建规则时,将规则加入业务线,则请求参数不需要改动,质检时就可以过新建的规则 |
sampleRate |
Integer |
否 |
8、16,采样率,8k或16k;默认8 |
callbackUrl |
String |
否 |
回调地址,不指定则不回调,请保证公网可用,不支持ip;录音分析完成后会发起回调;回调时,会在callbackUrl后添加taskId=abc×tamp=123&signature=def等信息,其中signature用于调用方判断请求是否来自阿里云;回调详细内容请参见下面章节 |
vocabId |
String |
否 |
自定义热词Id,不指定则不使用热词;id值可以从”基础设置” -> “热词” -> “热词组ID” 中查看 |
modelId |
String |
否 |
模型Id,不指定则使用通用模型;id值可以从”基础设置” -> “语言模型”中查看 |
baseModelId |
String |
否 |
基础模型id,取值:mandarin(中文普通话8k,默认),mandarin16(中文普通话16k),cantonese(粤语,需要开通白名单);默认:mandarin |
待检语音集合QltyChkCallLine对象:
属性 |
值类型 |
是否必须 |
说明 |
voiceFileUrl |
String |
是 |
音频文件Url,注意:1. 地址必须是域名,不支持IP;2. 保证地址在公网上访问。 |
fileName |
String |
否 |
音频文件名称,如audio.wav;虽不是必填项,但为方便统计,请尽量提供此参数;若不提供,则会从voiceFileUrl中获取,比如 http://www.aliyun.com/audio.wav, 则文件名解析为:audio.wav |
autoSplit |
Integer |
否 |
参见上层对象参数说明;如为空,会采用上层对象对应值 |
recognizeRoleDataSetId |
Long |
否 |
参见上层对象参数说明;如为空,会采用上层对象对应值 |
serviceChannel |
Integer |
否 |
参见上层对象参数说明;如为空,会采用上层对象对应值 |
clientChannel |
Integer |
是 |
参见上层对象参数说明;如为空,会采用上层对象对应值 |
sampleRate |
Integer |
否 |
参见上层对象参数说明;如为空,会采用上层对象对应值 |
callStartTime |
Long |
否 |
录音发生的时间,格林威治时间1970年01月01日00时00分00秒到现在的毫秒数,若不指定,则会取当前时间 |
vocabId |
String |
否 |
参见上层对象参数说明;如为空,会采用上层对象对应值 |
customerServiceId |
Long |
否 |
客服Id |
customerServiceName |
String |
否 |
客服姓名 |
skillGroupId |
Long |
否 |
技能组Id |
skillGroupName |
String |
否 |
技能组名称 |
callType |
Integer |
否 |
呼叫类型 1 呼出 3 呼入 |
callee |
String |
否 |
被叫号码,呼出时指的是客户号码,呼入时指的是客服号码 |
caller |
String |
否 |
主叫号码,呼出时指的是客服号码,呼入时指的是客户号码 |
callId |
String |
否 |
通话id,可以是呼叫中心系统中的通话id,或者其他可以标识通话的id |
workplace |
String |
否 |
职场名称,用于分类统计 |
business |
String |
否 |
业务线名称,用于分类统计 |
回调参数说明
假设调用方传入的回调地址是: http://aliyun.com/callback
,那么回调时的完整url为http://aliyun.com/callback?taskId=xxx×tamp=xxx&signature=xxx&event=xxx
, 其中:
- taskId 为任务id
- timestamp 为调用时的时间戳,单位:毫秒
- aliUid 为调用方阿里云主账号uid
- signature 为签名,调用方可用来判断请求是否来自阿里云;计算说明:将taskId=xxx×tamp=xxx&aliUid=xxx 进行md5 + base64加密,注意顺序;调用方接到回调后,taskId和timestamp可以从回调url中获取,aliUid自行在阿里云官网获取,通过计算来比对自己计算出的signature,与url中的signature是否一致
- event 为事件名称,调用方可用来判断是什么事件触发的回调,取值为 TaskComplete:任务完成时的回调;
返回参数说明
返回参数JSON字符串:
属性 |
值类型 |
是否必须 |
说明 |
code |
String |
是 |
结果代码,200表示成功,若为别的值则表示失败,调用方可根据此字段判断失败原因 |
message |
String |
是 |
出错时表示出错详情,成功时为successful |
requestId |
String |
是 |
请求id,提工单时可提供此字段值用于排查问题 |
success |
Boolean |
否 |
请求是否成功,调用方可根据此字段来判断请求是否成功:true表示成功;false/null表示失败 |
data |
String |
是 |
任务ID,在获取任务结果时使用 |
错误码
错误代码 |
描述 |
Http状态码 |
语义 |
InvalidParam |
参数错误 |
400 |
举例:Param voiceFileUrl is invalid: please make sure it is legal url, ip address is not supported |
调用示例
public void uploadAudioData() throws ClientException {
UploadAudioDataRequest request = new UploadAudioDataRequest();
Map chkCallObject = generateLineV2(NOW);
request.setJsonStr(JSON.toJSONString(chkCallObject));
UploadAudioDataResponse response = client.getAcsResponse(request);
Assert.assertEquals(true, response.getSuccess());
String taskId = response.getData();
}
public Map<String, Object> generateLineV2(Date startTime) {
Map<String, Object> param = new HashMap<>(2);
Map<String, Object> call = new HashMap<>(16);
List<Map<String, Object>> callList = new ArrayList<>(2);
callList.add(call);
param.put("callList", callList);
// 自定义模型(如果有)
param.put("modelId", 501);
// 复用dataSetId这个数据集的角色区分规则
param.put("recognizeRoleDataSetId", dataSetId);
// 录音文件地址,必须是域名,且公网可访问
call.put("voiceFileUrl", "https://" + NORMAL_AUDO_1);
// 单轨文件,设置为自动分轨
call.put("autoSplit", 1);
// 以下为录音额外信息
call.put("customerServiceName", "张三");
call.put("customerServiceId", 123L);
call.put("skillGroupName", "技能组-投诉");
call.put("skillGroupId", 123L);
// 呼叫类型 1 呼出 3 呼入
call.put("callType", 3);
call.put("callee", "138xxxx1948");
call.put("caller", "177xxxx2849");
call.put("callStartTime", startTime.getTime());
return param;
}
返回示例
{
"code": "200",
"data": "76DB5D8C-5BD9-42A7-B527-5AF3A5F83F12" ,
"message": "successful",
"requestId": "76DB5D8C-5BD9-42A7-B527-5AF3A5F83F12",
"success": true
}