直播语音离线接口方式获取接口
直播语音离线接口方式获取
接口地址
https://as.dun.163.com/v3/liveaudio/callback/results
接口描述
直播语音检测结果获取接口,获取离线处理的数据后,下次调用,不会再次返回之前获取过的离线数据。
接口请求频率
小于10s/20次,请求频率过快服务器会拒绝处理。
请求参数
该接口参数与请求公共参数一致,详细见 请求公共参数
参数名称 | 类型 | 是否必选 | 最大长度 | 描述 |
---|---|---|---|---|
version | String | Y | 4 | 接口版本v3 |
响应结果
响应字段如下,响应通用字段已省略,详细见 响应公用字段:
result 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
antispam | json数组 | 反垃圾检测结果 |
asr | json数组 | 语音识别检测结果 |
反垃圾检测结果
antispam 数组数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 直播音频提交生成的唯一数据标识,可以根据该标识查询音频数据最新结果 |
dataId | String | 数据id |
callback | String | 产品调用直播语音在线检测传递的 callback 字段数据 |
censorSource | Number | 审核来源,0:易盾人审,1:客户人审,2:易盾机审 |
duration | Number | 直播时长字段,单位s |
evidences | json对象 | 直播断句证据信息 |
reviewEvidences | json对象 | 人审证据信息 |
evidences 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
asrStatus | Number | 音频翻译结果,2:检测中,3:检测完成,4:检测失败 |
asrResult | Number | 音频翻译检测失败原因,1:文件下载失败,2:音频流不存在,3:解析失败,4:文件格式错误 |
action | Number | 检测结果,0:通过,1:嫌疑,2:不通过 |
suggestionLevel | Number | 只有在嫌疑时可能返回,1:低嫌疑,2:高嫌疑 |
startTime | Number | 最近开始时间点,单位毫秒 |
endTime | Number | 最近结束时间点,单位毫秒 |
content | String | 检测命中内容返回 |
speakerId | String | 针对接入SDK监听客户,返回说话人ID信息 |
url | String | 需要开启返回直播语音片段播放地址,请联系易盾策略经理 |
segmentId | String | 断句id |
segments | json数组 | 命中证据信息,通过时数据为空 |
frontSegment | json对象 | 关联证据信息,异常/嫌疑断句命中时返回,命中断句前20s的证据信息,包含前20s的音频语音识别内容及对应url,通过时数据为空 |
frontSegment 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
content | String | 命中断句前20s的语音识别内容 |
url | String | 命中断句前20s的音频url,可解析进行回放 |
segments 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
label | Number | 分类信息,100:色情,200:广告,300:暴恐,400:违禁,500:涉政,600:谩骂,1100:涉价值观 |
level | Number | 分类级别,1:不确定,2:确定 |
subLabels | json数组 | 细分类信息,可能包含多个 |
subLabels 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
details | json对象 | 命中线索信息 |
subLabel | String | 二级细分类,详细编码请细分类编码对应表 |
leaderName | String | 领导人名,若命中领导人声纹,返回对应的领导人名 |
details 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
evidence | String | 命中线索内容 |
hitInfos | json数组 | 线索详细信息 |
hitInfos 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
hitType | Number | 线索分类信息,返回30:表示命中用户自定义添加敏感词 |
hitClues | String | hitTyp命中30自定义添加敏感词,返回命中的自定义敏感词内容,如果没有命中hitType:30,则不返回该字段 |
reviewEvidences 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
action | Number | 审核操作, 1为忽略, 2为警告, 3为断流, 4为提示 |
actionTime | Number | 操作时间, UNIX_TIME时间戳, 毫秒为单位 |
spamType | Number | 违规类型, 100-色情, 115-音乐内容低俗, 116-言论低俗涉黄, 121-发出涉黄声音, 122-ASMR, 200-广告, 211-商业推广, 212-提及竞品, 300-暴恐, 400-违禁, 500-涉政, 511-影响政府形象, 512-邪教迷信, 513-涉军事, 514-涉宗教, 515-国歌、严肃歌曲, 516-涉及少数民族,517-涉及政治敏感话题 800-不文明, 826-传播负面情绪, 827-违反公序良俗, 828-侵害他人隐私, 1000-其他, 1023-无营养, 1027-话题炒作, 1030-挂机, 1050-自定义 |
speakerId | String | 针对接入SDK监听客户,针对房间内具体说话人的处罚,返回说话人ID信息,若为空,则针对房间维度处罚 |
spamDetail | String | 违规详细说明 |
warnCount | Number | 警告次数 |
promptCount | Number | 提示次数 |
segments | json数组 | 人审断句信息, 可为空, 详细结构如下 |
segments 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
startTime | Number | 语音开始时间,单位毫秒 |
endTime | Number | 语音结束时间 ,单位毫秒 |
增值服务-语音识别检测结果
asr 数组数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 唯一标识 |
startTime | Number | 断句开始时间点,单位毫秒 |
endTime | Number | 断句结束时间点,单位毫秒 |
content | String | 语音识别检测结果 |
增值服务-语种识别检测结果
language 数组数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 唯一标识 |
startTime | Number | 语音开始时间,单位毫秒 |
endTime | Number | 语音结束时间 ,单位毫秒 |
content | String | 语种类型,支持检测语种类型请参考语种代码表 |
speakerId | String | 针对接入SDK监听客户,返回说话人ID信息 |
响应示例
当获取到离线结果时,输出示例如下:
{
"code":200,
"msg":"ok",
"result":{
"antispam": [
{
"taskId":"2e81550098974e30b59b6f364348a2b9",
"callback":"",
"dataId":"157473",
"duration":100,
"evidences":{
"action":2,
"asrStatus":2,
"startTime":1587632664165,
"endTime":1587632666955,
"content":"本拉登",
"speakerId": "401139",
"segments":[
{
"label":300,
"level":2,
"subLabels":[
{
"details":{
"evidence":"本拉登"
},
"subLabel":"500013"
}
]
}
],
"url":"",
"speakerId":"http://xxxxx",
"segmentId":"37d9d4612a094d698683619c62539341"
"frontSegment": {
"content": ",老师给墨水多 这幅,那现在没有别的",
"url": "http://as.test.dun.163.com/v1/liveaudio/segment/play?Signature=ca4cf358dbc513d6e3ce873e09812b21&Expires=1619765788075&AccessKey=6e6a8d483e6a4d8f9c35168fabe634e5&BeginTime=1619679383383&EndTime=1619679387223&SpeakerId="
} }
},
{
"taskId":"2e81550098974e30b59b6f364348a2b9",
"callback":"",
"dataId":"157473",
"reviewEvidences":{
"action":4,
"actionTime":1587634142122,
"spamType":828,
"spamDetail":"2132",
"warnCount":0,
"promptCount":2,
"segments":[
],
"status":2
}
}
],
"asr": [
{
"taskId":"2e81550098974e30b59b6f364348a2b9",
"startTime":1587632664165,
"endTime":1587632666955,
"content":"击毙本拉登"
}
],
"language":[
{
"taskId":2e81550098974e30b59b6f364348a2b9,
"startTime":1,
"endTime":10,
"content":"en"
}
]
}
}
当无最新离线结果需要获取时,输出示例如下:
{
"code": 200,
"msg": "ok",
"result":{
"antispam": [],
"asr": []
}
}
直播语音回调方式获取结果
回调方式以数据为维度由客户设置回调地址;直播视频实时检测当检测到异常数据时,调用客户提供的回调接口。
回调接入说明
接入回调方式很简单,只需要在调用在线检测接口请求参数中指定了回调通知参数callbackUrl(即一个http(s)协议接口的URL)。需要您的回调接口支持http协议,支持POST方法,传输数据编码采用utf-8。
业务类型 | 回调参数名称 | 类型 | 最大长度 | 描述 |
---|---|---|---|---|
直播音频 | callbackUrl | String | 256 | 直播音频提交接口添加callbackUrl字段 |
回调状态
您服务端接收到我们回调的结果后,返回的HTTP状态码为200时,表示推送成功,其他的HTTP状态码均视为您接收失败,我们将每隔10分钟推送一次,如果一直失败,持续一天后不再推送;回调接口超时时间设置为2s,为了保证顺利接收数据,客户需保证接收接口性能稳定并且保证幂等性。
请求公共参数
参数名称 | 类型 | 是否必传 | 描述 |
---|---|---|---|
secretId | String | Y | 产品秘钥 id ,由易盾反垃圾云服务分配,产品标识 |
businessId | String | Y | 业务id ,由易盾反垃圾云服务分配,业务标识 |
signature | String | Y | 请求签名,用来验证此次请求的合法性,具体算法见 接口鉴权 |
callbackData | String | Y | 主动推送推送数据,格式为json字符串 |
secretId,businessId,signature参数用来给数据接收接口做签名鉴权用
接口鉴权
回调结果可以通过业务开通时易盾分配的密钥信息字段进行接口鉴权,鉴权粒度是否要精确到业务级别,用户可以根据需要自行决定
/**
* 通过HttpServletRequest做签名验证
*
* @param request
* @return
*/
public static boolean verifySignature(HttpServletRequest request) {
String secretId = request.getParameter("secretId");
String businessId = request.getParameter("businessId");
String signature = request.getParameter("signature");
if (StringUtils.isEmpty(secretId) || StringUtils.isEmpty(signature)) {
// 签名参数为空,直接返回失败
return false;
}
Map<String, String> params = Maps.newHashMap();
for (String paramName : request.getParameterMap().keySet()) {
if (!"signature".equals(paramName)) {
params.put(paramName, request.getParameter(paramName));
}
}
// SECRETKEY:产品私有密钥 SECRETID:产品密钥ID BUSINESSID:业务ID,开通服务时,易盾会提供相关密钥信息
String serverSignature = getSignature(SECRETKEY, params);
return signature.equals(serverSignature) && SECRETID.equals(secretId) && BUSINESSID.equals(businessId);
}
/**
* 生成签名信息
* @param secretKey 产品私钥
* @param params 接口请求参数名和参数值map,不包括signature参数名
* @return
* @throws UnsupportedEncodingException
*/
public static String genSignature(String secretKey, Map<String, String> params) throws UnsupportedEncodingException {
// 1. 参数名按照ASCII码表升序排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 2. 按照排序拼接参数名与参数值
StringBuffer paramBuffer = new StringBuffer();
for (String key : keys) {
paramBuffer.append(key).append(params.get(key) == null ? "" : params.get(key));
}
// 3. 将secretKey拼接到最后
paramBuffer.append(secretKey);
// 4. MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。
return DigestUtils.md5Hex(paramBuffer.toString().getBytes("UTF-8"));
}
直播语音回调数据结构
callbackData为Json字符串,数据结构如下:
机审证据信息回调示例:
{
"taskId":"894c3dca9a4948ecb862c8e5e1f53a8f",
"callback":"自定义内容",
"dataId":"400421",
"censorSource":2,
"duration";100,
"evidences":{
"action":2,
"asrStatus":2,
"startTime":1603703546866,
"endTime":1603703564296,
"content":"嗯。",
"segments":[
{
"label":100,
"level":2,
"subLabels":[
{
"details":{
"evidence":"嗯(分)"
},
"subLabel":"100080"
}
]
}
],
"url":"http://as.dun.163.com/v1/liveaudio/segment/play?SpeakerId=401338",
"speakerId":"401338",
"segmentId":"37d9d4612a094d698683619c62539341"
}
}
人审证据信息回调示例:
{
"taskId":"2e81550098974e30b59b6f364348a2b9",
"callback":"",
"dataId":"157473",
"censorSource":"0",
"reviewEvidences":{
"action":4,
"actionTime":1587634142122,
"spamType":828,
"spamDetail":"2132",
"warnCount":0,
"promptCount":2,
"segments":[]
}
}