互动音频审核

互动音频审核针对音频互动解决方案,提供配套的音频流实时审核服务,检测音频流中的不良信息,并给出审核结果管控建议。
针对房间(roomId)启动审核任务后,系统会自动从传输系统拉取音频数据,周期性分段进行识别。

1. 功能描述

互动音频审核服务检测实时音频流的违规信息,异步回调返回违规结果。
提供以下审核类别action和对应的标签label

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

2. 使用限制

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

3. 接口说明

3.1 启动任务

发起请求

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

请求内容

名称数据类型是否必需描述
roomId字符串房间ID,审核任务唯一标识
uids字符串数组监控的用户UID列表,为空表示监控频道内所有用户
contextJSON业务方的上下文信息,在回调时会透传该信息
actions字符串数组审核类别,取值可包括:
- porn:声音娇喘识别
- antispam:敏感词识别
- asr:音转文识别
statusCallback字符串审核状态的http回调地址(支持http和https协议)
resultCallback字符串审核结果的http回调地址(支持http和https协议)
resultCallbackLevel字符串结果回调级别控制,可用以下其中之一:
- pass: 所有审核结果都会回调
- review: 在识别到有review和block结果的时候才会回调
- block: 在识别到有block结果的时候才会回调
默认为pass,全部结果都回调
sequence字符串该值用于回调通知请求中的签名。当使用回调时该字段必须提供。详细使用方法见结果回调说明。
extraJSON附加配置,定义见下表

表. extra

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

注意事项:

  1. 审核任务以roomId作为唯一标识,同一个roomId启动多次审核任务,系统将返回错误
  2. 需要更新任务审核配置,请先停止现有审核任务

响应内容

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

名称类型是否必需描述
code整型请求错误码,详见 错误码
message字符串错误信息描述
traceId字符串透传请求参数中的traceId内容
roomId字符串房间ID,审核任务唯一标识
contextJSON对应请求中的context
timestamp整型当前unix时间戳,单位秒

3.2 结果回调

回调时机

1)当检测到实时流包含出现违规信息时,调用resultCallback提供的地址,通知用户放检测结果;
2)当检测任务中指定roomid所有直播流都已经超时超过10分钟时,调用statusCallback提供的地址,通知用户方任务已因超时停止。

  • 启动任务resultCallback和statusCallback可以为空,为空时用户可以通过查询接口获得任务状态和结果;
  • 用户如果需要使用回调方式获得结果和任务状态,必须保证回调HTTP服务工作稳定;
  • 当回调地址访问失败 或者 返回状态码非200,后台将 最多重试5次

回调方式

使用 HTTPS POST 方式访问用户提供的url地址,状态和结果以JSON串格式填在http请求body中,具体格式见下一小节。
为了防止内容被篡改,在http请求header增加一个checksum项用于校验内容是否合法。

checksum串的生成方式如下:

启动任务参数携带的sequence + body字符串数据,通过SHA256算法生成checksum值

识别结果回调

名称数据类型是否必需描述
roomId字符串房间ID,审核任务唯一标识
contextJSON透传请求启动任务时的context参数
timestamp整型服务器当前unix时间戳,单位秒
uid字符串用户UID
results[]JSON数组返回结果数据。每个元素表示一种action的处理结果,具体结构见下方result表

表. result

名称类型是否必需描述
code整型检测错误码,详见 错误码
message字符串错误描述信息
action字符串检测类型,和调用请求中的检测类型action对应
label字符串检测结果标签,取值与action有关。具体取值参见上面审核类型及对应标签说明表
rate浮点数检测结果标签的概率,取值范围在[0.00 - 1.00],值越大表示可信度越高
suggestion字符串建议您执行的操作,取值范围:
- pass: 正常,无需操作
- review: 疑似,检测结果不确定,需要进一步人工审核
- block: 违规,建议做违规处罚
url字符串违规音频段对应的保存地址(注意:只有识别为违规的音频片段才会保留,保存时间为3小时,超过3小时url可能失效,请及时做好转存)
text字符串音频片段的文本内容。当action为antispam或asr时才会存在该字段。
extraData[]JSON数组检测结果扩展信息,审核类别为“antispam”时才会携带,详见下面表.antispam-extraData

表. antispam-extraData

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

任务状态回调

名称类型是否必需描述
code整型432: 对应roomid超过10分钟没有直播流而被停止任务
message字符串错误信息描述
traceId字符串透传启动请求参数中的traceId内容
roomId字符串房间ID,审核任务唯一标识
contextJSON对应请求中的context
timestamp整型当前unix时间戳,单位秒

3.3 查询检测结果

请求方式

事项说明
请求方法GET
请求协议 HTTPS
请求域名ai.jocloud.com
请求路径app/{appId}/v1/audio/stream/results?traceId=xxxxx&roomId=xxxxxx
请求参数appId为用户的应用ID
traceId为uuid字符串,用于排查问题时对账,建议每次请求使用不同值
roomId为需要查询的审核任务对应的房间ID
请求头部Content-Type: application/json;charset=UTF-8
token: 鉴权token,生成方式参考 认证鉴权

返回内容

