Live stream pulling moderation aims to detect malicious information in real-time audio/video streams, and give the control suggestions for the moderation result. The detection method is to extract frames from video streams periodically, detect malicious information in frame pictures, and recognize periodic segments of audio streams. Currently, this method supports recognizing video and audio streams.
The caller submits real-time audio/video streams to be detected, and specifies the detection type. The server periodically extracts and clips frames to detect the returned detection result of callback.
The detection types supported by Video Stream moderation and corresponding labels are as follows:
Detection Type | Description | Action | Primary Label | Secondary Label |
---|---|---|---|---|
Porn recognition | Recognize porn and sexy contents in pictures | v-porn | ||
normal: normal | normal: normal | |||
sexy: sexy | female_underwear: female underwear female_sexy_chest_l12: female sexy chest level 12 female_sexy_chest_l3: female sexy chest level 3 female_sexy_chest_l4: female sexy chest level 4 female_backless: female backless female_sexy_leg: female sexy leg female_focus_leg: female focus leg bathing_suit: bathing suit male_topless: male topless male_normal_topless: male normal topless other_sexy: other sexy |
|||
porn: porn | sex_product: sex aids naked_private_part: exposed sensitive parts extensive_naked: extensive naked sex_behavior: sex behavior naked_female_back: naked famale back naked_hip: naked hip sex_bulge: sex bulge focus_female_crotch: focus female crotch focus_male_crotch: focus male crotch hand_on_sexy: hand on sexy lick: lick kiss: kiss sm: SM sperm: sperm naked_child: naked child other_dirty: other dirty tongue_out: tongue out female_focus_hip: female focus hip male_underwear: male underwear porn_pip: porn pip |
|||
Terrorism recognition | Recognize bloody and terrorism contents in pictures | v-terrorism | normal: normal fire_explosion: fire explosion gun: gun knife: knife crowd: crowd flag_of_terrorism: flag of terrorism special_dress: special dress disgusted: disgusted with_weapon: with weapon bloody: bloody uniform: uniform |
nil |
Sensitive information recognition | Recognize sensitive contents in pictures | v-antispam | normal: normal special_building: special building rmb: RMB map_of_China: map of China cartoons_of_leaders: cartoons of leaders flags_of_China: flags of China Tibetan_buddhism: Tibetan buddhism other_antispam: Other sensitive information tank: tank fighter: fighter cannon: cannon battleship: battleship |
nil |
Sensitive figure recognition | Recognize domestic and overseas politicians, and public figures in pictures | v-sface | normal: normal sface: sensitive figure involved |
nil |
Illegal recognition | Identify whether the picture contains illegal scene information | v-illegal | normal: normal minor: minor drug: drug drive: drive gamble: gamble smoke: smoke id_infomation: id infomation tattoo: tattoo inbed: lie on the bed |
nil |
AD recognition | Identify whether the image contains advertising information | v-ad | normal: normal QR_code: QR code bar_code: bar code applet_code: applet code |
nil |
OCR recognition | Identify whether the picture contains suspected violation text information | v-ocr | normal: normal ocr_politics: politics ocr_terrorism: terrorism ocr_porn: porn ocr_illegal: illegal ocr_abuse: abuse ocr_ad: ad |
nil |
The Audio Stream supported detection types and corresponding labels are as follows:
Detection Type | Description | Action | Label |
---|---|---|---|
Moan recognition | Detect voiceprint features in audio files, and recognize illegal features, such as moan | a-porn | normal: normal moan: moan |
Sensitive word recognition | Translate the text of audio files, and recognize sensitive and illegal contents | a-antispam | normal: normal terrorism: terrorism porn: porn illegal: illegal politics: politically sensitive contents abuse: abuse ad: advertisement cheating feudalism: feudalism religion: religiously sensitive contents affairs: affairs contraband: contraband minors: minors banned-website: banned websites |
Automatic speech recognition | Translate the text of audio files | a-asr | normal: normal |
Restriction Category | Description |
---|---|
Video stream protocol | RTMP; for more live streaming modes, please contact the technical support. |
Screenshot interval | Screenshot every 2 seconds |
Saving duration | The system will automatically save suspected illegal screenshots and audio clips, and return the file URL and detection result to the user. These files will be kept for 3 hours. Their URLs may become invalid over 3 hours. Please export the files in time. |
Video resolution | At least 128 x 128. The extra-low resolution may affect the recognition effect. |
Duration limit | The detection task for a single video stream can last up to 24 hours. |
Concurrency restriction | For each user, the number of real-time stream detection tasks concurrently running does not exceed 200 by default. For higher concurrency capabilities, please contact the technical support. |
Stream pulling timeout | In the event that the live streaming stops or the stream pulling keeps failing for over 5 minutes due to other reasons, the task will stop automatically, and the event will be returned to the service side, which will determine whether to launch the task request again. |
Area restriction | Only in Chinese mainland. For support in other countries and regions, please contact the technical support. |
Item | Description |
---|---|
Request method | POST |
Request protocol | HTTPS |
Request domain name | ai.jocloud.com |
Request path | app/{appId}/v1/video/live/start?traceId=xxxxx |
Request parameters | traceId is a uuid string, and used for problem positioning during troubleshooting. It is suggested to use different values for each request. |
Request header | Content-Type: application/json;charset=UTF-8 token:Authentication token; for its generation mode, see Identity Authentication |
Request body | json character string, defined as follows |
Name | Type | Required | Description |
---|---|---|---|
actions | String array | Yes | Video detection type. Options include: v-porn: Porn recognition v-terrorism: terrorism recognition v-antispam: Sensitive information recognition v-sface: Sensitive figure recognition v-illegal: illegal recognition v-ad: ad information recognition v-ocr: ocr information recognition Audio detection type. Options include: a-porn: moan recognition a-antispam: Sensitive word recognition a-asr: automatic speech recognition |
url | String | Yes | Address of video stream to be detected |
streamId | String | No | Unique identifier of detected streams |
context | JSON | No | User-defined context data, automatically provided during result returning and callback. |
statusCb | String | No | The callback result of abnormal task status, such as stream pulling failure, timeout stop, and user stop. |
resultCb | String | No | url http for callback of detection result. This field can be empty. When it is empty, the service needs to call the search API to obtain the detection result. |
resultCbLevel | String | No | Result callback level control, you can use one of the following: - pass: all audit results will be called back - review: will call back only when review and block results are identified - block: It will call back when the block result is recognized. The default is 'pass', all results are called back |
sequence | String | No | This value is used for the signature in the callback notification request. This field is mandatory for callback. See result callback description for detailed use method. |
extra | JSON | No | extra info, as follow |
Table. extra
Name | Type | Description |
---|---|---|
lang | String | Language of the audio clip when action is 'a-antispam'. - chinese: Chinese - bahasa: Bahasa Indonesia use chinese as default. |
The data in the respond message body of starting command is JSON, and the specific field is described as below:
Name | Type | Required | Description |
---|---|---|---|
code | Integer | Yes | Error code, Error code in request |
message | String | Yes | Description of error message |
traceId | String | Yes | Map to traceId in the request parameter |
streamId | String | No | Map to streamId in the request parameter |
taskId | String | Yes | A unique task identifier generated by the system specific to this detection request, serving as the identifier for subsequent result callback and detection stopping. |
context | JSON | No | Map to context in the request |
timestamp | Integer | Yes | Current unix timestamp, in units of second |
- Fields resultCb and statusCb in a starting task can be empty. If they are empty, you can obtain the task status and result through the search APIs.
- If you obtain the result and task status with callback, the callback of HTTP service must run stably.
- When access to the callback address fails or the returned status code is not 200, the Jocloud background allows At Most 5 Retries .
Access user provided URL by HTTPS POST method, and fill the status and result in the http request body in JSON string format. See the next section for the specific format.
To prevent content tampering, add a checksum item to the header of http request, to verify content validity.
The checksum string is generated by the following method:
The sequence + body string data contained in parameters of the starting task generate the checksum value through the SHA256 algorithm.
Name | Type | Required | Description |
---|---|---|---|
streamId | String | No | Stream identifier, mapping to the detection stream ID in the starting task |
taskId | String | Yes | Task ID, mapping to the taskId field returned by the starting task |
context | JSON | No | User context, mapping to the context in the starting task |
status | String | Yes | Task status (running - in running, stopped - normal stop, error - error occurred) |
timestamp | Integer | Yes | Current unix timestamp of server, in units of second |
results[] | Array | No | Return the result data. The return result contains one or more results. Array elements are defined in the "result" table below. |
Table: result
Name | Type | Required | Description |
---|---|---|---|
code | Integer | Yes | Error code, Error code in data and action |
message | String | Yes | Description of errors |
action | String | Yes | Detection type, mapping to the detection type (actions) in the call request |
label | String | Yes | Detection result label; its value is related to action. For specific values, see above moderation types and corresponding label specification table. |
rate | Floating-point number | Yes | Probability of detection result label, with the value ranging between [0.00 – 1.00]. The greater the value, the higher the credibility. |
suggestion | String | Yes | Operation recommended, with the value options: - pass: normal, no operation needed; - review: suspected, detection result uncertain, requiring further manual moderation - block: illegal, suggested to give punishment |
URL | String | No | Address of saving video screenshots or voice clips corresponding to the recognition result (Notes: These files will be kept for 3 hours. Their URLs may become invalid over 3 hours. Please export the files in time.) |
text | String | No | Text content of audio clips, provided only when action is "a-antispam" or "a-asr". |
extraData[] | JSON array | No | Additional information for the return result. Not all detection types have additional information, and the return structure varies for different detection types. See the following descriptions for detailed definition. When action is v-porn, use v-porn extraData When action is v-sface, use v-sface extraData When action is a-porn, use a-porn extraData When action is a-antispam, use a-antispam extraData |
Table: v-porn-ExtraData
Name | Type | Required | Description |
---|---|---|---|
label | String | Yes | Detected secondary label |
rate | Floating-point number | Yes | Probability of detection result label, with the value ranging between [0.00 – 1.00]. The greater the value, the higher the credibility. |
Table: v-sface-ExtraData
Name | Type | Required | Description |
---|---|---|---|
label | String | Yes | Detected face label |
rate | Floating-point number | Yes | Probability of detection result label, with the value ranging between [0.00 – 1.00]. The greater the value, the higher the credibility. |
name | String | Yes | Detected name of sensitive figure |
x | Integer | Yes | X-coordinate of the upper left corner of the detected face in the picture |
y | Integer | Yes | Y-coordinate of the upper left corner of the detected face in the picture |
w | Integer | Yes | Width of detected face |
h | Integer | Yes | Height of detected face |
Table: a-porn-extraData
Name | Type | Required | Description |
---|---|---|---|
begin | Floating-point number | No | Start time of audio clip (in second) |
end | Floating-point number | No | End time of audio clip (in second) |
score | Floating-point number | No | Matching degree of moan, value ranging between: [0–100]. The higher the score, the higher the matching degree. |
Table: a-antispam-extraData
Name | Type | Required | Description |
---|---|---|---|
hint | Json array | No | Hit keyword |
label | String | No | Type of hit keyword |
rate | Floating-point number | No | Meaningless, always "1.0" |
Name | Type | Required | Description |
---|---|---|---|
streamId | String | No | Stream identifier, mapping to the detection stream ID in the starting task |
taskId | String | Yes | Task ID, mapping to the taskId field returned by the starting task |
context | JSON | No | User context, mapping to the context in the starting task |
status | String | Yes | Task status (running - in running, stopped - normal stop, error - error occurred) |
errCode | Integer | Yes | Error code 100 - the task stops due to stream pulling failure and timeout 101 - the stream pulling fails and retries automatically before timeout (not indicating the task stop) |
errMessage | String | Yes | Description of error reasons |
timestamp | Integer | Yes | Current unix timestamp of server, in units of second |
Item | Description |
---|---|
Request Method | POST |
Request protocol | HTTPS |
Request domain name | ai.jocloud.com |
Request path | app/{appid}/v1/video/live/results?traceId=xxxx-xxxx-xxxx-xxxx&taskId=yyyy |
Request parameters | traceId is a uid string, used for problem positioning during troubleshooting. It is suggested to use different values for each request. taskId is the task ID to be searched, mapping to the taskId included in respon during task starting. |
Request header | Content-Type: application/json;charset=UTF-8 token: Authentication token; for its generation mode, see Identity Authentication |
Name | Type | Required | Description |
---|---|---|---|
code | Integer | Yes | Error code, Error code in request |
message | String | Yes | Description of error message |
traceId | String | Yes | traceId content in the pass-through request parameter |
taskId | String | Yes | taskId for this search, consistent with the request parameter |
streamId | String | No | Stream ID, mapping to streamId in the starting task parameters |
context | String | No | User context, mapping to context in the starting task parameters |
status | String | Yes | Task status (running - in running, stopped - normal stop, error - error occurred) |
errCode | Integer | Yes | Error code |
errMessage | String | Yes | Error reasons |
timestamp | Integer | Yes | Current unix timestamp (s) |
results[] | results array | No | Store recent multiple result data. When the call succeeds (code==200), each element in the array is of the structure as shown in Table 2 "results" below. |
Table 2 Results
Name | Type | Required | Description |
---|---|---|---|
timestamp | Integer | Yes | Time of getting the recognition result (unix timestamp, in units of second) |
result[] | result array | No | Store multiple result data of action recognition. Each element in the array is of the structure as shown in Table 1 "result". |
Item | Description |
---|---|
Request method | POST |
Request protocol | HTTPS |
Request domain name | ai.jocloud.com |
Request path | app/{appid}/v1/video/live/stop?traceId=xxxx-xxxx-xxxx-xxxx&taskId=yyyy |
Request parameters | traceId is a uuid string, used for problem positioning during troubleshooting. It is suggested to use different values for each request. taskId is the task ID to be searched, mapping to the taskId included in respon during task starting. |
Request header | Content-Type: application/json;charset=UTF-8 token: Authentication token; for its generation mode, see Identity Authentication |
Data in return body is JSON. The specific field is described below:
Name | Type | Required | Description |
---|---|---|---|
code | Integer | Yes | Error code, Error code in request |
message | String | Yes | Description of error message |
traceId | String | Yes | Map to traceId content in the request parameter |
taskId | String | Yes | Map to taskId in the request parameter |
timestamp | Integer | Yes | Current unix timestamp of server, in units of second |
The following demonstrates the calling process with python code
# -*- coding: utf-8 -*-
#! python3.5
import requests
import uuid
import base64
host = "https://ai.jocloud.com"
appid = 1234567890 # Your Service id
restful_id = '**********' # Your certificate ID
restful_secret = '**********' # Your certificate key
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()
# Live streaming stream address to be identified
streamurl = 'rtmp://mytest.com/live/123456789'
# Context information to be used by the service to assist the subsequent treatment in the callback message, for example:
context = {
'myid': 123,
'myname': 'test'
}
# Identification result and callback address of status, and the identification result and status notificafication are called back through 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))
The call results are returned as follows:
{
"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 # Your Service ID
restful_id = '**********' # Your certificate ID
restful_secret = '**********' # Your certificate key
task_id = "acee5522-b198-4325-9434-61b41eb2e08a" # Fill in the taskId content returned when starting the task here
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))
The call results are returned as follows:
{
"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 # Your Service ID
restful_id = '**********' # Your certificate ID
restful_secret = '**********' # Your certificate key
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' # Fill in the taskId content returned when starting the task here
# 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))
The call results are returned as follows:
{
"code": 200,
"message": "OK",
"traceId": "9eb28f1d-a307-4e93-bcf4-66e531aa12f1",
"taskId": "acee5522-b198-4325-9434-61b41eb2e08a",
"timestamp": 1576567306
}
Version | Time | Description |
---|---|---|
v2.2.4 | 2020-10-15 | Add new label in OCR recognition |
V2.2.3 | 2020-10-14 | Add 'a-asr' action support |
v2.2.2 | 2020-10-13 | Add 'inbed' label in Illegal recognition |
v2.2.1 | 2020-09-05 | Add 'resultCbLevel' parameter, support to control the result callback level |
v2.2.0 | 2020-08-31 | Add ad and ocr recognition; Update labels of 'v-terrorism' and 'v-antispam' recognition |
v2.1.0 | 2020-08-24 | Add illegal recognition |
v2.0.0 | 2020-08-17 | Add secondary labels in the porn recognition |
v1.1.0 | 2020-06-30 | Remove 'interval' param in request, Set to 2s to intercept one frame |
V1.0.0 | 2020-03-13 | Initial version |