实时拉流审核

实时拉流审核用于检测实时音视频流中的不良信息,并给出审核结果管控建议。
采用检测方法是对视频流周期性抽帧,检测帧画面中的不良信息;对音频流周期性分段进行识别。目前支持对视频流和音频流进行识别。

1. 功能描述

调用方提交需要检测的实时音视频流,指定需要检测的类型,服务器周期性抽帧、切片检测回调返回检测结果。

视频流内容审核支持的检测类型及对应标签如下:

检测类型 说明 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: 广告

音频流支持的检测类型和对应标签如下:

检测类型说明actionlabel
娇喘识别检测音频文件的声纹特征,识别其中的娇喘等违规特征a-pornnormal:正常
moan:娇喘
敏感词识别翻译音频文件的文字信息,识别其中的敏感违规内容a-antispamnormal:正常
terrorism:暴力恐怖
porn:色情低俗
illegal:违法违规
politics:涉政敏感
abuse:谩骂灌水
ad:广告欺诈
feudalism:封建迷信
religion:宗教敏感
affairs:时事舆情
contraband:违禁物品
minors:未成年人
banned-website:非法网址
音转文识别翻译音频文件的文字信息a-asrnormal: 正常

2. 使用限制

限制类别说明
视频流协议RTMP,更多直播流方式支持请联系技术支持。
保存时长系统会自动保存疑似违规截图和音频片段,并将文件url连同检测结果返回给用户。
保存时间为3小时,超过3小时url可能失效,请及时做好转存。
视频分辨率不低于128x128, 分辨率过低可能会影响识别效果。
时长限制单个视频流检测任务最长可支持24小时。
并发限制默认每个用户最多同时在运行的实时流检测任务不超过200个,更多的并发支持,请联系技术支持
拉流超时由于直播停止或者其他原因导致持续超过5分钟无法拉到流,任务将自动停止,并将事件回调给业务方,由业务侧决定是否重新发起启动任务请求。
区域限制中国大陆,其他国家和地区支持,请联系技术支持

3. 接口说明

3.1 启动任务

发起请求

事项说明
请求方法POST
请求协议 HTTPS
请求域名ai.jocloud.com
请求路径app/{appId}/v1/video/live/start?traceId=xxxxx
请求参数traceId为uuid字符串,用于排查问题时对账,建议每次请求使用不同值
请求头部Content-Type: application/json;charset=UTF-8
token: 鉴权token,生成方式参考 认证鉴权
请求Bodyjson字符串,详细定义如下

请求内容

名称类型是否必需描述
actions字符串数组视频检测类型,可选值包括:
v-porn: 色情识别
v-terrorism: 暴恐识别
v-antispam: 敏感信息识别
v-sface: 敏感人物识别
v-illegal: 违法违规识别
v-ad: 广告识别
v-ocr: 图文违规识别

音频检测类型,可选值包括:
a-porn: 娇喘识别
a-antispam: 敏感词识别
a-asr: 音转文识别
url字符串待检测视频流地址
streamId字符串检测流唯一标识
contextJSON用户自定义上下文数据,返回结果和回调时都会自动带上。
statusCb字符串任务异常状态回调结果,如拉不到流、超时停止、用户主动停止。
resultCb字符串检测结果回调url http地址。允许空,当该字段为空时需要业务主动调用查询接口获得检测结果
resultCbLevel字符串结果回调级别控制,可用以下其中之一:
- pass: 所有审核结果都会回调
- review: 在识别到有review和block结果的时候才会回调
- block: 在识别到有block结果的时候才会回调
默认为pass,全部结果都回调
sequence字符串该值用于回调通知请求中的签名。当使用回调时该字段必须提供。详细使用方法见结果回调说明。
extraJSON附加配置,定义见下表

表. extra

名称类型描述
lang字符串当action包含a-antispam时, 指定敏感词检测使用的语言,默认为中文,可选值:
- chinese:中文
- bahasa:印尼语

响应参数

启动命令响应报文body中的数据是JSON,具体字段说明如下:

名称类型是否必需描述
code整型请求错误码,详见 错误码
message字符串错误信息描述
traceId字符串对应请求参数中的traceId
streamId字符串对应请求参数中的streamId
taskId字符串系统针对本次检查请求生成的唯一任务标识,作为后续结果回调、停止检测等操作的标识
contextJSON对应请求中的context
timestamp整型当前unix时间戳,单位秒

3.2 结果回调

回调时机

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字段
contextJSON用户上下文,对应启动任务中的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

名称类型是否必需描述
hintJson数组命中的关键字
label字符串命中的关键字所属类型
rate浮点数无意义,恒为"1.0"

识别状态回调

名称类型是否必需描述
streamId字符串流标识,对应启动任务中检测流ID
taskId字符串任务ID,对应启动任务响应返回的taskId字段
contextJSON用户上下文,对应启动任务中的context
status字符串任务状态 (running-运行中,stopped-正常停止,error-出错)
errCode整型错误码
100 - 表示拉流失败超时停止任务
101 - 表示拉流失败,在超时前会自动重试拉流(并非表示已停止任务)
errMessage字符串出错原因描述
timestamp整型服务器当前unix时间戳,单位秒

3.3 查询结果

请求方式

事项说明
请求方法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 的结构

3.4 停止检测任务

请求方式

事项说明
请求方法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时间戳,单位秒

4. 调用示例

以下是python代码的调用例子演示

4.1 请求启动任务

# -*- 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"
    }
}

4.2 查询任务状态和结果

# -*- 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"
}

4.3 停止任务

# -*- 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
}

5. 更新历史

版本
时间
说明
v2.2.42020-10-15图文违规识别增加标签
V2.2.32020-10-14增加a-asr功能支持
v2.2.22020-10-13违法违规识别增加inbed标签
v2.2.12020-09-05增加resultCbLevel参数,支持控制审核结果回调等级
v2.2.02020-08-31增加广告识别、图文违规识别类型; 更新暴恐识别和敏感信息识别的label
v2.1.02020-08-24增加违法违规识别类型
v2.0.02020-08-17色情识别类型增加二级标签
v1.1.02020-06-30移除启动请求参数interval,改为智能截帧审核
v1.0.02020-03-13初始版本

文档是否有解决您的问题?

有帮助 没帮助
提交成功,非常感谢您的反馈!

反馈

TOP