实时拉流审核用于检测实时音视频流中的不良信息,并给出审核结果管控建议。
采用检测方法是对视频流周期性抽帧,检测帧画面中的不良信息;对音频流周期性分段进行识别。目前支持对视频流和音频流进行识别。
调用方提交需要检测的实时音视频流,指定需要检测的类型,服务器周期性抽帧、切片检测回调返回检测结果。
视频流内容审核支持的检测类型及对应标签如下:
检测类型 | 说明 | action | 一级label | 二级label |
---|---|---|---|---|
色情识别 | 识别图片中的色情、性感等违规内容 | v-porn | ||
normal: 正常 | normal: 正常 | |||
sexy: 性感 | female_underwear: 女性内衣内裤 female_sexy_chest_l12: 女性露沟12级 female_sexy_chest_l3: 女性露沟3级 female_sexy_chest_l4: 女性露沟4级 female_backless: 女性露背 female_sexy_leg: 女性露腿过臀线 female_focus_leg: 聚焦女性长腿 bathing_suit: 女性沙滩泳衣 male_topless: 男性赤裸上半身【露出乳头位置】 male_normal_topless: 男性赤裸上半身【未到乳头位置】 other_sexy: 其他性感 |
|||
porn: 色情 | sex_product: 性用品 naked_private_part: 裸露敏感部位 extensive_naked: 大面积裸露,但未裸露敏感部位 sex_behavior: 性行为 naked_female_back: 女性上半身未穿【背部】 naked_hip: 露臀沟 sex_bulge: 敏感部位激凸 focus_female_crotch: 聚焦女性裆部、拍摄女性底裤 focus_male_crotch: 聚焦男性裆部及下半身 hand_on_sexy: 手抚摸、抓敏感部位 lick: 舔手舔脚舔物 kiss: 接吻 sm: SM sperm: 精液 naked_child: 儿童裸露 other_dirty: 其他低俗 tongue_out: 吐舌头 female_focus_hip: 聚焦女性臀部 male_underwear: 男性内裤 porn_pip: 画中画小窗口色情 |
|||
暴恐识别 | 识别图片中的血腥、暴恐等违规内容 | v-terrorism | normal: 正常 fire_explosion: 爆炸/烟光 gun: 枪支 knife: 刀具 crowd: 人口聚集 flag_of_terrorism: 恐怖主义旗帜 special_dress: 特殊着装 disgusted: 恶心不适 with_weapon: 武器携带 bloody: 血腥画面 uniform: 军警制服 |
无 |
敏感信息识别 | 识别图片中的敏感信息内容 | v-antispam | normal: 正常 special_building: 中国地标建筑 rmb: 人民币 map_of_China: 中国地图 cartoons_of_leaders: 领导人漫画 flags_of_China: 中国旗帜(原中国国旗) Tibetan_buddhism: 藏传佛教 other_antispam: 其他敏感信息(银河邪教组织、国殇之柱\民主女神) tank: 坦克、装甲车 fighter: 战斗机 cannon: 大炮 battleship: 战舰 |
无 |
敏感人物识别 | 识别图片中是否包含国内外政治人物、公众人物 | v-sface | normal: 正常 sface: 包含敏感人物 |
无 |
违法违规识别 | 识别图片中是否包含违法违规场景信息 | v-illegal | normal: 正常 minor: 未成年人 drug: 吸毒 drive: 开车直播 gamble: 赌博 smoke: 吸烟 id_infomation: 身份证件 tattoo: 社会纹身 inbed: 躺播 |
无 |
广告识别 | 识别图片中是否包含广告信息 | v-ad | normal: 正常 QR_code: 二维码 bar_code: 条形码 applet_code: 小程序码 |
无 |
图文违规识别 | 识别图片中是否包含疑似违规文字信息 | v-ocr | normal: 正常 ocr_politics: 涉政 ocr_terrorism: 涉暴 ocr_porn: 涉黄 ocr_illegal: 违法 ocr_abuse: 辱骂 ocr_ad: 广告 |
无 |
音频流支持的检测类型和对应标签如下:
检测类型 | 说明 | action | label |
---|---|---|---|
娇喘识别 | 检测音频文件的声纹特征,识别其中的娇喘等违规特征 | a-porn | normal:正常 moan:娇喘 |
敏感词识别 | 翻译音频文件的文字信息,识别其中的敏感违规内容 | a-antispam | normal:正常 terrorism:暴力恐怖 porn:色情低俗 illegal:违法违规 politics:涉政敏感 abuse:谩骂灌水 ad:广告欺诈 feudalism:封建迷信 religion:宗教敏感 affairs:时事舆情 contraband:违禁物品 minors:未成年人 banned-website:非法网址 |
音转文识别 | 翻译音频文件的文字信息 | a-asr | normal: 正常 |
限制类别 | 说明 |
---|---|
视频流协议 | RTMP,更多直播流方式支持请联系技术支持。 |
保存时长 | 系统会自动保存疑似违规截图和音频片段,并将文件url连同检测结果返回给用户。 保存时间为3小时,超过3小时url可能失效,请及时做好转存。 |
视频分辨率 | 不低于128x128, 分辨率过低可能会影响识别效果。 |
时长限制 | 单个视频流检测任务最长可支持24小时。 |
并发限制 | 默认每个用户最多同时在运行的实时流检测任务不超过200个,更多的并发支持,请联系技术支持 |
拉流超时 | 由于直播停止或者其他原因导致持续超过5分钟无法拉到流,任务将自动停止,并将事件回调给业务方,由业务侧决定是否重新发起启动任务请求。 |
区域限制 | 中国大陆,其他国家和地区支持,请联系技术支持 |
事项 | 说明 |
---|---|
请求方法 | POST |
请求协议 | HTTPS |
请求域名 | ai.jocloud.com |
请求路径 | app/{appId}/v1/video/live/start?traceId=xxxxx |
请求参数 | traceId为uuid字符串,用于排查问题时对账,建议每次请求使用不同值 |
请求头部 | Content-Type: application/json;charset=UTF-8 token: 鉴权token,生成方式参考 认证鉴权 |
请求Body | json字符串,详细定义如下 |
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
actions | 字符串数组 | 是 | 视频检测类型,可选值包括: v-porn: 色情识别 v-terrorism: 暴恐识别 v-antispam: 敏感信息识别 v-sface: 敏感人物识别 v-illegal: 违法违规识别 v-ad: 广告识别 v-ocr: 图文违规识别 音频检测类型,可选值包括: a-porn: 娇喘识别 a-antispam: 敏感词识别 a-asr: 音转文识别 |
url | 字符串 | 是 | 待检测视频流地址 |
streamId | 字符串 | 否 | 检测流唯一标识 |
context | JSON | 否 | 用户自定义上下文数据,返回结果和回调时都会自动带上。 |
statusCb | 字符串 | 否 | 任务异常状态回调结果,如拉不到流、超时停止、用户主动停止。 |
resultCb | 字符串 | 否 | 检测结果回调url http地址。允许空,当该字段为空时需要业务主动调用查询接口获得检测结果 |
resultCbLevel | 字符串 | 否 | 结果回调级别控制,可用以下其中之一: - pass: 所有审核结果都会回调 - review: 在识别到有review和block结果的时候才会回调 - block: 在识别到有block结果的时候才会回调 默认为pass,全部结果都回调 |
sequence | 字符串 | 否 | 该值用于回调通知请求中的签名。当使用回调时该字段必须提供。详细使用方法见结果回调说明。 |
extra | JSON | 否 | 附加配置,定义见下表 |
表. extra
名称 | 类型 | 描述 |
---|---|---|
lang | 字符串 | 当action包含a-antispam时, 指定敏感词检测使用的语言,默认为中文,可选值: - chinese:中文 - bahasa:印尼语 |
启动命令响应报文body中的数据是JSON,具体字段说明如下:
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
code | 整型 | 是 | 请求错误码,详见 错误码 |
message | 字符串 | 是 | 错误信息描述 |
traceId | 字符串 | 是 | 对应请求参数中的traceId |
streamId | 字符串 | 否 | 对应请求参数中的streamId |
taskId | 字符串 | 是 | 系统针对本次检查请求生成的唯一任务标识,作为后续结果回调、停止检测等操作的标识 |
context | JSON | 否 | 对应请求中的context |
timestamp | 整型 | 是 | 当前unix时间戳,单位秒 |
1)当检测到实时流包含出现违规信息时,调用resultCb提供的地址,通知用户放检测结果;
2)当检测任务出现异常情况,如拉流失败、解码失败是,调用statusCb提供的地址,通知用户方任务状态。
- 启动任务resultCb和statusCb可以为空,为空时用户可以通过查询接口获得任务状态和结果;
- 用户如果需要使用回调方式获得结果和任务状态,必须保证回调HTTP服务工作稳定;
- 当回调地址访问失败 或者 返回状态码非200,后台将 最多重试5次 。
使用 HTTPS POST 方式访问用户提供的url地址,状态和结果以JSON串格式填在http请求body中,具体格式见下一小节。
为了防止内容被篡改,在http请求header增加一个checksum项用于校验内容是否合法。
checksum串的生成方式如下:
启动任务参数携带的sequence + body字符串数据,通过SHA256算法生成checksum值
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
streamId | 字符串 | 否 | 流标识,对应启动任务中检测流ID |
taskId | 字符串 | 是 | 任务ID,对应启动任务响应返回的taskId字段 |
context | JSON | 否 | 用户上下文,对应启动任务中的context |
status | 字符串 | 是 | 任务状态 (running-运行中,stopped-正常停止,error-出错) |
timestamp | 整型 | 是 | 服务器当前unix时间戳,单位秒 |
results[] | 数组 | 否 | 返回结果数据。返回结果中包含一个或多个结果。数组元素定义见下方result表 |
表. result
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
code | 整型 | 是 | 检测错误码,详见 错误码 |
message | 字符串 | 是 | 错误描述信息 |
action | 字符串 | 是 | 检测类型,和调用请求中的检测类型(actions)对应 |
label | 字符串 | 是 | 检测结果标签,取值与action有关。具体取值参见上面审核类型及对应标签说明表 |
rate | 浮点数 | 是 | 检测结果标签的概率,取值范围在[0.00 - 1.00],值越大表示可信度越高 |
suggestion | 字符串 | 是 | 建议您执行的操作,取值范围: - pass: 正常,无需操作 - review: 疑似,检测结果不确定,需要进一步人工审核 - block: 违规,建议做违规处罚 |
url | 字符串 | 否 | 识别结果所对应的视频截图或者声音片段保存地址(注意:保存时间为3小时,超过3小时url可能失效,请及时做好转存) |
text | 字符串 | 否 | 音频片段的文本内容。当action为a-antispam或a-asr时才会存在该字段。 |
extraData[] | JSON数组 | 否 | 对返回结果的补充信息,并非所有检测类型都有补充信息,且不同的检测类型返回结构有所不同,详细定义见下面描述: 当action为v-porn时,数组中元素结构如v-porn extraData 当action为v-sface时,数组中元素结构如v-sface extraData 当action为a-porn时,数组中元素结构如a-porn extraData 当action为a-antispam时,数组中元素结构如a-antispam extraData |
表. v-porn-extraData
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
label | 字符串 | 是 | 检测到的二级标签 |
rate | 浮点数 | 是 | 检测结果标签的概率,取值范围在[0.00 - 1.00],值越大表示可信度越高 |
表. v-sface-extraData
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
label | 字符串 | 是 | 检测到的人脸标签 |
rate | 浮点数 | 是 | 检测结果标签的概率,取值范围在[0.00 - 1.00],值越大表示可信度越高 |
name | 字符串 | 是 | 检测到的敏感人物名字 |
x | 整型 | 是 | 检测到的人脸左上角在画面中的横坐标 |
y | 整型 | 是 | 检测到的人脸左上角在画面中的纵坐标 |
w | 整型 | 是 | 检测到的人脸宽度 |
h | 整型 | 是 | 检测到的人脸高度 |
表. a-porn-extraData
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
begin | 浮点数 | 否 | 音频片段开始时间,单位秒 |
end | 浮点数 | 否 | 音频片段结束时间,单位秒 |
score | 浮点数 | 否 | 声音娇喘匹配程度,取值[0~100],分数越高匹配程度越高 |
表. a-antispam-extraData
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
hint | Json数组 | 否 | 命中的关键字 |
label | 字符串 | 否 | 命中的关键字所属类型 |
rate | 浮点数 | 否 | 无意义,恒为"1.0" |
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
streamId | 字符串 | 否 | 流标识,对应启动任务中检测流ID |
taskId | 字符串 | 是 | 任务ID,对应启动任务响应返回的taskId字段 |
context | JSON | 否 | 用户上下文,对应启动任务中的context |
status | 字符串 | 是 | 任务状态 (running-运行中,stopped-正常停止,error-出错) |
errCode | 整型 | 是 | 错误码 100 - 表示拉流失败超时停止任务 101 - 表示拉流失败,在超时前会自动重试拉流(并非表示已停止任务) |
errMessage | 字符串 | 是 | 出错原因描述 |
timestamp | 整型 | 是 | 服务器当前unix时间戳,单位秒 |
事项 | 说明 |
---|---|
请求方法 | GET |
请求协议 | HTTPS |
请求域名 | ai.jocloud.com |
请求路径 | app/{appid}/v1/video/live/results?traceId=xxxx-xxxx-xxxx-xxxx&taskId=yyyy |
请求参数 | traceId为uuid字符串,用于排查问题时对账,建议每次请求使用不同值 taskId为需要查询的任务id,对应启动任务时的respon内容中的taskId |
请求头部 | Content-Type: application/json;charset=UTF-8 token: 鉴权token,生成方式参考 认证鉴权 |
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
code | 整型 | 是 | 请求错误码,详见 错误码 |
message | 字符串 | 是 | 错误信息描述 |
traceId | 字符串 | 是 | 透传请求参数中的traceId内容 |
taskId | 字符串 | 是 | 本次查询对应的taskId,与请求参数一致 |
streamId | 字符串 | 否 | 流ID,对应启动任务参数中的streamId |
context | 字符串 | 否 | 用户上下文,对应启动任务参数中的context |
status | 字符串 | 是 | 任务状态 (running-运行中,stopped-正常停止,error-出错) |
errCode | 整型 | 是 | 错误码 |
errMessage | 字符串 | 是 | 出错原因 |
timestamp | 整型 | 是 | 当前unix时间戳,单位秒 |
results[] | results数组 | 否 | 存放最近多次结果数据。调用成功时(code==200),数组中每个元素是下面 表2. results 的结构 |
表2. results
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
timestamp | 整型 | 是 | 识别结果时间(unix时间戳,单位秒) |
result[] | result数组 | 否 | 存放多个action识别结果数据。数组中每个元素是 表. result 的结构 |
事项 | 说明 |
---|---|
请求方法 | POST |
请求协议 | HTTPS |
请求域名 | ai.jocloud.com |
请求路径 | app/{appid}/v1/video/live/stop?traceId=xxxx-xxxx-xxxx-xxxx&taskId=yyyy |
请求参数 | traceId为uuid字符串,用于排查问题时对账,建议每次请求使用不同值 taskId为需要查询的任务id,对应启动任务时的respon内容中的taskId |
请求头部 | Content-Type: application/json;charset=UTF-8 token: 鉴权token,生成方式参考 认证鉴权 |
返回body中的数据是JSON,具体字段说明如下:
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
code | 整型 | 是 | 请求错误码,详见 错误码 |
message | 字符串 | 是 | 错误信息描述 |
traceId | 字符串 | 是 | 对应请求参数中的traceId内容 |
taskId | 字符串 | 是 | 对应请求参数中的taskId |
timestamp | 整型 | 是 | 服务器当前unix时间戳,单位秒 |
以下是python代码的调用例子演示
# -*- coding: utf-8 -*-
#! python3.5
import requests
import uuid
import base64
host = "https://ai.jocloud.com"
appid = 1234567890 # 您的业务ID
restful_id = '**********' # 您的证书ID
restful_secret = '**********' # 您的证书秘钥
traceid = str(uuid.uuid4())
dataid = str(uuid.uuid4())
# url
url = host + '/app/%s/v1/video/live/start?traceId=%s' % (appid, traceid)
# headers
headers = {
"content-type": "application/json"
}
auth = base64.b64encode(("%s:%s" % (restful_id, restful_secret)).encode('utf-8'))
headers['token'] = 'Base ' + auth.decode()
# 需要识别的直播流地址
streamurl = 'rtmp://mytest.com/live/123456789'
# 业务放需要使用到的上下文信息,便于在回调消息中协助后续处理,例如:
context = {
'myid': 123,
'myname': 'test'
}
# 识别结果及状态的回调地址,识别结果及状态通知将会通过http POST回调
resultCb = 'http://192.168.1.100:12345/result'
statusCb = 'http://192.168.1.100:12345/status'
# content
values = {
'actions': ['v-porn'],
'url': streamurl,
'streamId': "demo-test",
'resultCb': resultCb,
'statusCb': statusCb,
'sequence': 'test',
'context': context
}
# request
res = requests.post(url, json=values, headers=headers)
print ('code=%s, data=%s\n' % (res.status_code, res.text))
调用结果返回如下:
{
"code": 200,
"message": "OK",
"traceId": "f35a8abb-db6c-48f2-af7e-f6c0921b7b0d",
"taskId": "acee5522-b198-4325-9434-61b41eb2e08a",
"timestamp": 1576567090,
"streamId": "demo-test",
"context": {
"myid": 123,
"myname": "test"
}
}
# -*- coding: utf-8 -*-
#! python3.5
import requests
import uuid
import base64
host = "https://ai.jocloud.com"
appid = 1234567890 # 您的业务ID
restful_id = '**********' # 您的证书ID
restful_secret = '**********' # 您的证书秘钥
task_id = "acee5522-b198-4325-9434-61b41eb2e08a" # 这里填写启动任务时返回的taskId内容
traceid = str(uuid.uuid4())
dataid = str(uuid.uuid4())
# url
url = host + '/app/%s/v1/video/live/results?traceId=%s&taskId=%s' % (appid, traceid, task_id)
# headers
headers = {
"content-type": "application/json"
}
auth = base64.b64encode(("%s:%s" % (restful_id, restful_secret)).encode('utf-8'))
headers['token'] = 'Base ' + auth.decode()
# request
res = requests.get(url, headers=headers)
print ('url=%s\ncode=%s\ndata=%s\n' % (url, res.status_code, res.text))
调用结果返回如下:
{
"code": 200,
"message": "OK",
"traceId": "fe0a8278-0ed6-4c74-80ab-fb1066605227",
"taskId": "acee5522-b198-4325-9434-61b41eb2e08a",
"timestamp": 1576567239,
"streamId": "demo-test",
"context": {
"myid": 123,
"myname": "test"
},
"results": [
{
"result": [
{
"action": "v-porn",
"label": "normal",
"rate": 0.99952548742294312,
"suggestion": "pass",
"timestamp": 1576567232,
"url": "http://jocloud-ai-openapi.oss-cn-hangzhou.aliyuncs.com/live/10034/cccc2dcc-5472-4fbf-ae1b-5a906ea46c46.jpg"
}
],
"timestamp": 1576567233
},
{
"result": [
{
"action": "v-porn",
"label": "normal",
"rate": 0.99910759925842285,
"suggestion": "pass",
"timestamp": 1576567227,
"url": "http://jocloud-ai-openapi.oss-cn-hangzhou.aliyuncs.com/live/10034/f5540914-c5d4-41b6-8080-42a218f16a34.jpg"
}
],
"timestamp": 1576567228
},
{
"result": [
{
"action": "v-porn",
"label": "normal",
"rate": 0.9999052882194519,
"suggestion": "pass",
"timestamp": 1576567222,
"url": "http://jocloud-ai-openapi.oss-cn-hangzhou.aliyuncs.com/live/10034/50bf73a6-2555-48c2-8f33-13d2002f7e76.jpg"
}
],
"timestamp": 1576567223
},
{
"result": [
{
"action": "v-porn",
"label": "normal",
"rate": 0.99971604347229004,
"suggestion": "pass",
"timestamp": 1576567217,
"url": "http://jocloud-ai-openapi.oss-cn-hangzhou.aliyuncs.com/live/10034/4696a8a5-78f8-4c32-b696-aebbf79685bc.jpg"
}
],
"timestamp": 1576567218
},
{
"result": [
{
"action": "v-porn",
"label": "normal",
"rate": 0.99987661838531494,
"suggestion": "pass",
"timestamp": 1576567212,
"url": "http://jocloud-ai-openapi.oss-cn-hangzhou.aliyuncs.com/live/10034/6002efb8-e6d4-4527-afd8-1fd4a951d655.jpg"
}
],
"timestamp": 1576567213
}
],
"status": "running"
}
# -*- coding: utf-8 -*-
#! python3.5
import requests
import uuid
import base64
host = "https://ai.jocloud.com"
appid = 1234567890 # 您的业务ID
restful_id = '**********' # 您的证书ID
restful_secret = '**********' # 您的证书秘钥
traceid = str(uuid.uuid4())
dataid = str(uuid.uuid4())
# headers
headers = {
"content-type": "application/json"
}
auth = base64.b64encode(("%s:%s" % (restful_id, restful_secret)).encode('utf-8'))
headers['token'] = 'Base ' + auth.decode()
traceid = str(uuid.uuid4())
task_id = 'acee5522-b198-4325-9434-61b41eb2e08a' # 这里填写启动任务时返回的taskId内容
# url
url = host + '/app/%s/v1/video/live/stop?traceId=%s&taskId=%s' % (appid, traceid, task_id)
# request
res = requests.post(url, json={}, headers=headers)
print ('url=%s\ncode=%s\ndata=%s\n' % (url, res.status_code, res.text))
调用结果返回如下:
{
"code": 200,
"message": "OK",
"traceId": "9eb28f1d-a307-4e93-bcf4-66e531aa12f1",
"taskId": "acee5522-b198-4325-9434-61b41eb2e08a",
"timestamp": 1576567306
}
版本 | 时间 | 说明 |
---|---|---|
v2.2.4 | 2020-10-15 | 图文违规识别增加标签 |
V2.2.3 | 2020-10-14 | 增加a-asr功能支持 |
v2.2.2 | 2020-10-13 | 违法违规识别增加inbed标签 |
v2.2.1 | 2020-09-05 | 增加resultCbLevel参数,支持控制审核结果回调等级 |
v2.2.0 | 2020-08-31 | 增加广告识别、图文违规识别类型; 更新暴恐识别和敏感信息识别的label |
v2.1.0 | 2020-08-24 | 增加违法违规识别类型 |
v2.0.0 | 2020-08-17 | 色情识别类型增加二级标签 |
v1.1.0 | 2020-06-30 | 移除启动请求参数interval,改为智能截帧审核 |
v1.0.0 | 2020-03-13 | 初始版本 |