直播音视频解决方案结果获取
直播音视频解决方案离线接口方式获取
接口地址
http://as.dun.163.com/v2/livewallsolution/callback/results
接口描述
该接口用于获取直播音视频解决方案回调结果。建议您使用POST请求, 且仅接受 application/x-www-form-urlencoded 编码格式。
接口请求频率
小于10s/20次,请求频率过快服务器会拒绝处理。
请求参数
该接口参数与请求公共参数一致,详细见 请求公共参数
参数名称 | 类型 | 最大长度 | 描述 |
---|---|---|---|
version | String | 4 | v2.1 |
响应结果
响应字段如下,响应通用字段已省略,详细见 响应通用字段 :
参数名称 | 类型 | 描述 |
---|---|---|
result | json数组 | 检测结果数组 |
result 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 唯一标识 |
callback | String | 产品提交直播流信息时带的 callback 字段数据,用于标识直播流,产品根据业务情况自行设计 |
dataId | String | 数据唯一标识,能够根据该值定位到该条数据,如对数据结果有异议,可以发送该值给客户经理查询 |
status | Number | 检测状态,101为检测中,102为检测结束 |
censorSource | Number | 审核来源,0:易盾人审,1:客户人审,2:易盾机审 |
duration | Number | 直播时长字段,直播结束返回直播整体时长,单位ms |
riskLevel | Number | 直播异常风险等级, 0-正常,1-低危,2-中危,3-中高危,4-高危 |
riskScore | Number | 直播异常分数 |
evidences | json对象 | 机审证据信息 |
reviewEvidences | json对象 | 人审证据信息 |
机审证据信息
evidences 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
audio | json对象 | 直播语音证据信息 |
video | json对象 | 直播截图证据信息 |
audio 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
action | Number | 检测结果,0:通过,1:嫌疑,2:不通过 |
asrStatus | Number | 音频翻译结果,2:检测中,3:检测完成,4:检测失败 |
asrResult | Number | 音频翻译检测失败原因,1:文件下载失败,2:音频流不存在,3:解析失败,4:文件格式错误 |
speakerId | String | 针对接入SDK监听客户,返回说话人ID信息 |
startTime | Number | 最近开始时间点,单位毫秒 |
endTime | Number | 最近结束时间点,单位毫秒 |
content | String | 检测命中内容返回 |
url | String | 需要开启返回直播语音片段播放地址,请联系易盾策略经理,如未开启则不返回url |
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 | 二级细分类,详细编码请参考下方对应细分类编码对应表 |
details 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
evidence | String | 命中线索内容 |
video 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
evidence | json对象 | 证据信息 |
labels | json数组 | 分类信息详细数据 |
evidence 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
beginTime | Number | 视频直播当前时间点,单位为毫秒,调用方获取后可自行格式化为可视化时间,如:1599205126000 转换为"2020-09-04 15:38:46" |
endTime | Number | 视频直播当前时间点,单位为毫秒,调用方获取后可自行格式化为可视化时间,如:1599205126000 转换为"2020-09-04 15:38:46" |
type | Number | 1:图片,2:视频 |
url | String | 证据信息 |
speakerId | String | 针对接入SDK监听客户,返回说话人ID信息 |
frontPics | json对象数组 | 关联信息-命中前截图信息 |
frontPics 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
url | String | 截图地址 |
labels数据结构
参数名称 | 类型 | 描述 |
---|---|---|
label | Number | 分类信息,100:色情,110:性感;200:广告,210:二维码,260:广告法,300:暴恐,400:违禁,500:涉政,800:恶心类,900:其他,1020:黑屏,1030:挂机,1100:涉价值观 |
subLabels | json数组 | 细分类信息,可能包含多个,可能为空 |
level | Number | 级别信息,分为1:不确定,2:确定 |
rate | Number | 分数 |
subLabels 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
subLabel | Number | 细分类,详细编码请参考下方对应细分类编码对应表 |
rate | Number | 置信度分数,0-1之间取值,1为置信度最高,0为置信度最低 |
details | json数组 | htiInfos:命中详细信息 |
details 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
hitInfos | String | 针对命中sublabel的补充说明 |
imageTagInfo | json数组 | 命中标签详细信息,对于返回的hintInfo的解释说明,可能为空 |
imageTagInfo 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
tagName | String | hinInfo中可返回的图片中包含的可识别内容 |
tagGroup | String | tagName对应的分组名称,用于对tageName的解释 |
直播音视频人审证据信息
reviewEvidences 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
action | Number | 审核操作, 1为忽略,2为警告,3为断流,4为提示,10为机器检测结束 |
actionTime | Number | 操作时间,UNIX_TIME时间戳,毫秒为单位 |
label | Number | 违规类型,100-色情,111-淫秽表演,112-偶然走光,113-服装暴露,114-床上直播,115-音乐内容低俗,116-言论低俗涉黄,117-违规服装,118-上装暴露,119-下装暴露,120-低俗连麦,121-发出涉黄声音,122-ASMR,123-字幕低俗,124-出现不雅物品,125-低俗妆容,126-传播色情,200-广告,210-二维码,211-商业推广,212-提及竞品,213-字幕推广214-竞品标识,215,竞品播放器,,300-暴恐,311恐怖主义,312-暴力血腥,400-违禁,411-危险表演,412-涉毒/赌/传销,413-违禁服装,414-监管类违禁游戏,415-赌博游戏,416-赌博信息,500-涉政,511-影响政府形象,512-邪教迷信,513-涉军事,514涉宗教,517-涉及政治敏感话题,518-出现国旗国徽,519-出现领导人画像,800-不文明,811-非漏点赤膊,,812-性感,821-涉酒,822-涉烟,823-纹身,824-未成年,825-危险驾驶,826-传播负面情绪,1000-其他,1020-黑屏,1022-画质差,1023-无营养,1024-盗播版权内容,1025-无音乐设备,1026-与音乐无关,1028-无版权游戏,1029-非普通话直播,1030-挂机,1031-私密场所直播,1032-卡顿,1050-自定义 |
speakerId | String | 针对接入SDK监听客户,针对房间内具体说话人的处罚,返回说话人ID信息,若为空,则针对房间维度处罚 |
censorAccount | String | 审核员账号 |
detail | String | 违规详细说明 |
warnCount | Number | 警告次数 |
evidence | json数组 | 人审操作action时返回前5张机器截图,用于还原场景 |
frontAudioSegment | json对象 | 人审操作action时返回前20s的音频断句信息,用于还原场景 |
evidence数据结构:
参数名称 | 类型 | 描述 |
---|---|---|
snapshot | String | 证据截图url |
frontAudioSegment数据结构:
参数名称 | 类型 | 描述 |
---|---|---|
url | String | 音频断句url |
content | String | 音频断句语音识别结果 |
响应示例
[
{
"taskId":"67af8eb4c74d4d768a5ff76257d4e7b5",
"callback":"8brNbu9c5Z",
"dataId":"970584153600754",
"status":102,
"censorSourc":2,
"duration":100, //检测中不返回该字段,检测完成最后一次回调返回该字段
"evidences":{
"audio":{
"action":1,
"asrStatus":2,
"asrResult":0,
"startTime":1621391109376,
"endTime":1621391115376,
"content":"看到没有,城管进去,以为第一个不是。",
"frontSegment":{
"content":"哦,这是手机,没了,我记得没有。 到了。 礼物,那个。",
"url":"https://as.dun.163.com/v1/liveaudio/segment/play?Signature=7605a02d4898438ece8e6eda23ba2d9c&Expires=1621995968732&AccessKey=0fef4d811b824e2dabec22a8e2f042b1&BeginTime=1621391095756&EndTime=1621391109376&SpeakerId=31286375016"
},
"segments":[
{
"subLabels":[
{
"details":{
"evidence":"城管(分)"
},
"subLabel":"500013"
}
],
"label":500,
"level":1
}
],
"speakerId":"31286375016"
}
}
},
{
"taskId":"e48787dddf914df4a602660ce88fe85f",
"callback":"0n2q0Qztf9",
"dataId":"8056529",
"status":101,
"evidences":{
"video":{
"evidence":{
"type":1,
"url":"https://yidun-video.nos-eastchina1.126.net/2c4ffb416f3f443ea35ec34a11b2a8f7_95633_1621347428825.jpg?Signature=gGUGxdzxmy6wqt3GeHAKrrLUDVAkVS%2FnTzMX2SUFWhs%3D&Expires=1623939429&NOSAccessKeyId=7b107844ee8e4f9689d54c726e3273ff",
"beginTime":1621347428813,
"endTime":1621347428813,
"speakerId":"95633",
"frontPics":[
{
"url":"https://yidun-video.nos-eastchina1.126.net/2c4ffb416f3f443ea35ec34a11b2a8f7_164598_1621347418571.jpg?Signature=5%2BFn29rA%2Fu7oeUifvQF6W3qUwDdyAN224S9lOrfhwPA%3D&Expires=1623939429&NOSAccessKeyId=7b107844ee8e4f9689d54c726e3273ff"
},
{
"url":"https://yidun-video.nos-eastchina1.126.net/2c4ffb416f3f443ea35ec34a11b2a8f7_95633_1621347423730.jpg?Signature=SSQD0dahg3tJ%2BPqsT6W%2F%2BSjEr8kxwzt9qgTkJLomwY0%3D&Expires=1623939429&NOSAccessKeyId=7b107844ee8e4f9689d54c726e3273ff"
},
{
"url":"https://yidun-video.nos-eastchina1.126.net/2c4ffb416f3f443ea35ec34a11b2a8f7_164598_1621347424081.jpg?Signature=lIwNFupZ22TrZi12N84ceCcZ3sXT9v1EQgi0PJ8spJA%3D&Expires=1623939429&NOSAccessKeyId=7b107844ee8e4f9689d54c726e3273ff"
}
]
},
"labels":[
{
"label":100,
"level":2,
"rate":0.999705,
"subLabels":[
{
"subLabel":10003,
"rate":0.9953329,
"details":{
"hitInfos":[
"男下体"
],
"imageTagInfos":[
{
"tagName":"男下体",
"tagGroup":"色情"
}
]
}
}
]
}
]
}
}
},
{
"taskId":"e48787dddf914df4a602660ce88fe85f",
"callback":"0n2q0Qztf9",
"dataId":"8056529",
"status":101,
"censorSourc":1,
"reviewEvidences":{
"action":2,
"actionTime":1587461318594,
"label":100,
"detail":"",
"warnCount":1,
"evidence":[
]
}
}
]
直播音视频解决方案主动回调说明
易盾提供主动回调和被动回调数据两种方式,主动回调以数据为维度设置回调地址;易盾方产品回调数据后,主动调用客户提供的http地址将回调数据推送给客户
主动回调接入
客户接入主动回调的方式很简单,只需要在调用在线检测接口请求参数中指定了回调通知参数callbackUrl(即一个http(s)协议接口的URL),则需要支持POST方法,传输数据编码采用utf-8
业务类型 | 回调参数名称 | 类型 | 最大长度 | 描述 |
---|---|---|---|---|
直播音视频 | callbackUrl | String | 256 | 直播音视频提交参数中添加callbackUrl字段 |
您服务端接收到我们推送的结果后,返回的HTTP状态码为200时,表示推送成功,其他的HTTP状态码均视为您接收失败,我们将每隔10分钟推送一次,如果一直失败,持续一天后不再推送;我们主动回调数据接口超时时间设置为2s,为了保证顺利接收数据,客户需保证接收接口性能稳定并且保证幂等性。
请求方法
客户提供的主动回调数据接收接口,需支持 POST 方法。
字符编码
所有接口的请求数据编码皆为 utf-8。
请求公共参数
参数名称 | 类型 | 是否必传 | 描述 |
---|---|---|---|
secretId | 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":"67af8eb4c74d4d768a5ff76257d4e7b5",
"callback":"8brNbu9c5Z",
"dataId":"970584153600754",
"status":102,
"censorSourc":2,
"duration":100, //检测中不返回该字段,检测完成最后一次回调返回该字段
"evidences":{
"audio":{
"action":1,
"asrStatus":2,
"asrResult":0,
"startTime":1621391109376,
"endTime":1621391115376,
"content":"看到没有,城管进去,以为第一个不是。",
"frontSegment":{
"content":"哦,这是手机,没了,我记得没有。 到了。 礼物,那个。",
"url":"https://as.dun.163.com/v1/liveaudio/segment/play?Signature=7605a02d4898438ece8e6eda23ba2d9c&Expires=1621995968732&AccessKey=0fef4d811b824e2dabec22a8e2f042b1&BeginTime=1621391095756&EndTime=1621391109376&SpeakerId=31286375016"
},
"segments":[
{
"subLabels":[
{
"details":{
"evidence":"城管(分)"
},
"subLabel":"500013"
}
],
"label":500,
"level":1
}
],
"speakerId":"31286375016"
}
}
},
{
"taskId":"e48787dddf914df4a602660ce88fe85f",
"callback":"0n2q0Qztf9",
"dataId":"8056529",
"status":101,
"evidences":{
"video":{
"evidence":{
"type":1,
"url":"https://yidun-video.nos-eastchina1.126.net/2c4ffb416f3f443ea35ec34a11b2a8f7_95633_1621347428825.jpg?Signature=gGUGxdzxmy6wqt3GeHAKrrLUDVAkVS%2FnTzMX2SUFWhs%3D&Expires=1623939429&NOSAccessKeyId=7b107844ee8e4f9689d54c726e3273ff",
"beginTime":1621347428813,
"endTime":1621347428813,
"speakerId":"95633",
"frontPics":[
{
"url":"https://yidun-video.nos-eastchina1.126.net/2c4ffb416f3f443ea35ec34a11b2a8f7_164598_1621347418571.jpg?Signature=5%2BFn29rA%2Fu7oeUifvQF6W3qUwDdyAN224S9lOrfhwPA%3D&Expires=1623939429&NOSAccessKeyId=7b107844ee8e4f9689d54c726e3273ff"
},
{
"url":"https://yidun-video.nos-eastchina1.126.net/2c4ffb416f3f443ea35ec34a11b2a8f7_95633_1621347423730.jpg?Signature=SSQD0dahg3tJ%2BPqsT6W%2F%2BSjEr8kxwzt9qgTkJLomwY0%3D&Expires=1623939429&NOSAccessKeyId=7b107844ee8e4f9689d54c726e3273ff"
},
{
"url":"https://yidun-video.nos-eastchina1.126.net/2c4ffb416f3f443ea35ec34a11b2a8f7_164598_1621347424081.jpg?Signature=lIwNFupZ22TrZi12N84ceCcZ3sXT9v1EQgi0PJ8spJA%3D&Expires=1623939429&NOSAccessKeyId=7b107844ee8e4f9689d54c726e3273ff"
}
]
},
"labels":[
{
"label":100,
"level":2,
"rate":0.999705,
"subLabels":[
{
"subLabel":10003,
"rate":0.9953329,
"details":{
"hitInfos":[
"男下体"
],
"imageTagInfos":[
{
"tagName":"男下体",
"tagGroup":"色情"
}
]
}
}
]
}
]
}
}
},
{
"taskId":"e48787dddf914df4a602660ce88fe85f",
"callback":"0n2q0Qztf9",
"dataId":"8056529",
"status":101,
"censorSourc":1,
"reviewEvidences":{
"action":2,
"actionTime":1587461318594,
"label":100,
"detail":"",
"warnCount":1,
"evidence":[
]
}
}
]