名称类型是否必需描述
code整型请求错误码,详见 错误码
message字符串错误信息描述
traceId字符串透传请求参数中的traceId内容
roomId字符串房间ID,审核任务唯一标识
context字符串用户上下文,对应启动任务参数中的context
status字符串任务状态 (running-运行中,stopped-正常停止,error-出错)
errCode整型任务状态码
errMessage字符串描述信息
timestamp整型当前unix时间戳,单位秒
results[]results数组存放最近多次结果数据。调用成功时(code==200),数组中每个元素是下面 表2. results 的结构

表. results

名称类型是否必需描述
uid字符串用户UID
timestamp整型识别结果时间(unix时间戳,单位秒)
result[]result数组存放多个action识别结果数据。数组中每个元素是 表. result 的结构

3.4 停止检测任务

请求方式

事项说明
请求方法POST
请求协议 HTTPS
请求域名ai.jocloud.com
请求路径app/{appId}/v1/audio/stream/stop?traceId=xxxxx&roomId=yyyy
请求参数appId为用户的应用ID
traceId为uuid字符串,用于排查问题时对账,建议每次请求使用不同值
roomId为需要停止的审核任务对应的房间ID
请求头部Content-Type: application/json;charset=UTF-8
token: 鉴权token,生成方式参考 认证鉴权

响应内容

返回body中的数据是JSON,具体字段说明如下:

名称类型是否必需描述
code整型请求错误码,详见 错误码
message字符串错误信息描述
traceId字符串透传请求参数中的traceId内容
roomId字符串房间ID,审核任务唯一标识
contextJSON对应请求中的context
timestamp整型服务器当前unix时间戳,单位秒

3.5 查询任务列表

业务方可通过http请求获取到当前任务列表信息,以下为请求方式说明:

请求方式

事项说明
请求方法GET
请求协议 HTTPS
请求域名ai.jocloud.com
请求路径app/{appId}/v1/audio/stream/tasks?traceId=xxxxx
请求参数appId为用户的应用ID
traceId为uuid字符串,用于排查问题时对账,建议每次请求使用不同值
请求头部Content-Type: application/json;charset=UTF-8
token: 鉴权token,生成方式参考 认证鉴权

响应内容

返回body中的数据是JSON,具体字段说明如下:

名称类型是否必需描述
code整型请求错误码,详见 错误码
message字符串错误信息描述
traceId字符串透传请求参数中的traceId内容
timestamp整型服务器当前unix时间戳,单位秒
tasks[]JSON对象数组任务列表信息,其中每一项的内容结构见下方 表task 定义

表. task

名称类型是否必需描述
roomId字符串对应启动任务时的roomId
uids字符串数组对应启动任务时的uids
timestamp整型对应启动任务时间(unix时间戳,单位秒)
contextJSON对应启动任务时的context

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())
roomid = 'test-room-1'

# url
url = host + '/app/%s/v1/audio/stream/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()

# 业务放需要使用到的上下文信息,便于在回调消息中协助后续处理,例如:
context = {
    'myid': 123,
    'myname': 'test'
}

# 识别结果及状态的回调地址,识别结果及状态通知将会通过http POST回调
resultCallback = 'http://192.168.1.100:12345/result'
statusCallback = 'http://192.168.1.100:12345/status'

# content
values = {
    'roomId': roomid,
    'uids': [],
    'context': context,
    'actions': ['porn'],
    'resultCallback': resultCallback,
    'statusCallback': statusCallback,
    'sequence': 'test'
}

# 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",
    "roomId": "test-room-1",
    "timestamp": 1576567090,
    "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 = '**********'   # 您的证书秘钥

traceid = str(uuid.uuid4())
roomid = 'test-room-1'

# url
url = host + '/app/%s/v1/audio/stream/results?traceId=%s&roomId=%s' % (appid, traceid, roomid)

# 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",
  "roomId": "test-room-1",
  "timestamp": 1576567239,
  "context": {
    "myid": 123,
    "myname": "test"
  },
  "results": [
    {
      "uid": 123456,
      "result": [
        {
          "action": "porn",
          "label": "normal",
          "rate": 0.99952548742294312,
          "suggestion": "pass",
          "url": "http://jocloud-ai-openapi.oss-cn-hangzhou.aliyuncs.com/live/10034/cccc2dcc-5472-4fbf-ae1b-5a906ea46c46.aac",
          "extraData": []
        }
      ],
      "timestamp": 1576567233
    }
  ],
  "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())
roomid = 'test-room-1'

# headers
headers = {
    "content-type": "application/json"
}

auth = base64.b64encode(("%s:%s" % (restful_id, restful_secret)).encode('utf-8'))
headers['token'] = 'Base ' + auth.decode()

# url
url = host + '/app/%s/v1/audio/stream/stop?traceId=%s&roomId=%s' % (appid, traceid, roomid)

# 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",
    "roomId": "test-room-1",
    "timestamp": 1576567306,
    "context": {
        "myid": 123,
        "myname": "test"
    }
}

5. 更新历史

版本
时间
说明
V1.2.02020-10-14增加asr功能支持
v1.1.02020-09-05增加resultCallbackLevel参数,支持控制审核结果回调等级
v1.0.02020-05-09初始版本

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

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

反馈

TOP