点播语音结果获取接口
2020.04.20 17:56:29
接口地址
https://as.dun.163yun.com/v3/audio/callback/results
接口描述
语音检测结果获取接口,获取离线处理的数据后,下次调用,不会再次返回之前获取过的离线数据。
接口请求频率
小于10s/20次,请求频率过快服务器会拒绝处理。
请求参数
该接口参数与请求公共参数一致,详细见 请求公共参数
参数名称 | 类型 | 是否必选 | 最大长度 | 描述 |
---|---|---|---|---|
version | String | Y | 4 | 接口版本v3 |
响应结果
响应字段如下,响应通用字段已省略,详细见 响应通用字段:
反垃圾结果
antispam 数组数据结构
参数名称 | 类型 | 描述 |
---|---|---|
asrStatus | Number | 音频翻译结果,2:检测中,3:检测完成,4:检测失败 |
asrResult | Number | 音频翻译检测失败原因,1:文件格式错误,2:文件下载失败,3:解析失败,4:音频流不存在 |
action | Number | 检测结果,0:通过,1:嫌疑,2:不通过 |
taskId | String | 唯一标识 |
labels | json数组 | 分类信息 |
labels 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
label | Number | 分类信息,100:色情,200:广告,300:暴恐,400:违禁,500:涉政,600:谩骂 |
subLabels | json数组 | 细分类信息,可能包含多个,可能为空 |
level | String | 分类级别,0:通过,1:嫌疑,2:不通过 |
details | json对象 | 其他信息 |
subLabels 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
subLabel | number | 细分类,详细编码请参考下方对应细分类编码对照表 |
subLabel细分类编码对应表
返回编码 | 描述 |
---|---|
100001 | 色情其他 |
100002 | 色情传播 |
100003 | 色情性器官 |
100004 | 色情挑逗 |
100005 | 色情低俗段子 |
100006 | 色情性行为 |
100007 | 色情舆情事件 |
100008 | 色情交友类 |
200009 | 商业推广 |
200010 | 广告法 |
200011 | 刷量行为 |
200012 | 广告其他 |
300016 | 暴恐其他 |
400017 | 违禁其他 |
500013 | 涉政其他 |
500014 | 涉政专项 |
500015 | 严格涉政 |
600018 | 谩骂其他 |
700019 | 灌水其他 |
900020 | 其他 |
自定义细分类
易盾支持sublabel自定义细分类过检并返回,如有需求,可联系您的专属运营经理添加。
details 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
hitType | Number | 命中检测器类型:10:用户名单 11:IP名单 12:设备名单 30:敏感词 110:IP地区限制 130:声纹检测 |
hint | json数组 | 线索信息,用于定位文本中有问题的部分,辅助人工审核 |
hint 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
value | String | 命中的敏感词或者声纹检测的分值 |
segments | json数组 | 命中敏感词或者声纹检测的音频时间点 |
segments 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
startTime | Number | 最近开始时间点,单位毫秒 |
endTime | Number | 最近结束时间点,单位毫秒 |
语种检测结果
language 数组数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 唯一标识 |
details | json数组 | 语种检测结果 |
details 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
type | String | 语种类型 |
segments | json数组 | 识别语种检测的音频时间点 |
segments 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
startTime | Number | 最近开始时间点,单位毫秒 |
endTime | Number | 最近结束时间点,单位毫秒 |
请求示例
/*
* @(#) VideoCallbackAPIDemo.java 2016年8月23日
*
* Copyright 2010 NetEase.com, Inc. All rights reserved.
*/
package com.netease.is.antispam.demo.audio;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.netease.is.antispam.demo.utils.HttpClient4Utils;
import com.netease.is.antispam.demo.utils.SignatureUtils;
import org.apache.http.Consts;
import org.apache.http.client.HttpClient;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
/**
* 调用易盾反垃圾云服务音频离线结果获取接口API示例,该示例依赖以下jar包:
* 1. httpclient,用于发送http请求
* 2. commons-codec,使用md5算法生成签名信息,详细见SignatureUtils.java
* 3. gson,用于做json解析
*
* @author hzhumin1
* @version 2018年10月25日
*/
public class AudioCallbackAPIDemo {
/**
* 产品密钥ID,产品标识
*/
private final static String SECRETID = "your_secret_id";
/**
* 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露
*/
private final static String SECRETKEY = "your_secret_key";
/**
* 业务ID,易盾根据产品业务特点分配
*/
private final static String BUSINESSID = "your_business_id";
/**
* 易盾反垃圾云服务音频离线结果获取接口地址
*/
private final static String API_URL = "https://as.dun.163yun.com/v3/audio/callback/results";
/**
* 实例化HttpClient,发送http请求使用,可根据需要自行调参
*/
private static HttpClient httpClient = HttpClient4Utils.createHttpClient(100, 20, 10000, 1000, 1000);
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Map<String, String> params = new HashMap<String, String>();
// 1.设置公共参数
params.put("secretId", SECRETID);
params.put("businessId", BUSINESSID);
params.put("version", "v3.1");
params.put("timestamp", String.valueOf(System.currentTimeMillis()));
params.put("nonce", String.valueOf(new Random().nextInt()));
// 2.生成签名信息
String signature = SignatureUtils.genSignature(SECRETKEY, params);
params.put("signature", signature);
// 3.发送HTTP请求,这里使用的是HttpClient工具包,产品可自行选择自己熟悉的工具包发送请求
String response = HttpClient4Utils.sendPost(httpClient, API_URL, params, Consts.UTF_8);
// 4.解析接口返回值
JsonObject resultObject = new JsonParser().parse(response).getAsJsonObject();
int code = resultObject.get("code").getAsInt();
String msg = resultObject.get("msg").getAsString();
if (code == 200) {
JsonArray resultArray = resultObject.getAsJsonArray("antispam");
if (resultArray.size() == 0) {
System.out.println("暂时没有结果需要获取,请稍后重试!");
} else {
for (JsonElement jsonElement : resultArray) {
JsonObject jObject = jsonElement.getAsJsonObject();
String taskId = jObject.get("taskId").getAsString();
int asrStatus = jObject.get("asrStatus").getAsInt();
if (asrStatus == 4) {
int asrResult = jObject.get("asrResult").getAsInt();
System.out.println(String.format("检测失败: taskId=%s, asrResult=%s", taskId, asrResult));
} else {
int action = jObject.get("action").getAsInt();
JsonArray labelArray = jObject.getAsJsonArray("labels");
if (action == 0) {
System.out.println(String.format("taskId=%s,结果:通过", taskId));
} else if (action == 1 || action == 2) {
// for (JsonElement labelElement : labelArray) {
// JsonObject lObject = labelElement.getAsJsonObject();
// int label = lObject.get("label").getAsInt();
// int level = lObject.get("level").getAsInt();
// JsonObject detailsObject=lObject.getAsJsonObject("details");
// JsonArray hintArray=detailsObject.getAsJsonArray("hint");
// }
System.out.println(String.format("taskId=%s,结果:%s,证据信息如下:%s", taskId, action == 1 ? "不确定" : "不通过",
labelArray.toString()));
}
}
}
}
} else {
System.out.println(String.format("ERROR: code=%s, msg=%s", code, msg));
}
}
}
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
易盾易盾反垃圾云服务音频离线结果获取接口python示例代码
接口文档: http://dun.163.com/api.html
python版本:python3.7
运行:
1. 修改 SECRET_ID,SECRET_KEY,BUSINESS_ID 为对应申请到的值
2. $ python audio_callback.py
"""
__author__ = 'yidun-dev'
__date__ = '2019/11/27'
__version__ = '0.2-dev'
import hashlib
import time
import random
import urllib.request as urlrequest
import urllib.parse as urlparse
import json
class AudioCallbackAPIDemo(object):
"""音频离线结果获取接口示例代码"""
API_URL = "https://as.dun.163yun.com/v3/audio/callback/results"
VERSION = "v3.1"
def __init__(self, secret_id, secret_key, business_id):
"""
Args:
secret_id (str) 产品密钥ID,产品标识
secret_key (str) 产品私有密钥,服务端生成签名信息使用
business_id (str) 业务ID,易盾根据产品业务特点分配
"""
self.secret_id = secret_id
self.secret_key = secret_key
self.business_id = business_id
def gen_signature(self, params=None):
"""生成签名信息
Args:
params (object) 请求参数
Returns:
参数签名md5值
"""
buff = ""
for k in sorted(params.keys()):
buff += str(k) + str(params[k])
buff += self.secret_key
return hashlib.md5(buff.encode("utf8")).hexdigest()
def check(self):
"""请求易盾接口
Returns:
请求结果,json格式
"""
params = {}
params["secretId"] = self.secret_id
params["businessId"] = self.business_id
params["version"] = self.VERSION
params["timestamp"] = int(time.time() * 1000)
params["nonce"] = int(random.random() * 100000000)
params["signature"] = self.gen_signature(params)
try:
params = urlparse.urlencode(params).encode("utf8")
request = urlrequest.Request(self.API_URL, params)
content = urlrequest.urlopen(request, timeout=10).read()
return json.loads(content)
except Exception as ex:
print("调用API接口失败:", str(ex))
if __name__ == "__main__":
"""示例代码入口"""
SECRET_ID = "your_secret_id" # 产品密钥ID,产品标识
SECRET_KEY = "your_secret_key" # 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露
BUSINESS_ID = "your_business_id" # 业务ID,易盾根据产品业务特点分配
api = AudioCallbackAPIDemo(SECRET_ID, SECRET_KEY, BUSINESS_ID)
ret = api.check()
code: int = ret["code"]
msg: str = ret["msg"]
if code == 200:
resultArray: list = ret["antispam"]
if len(resultArray) == 0:
print("暂时没有结果需要获取, 请稍后重试!")
else:
for result in resultArray:
taskId: str = result["taskId"]
asrStatus: int = result["asrStatus"]
if asrStatus == 4:
asrResult: int = result["asrResult"]
print("检测失败: taskId=%s, asrResult=%s" % (taskId, asrResult))
else:
action: int = result["action"]
labelArray: list = result["labels"]
if action == 0:
print("taskId=%s, 结果: 通过" % taskId)
elif action == 1 or action == 2:
# for labelItem in labelArray:
# label: int = labelItem["label"]
# level: int = labelItem["level"]
# details: dict = labelItem["details"]
# hintArray: list = labelItem["hint"]
print("taskId=%s, 结果: %s,证据信息如下: %s" % (taskId, "不确定" if action == 1 else "不通过", labelArray))
else:
print("ERROR: code=%s, msg=%s" % (ret["code"], ret["msg"]))
<?php
/** 离线音频检查结果查询接口 */
/** 产品密钥ID,产品标识 */
define("SECRETID", "your_secret_id");
/** 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露 */
define("SECRETKEY", "your_secret_key");
/** 业务ID,易盾根据产品业务特点分配 */
define("BUSINESSID", "your_business_id");
/** 易盾反垃圾云服务音频检测结果获取接口地址 */
define("API_URL", "https://as.dun.163yun.com/v3/audio/callback/results");
/** api version */
define("VERSION", "v3.1");
/** API timeout*/
define("API_TIMEOUT", 10);
/** php内部使用的字符串编码 */
define("INTERNAL_STRING_CHARSET", "auto");
/**
* 计算参数签名
* $params 请求参数
* $secretKey secretKey
*/
function gen_signature($secretKey, $params){
ksort($params);
$buff="";
foreach($params as $key=>$value){
if($value !== null) {
$buff .=$key;
$buff .=$value;
}
}
$buff .= $secretKey;
return md5($buff);
}
/**
* 将输入数据的编码统一转换成utf8
* @params 输入的参数
*/
function toUtf8($params){
$utf8s = array();
foreach ($params as $key => $value) {
$utf8s[$key] = is_string($value) ? mb_convert_encoding($value, "utf8", INTERNAL_STRING_CHARSET) : $value;
}
return $utf8s;
}
/**
* 反垃圾请求接口简单封装
* $params 请求参数
*/
function check(){
$params = array();
$params["secretId"] = SECRETID;
$params["businessId"] = BUSINESSID;
$params["version"] = VERSION;
$params["timestamp"] = time() * 1000;// time in milliseconds
$params["nonce"] = sprintf("%d", rand()); // random int
$params = toUtf8($params);
$params["signature"] = gen_signature(SECRETKEY, $params);
// var_dump($params);
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'timeout' => API_TIMEOUT, // read timeout in seconds
'content' => http_build_query($params),
),
);
// var_dump($params);
$context = stream_context_create($options);
$result = file_get_contents(API_URL, false, $context);
// var_dump($result);
if($result === FALSE){
return array("code"=>500, "msg"=>"file_get_contents failed.");
}else{
return json_decode($result, true);
}
}
// 简单测试
function main(){
echo "mb_internal_encoding=".mb_internal_encoding()."\n";
$ret = check();
var_dump($ret);
if ($ret["code"] == 200) {
$result_array = $ret["antispam"];
foreach($result_array as $res_index => $result){
$taskId = $result["taskId"];
$asrStatus = $result["asrStatus"];
if($asrStatus == 4) {
$asrResult = $result["asrResult"];
echo "检测失败: taskId={$taskId}, asrResult={$asrResult}";
} else {
$action = $result["action"];
$label_array = $result["labels"];
// 证据信息如下
/*foreach($label_array as $label_index => $labelInfo){
$label = $labelInfo["label"];
$level = $labelInfo["level"];
$detailsObject = $labelInfo["details"];
$hint_array = $detailsObject["hint"];
}*/
if ($action == 0) {
echo "结果:通过,taskId=".$taskId;
} else if ($action == 2) {
echo "结果:不通过,taskId=".$taskId;
}
}
}
}else{
var_dump($ret);
}
}
main();
?>
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Net.Http;
namespace Com.Netease.Is.Antispam.Demo
{
class AudioCallbackApiDemo
{
public static void audioCallBack()
{
/** 产品密钥ID,产品标识 */
String secretId = "your_secret_id";
/** 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露 */
String secretKey = "your_secret_key";
/** 业务ID,易盾根据产品业务特点分配 */
String businessId = "your_business_id";
/** 易盾反垃圾云服务音频离线结果获取接口地址 */
String apiUrl = "https://as.dun.163yun.com/v3/audio/callback/results";
Dictionary<String, String> parameters = new Dictionary<String, String>();
long curr = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
String time = curr.ToString();
// 1.设置公共参数
parameters.Add("secretId", secretId);
parameters.Add("businessId", businessId);
parameters.Add("version", "v3.1");
parameters.Add("timestamp", time);
parameters.Add("nonce", new Random().Next().ToString());
// 2.生成签名信息
String signature = Utils.genSignature(secretKey, parameters);
parameters.Add("signature", signature);
// 3.发送HTTP请求
HttpClient client = Utils.makeHttpClient();
String result = Utils.doPost(client, apiUrl, parameters, 10000);
if(result != null)
{
JObject ret = JObject.Parse(result);
int code = ret.GetValue("code").ToObject<Int32>();
String msg = ret.GetValue("msg").ToObject<String>();
if (code == 200)
{
JArray array = (JArray)ret.SelectToken("result");
foreach (var item in array)
{
JObject jObject = (JObject)item;
String taskId = jObject.GetValue("taskId").ToObject<String>();
int asrStatus = jObject.GetValue("asrStatus").ToObject<Int32>();
if (asrStatus == 4)
{
int asrResult = jObject.GetValue("asrResult").ToObject<Int32>();
Console.WriteLine(String.Format("检测失败: taskId={0}, asrResult={1}", taskId, asrResult));
}
else
{
int action = jObject.GetValue("action").ToObject<Int32>();
JArray labelArray = (JArray)jObject.SelectToken("labels");
if (action == 0) {
Console.WriteLine(String.Format("结果:通过!taskId={0}", taskId));
} else if (action == 2 || action == 1) {
/*foreach (var labelElement in labelArray)
{
JObject lObject = (JObject)labelElement;
int label = lObject.GetValue("label").ToObject<Int32>();
int level = lObject.GetValue("level").ToObject<Int32>();
JObject detailsObject = (JObject)lObject.SelectToken("details");
JArray hintArray = (JArray)detailsObject.SelectToken("hint");
}*/
Console.WriteLine(String.Format("结果:{0}!taskId={1}", action == 1 ? "不确定" : "不通过",taskId));
}
}
}
}
else
{
Console.WriteLine(String.Format("ERROR: code={0}, msg={1}", code, msg));
}
}
else
{
Console.WriteLine("Request failed!");
}
}
}
}
var utils=require("./utils");
//产品密钥ID,产品标识
var secretId="your_secret_id";
// 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露
var secretKey="your_secret_key";
// 业务ID,易盾根据产品业务特点分配
var businessId="your_business_id";
// 易盾反垃圾云服务音频离线结果获取接口地址
var apiurl="https://as.dun.163yun.com/v3/audio/callback/results";
//请求参数
var post_data = {
// 1.设置公有有参数
secretId:secretId,
businessId:businessId,
version:"v3.1",
timestamp:new Date().getTime(),
nonce:utils.noncer()
};
var signature=utils.genSignature(secretKey,post_data);
post_data.signature=signature;
//http请求结果
var responseCallback=function(responseData){
console.log(responseData);
var data = JSON.parse(responseData);
var code=data.code;
var msg=data.msg;
if(code==200){
var result=data.antispam;
if(result.length==0){
console.log("暂时没有结果需要获取,请稍后重试!");
}else{
for(var i=0;i<result.length;i++){
var obj=result[i];
var taskId = obj.taskId;
var asrStatus = obj.asrStatus;
if(asrStatus==4){
var asrResult = obj.asrResult;
console.log("检测失败:taskId="+taskId+",asrResult="+asrResult);
}else{
var action = obj.action;
var labels = obj.labels;
if(action==0){
console.log("通过:taskId="+taskId);
}else if(action==1||action==2){
/*for(var j=0;j<labels.length;j++){
var labelInfo=labels[j];
var label=labelInfo.label;
var level=labelInfo.level;
}*/
console.log("结果:"+action==1?"不确定":"不通过"+"!taskId="+taskId);
}
}
}
}
}else{
console.log('ERROR:code=' + code+',msg='+msg);
}
};
utils.sendHttpRequest(apiurl,"POST",post_data,responseCallback);
/*
@Author : yidun_dev
@Date : 2020-01-20
@File : audio_callback.go
@Version : 1.0
@Golang : 1.13.5
@Doc : http://dun.163.com/api.html
*/
package main
import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"fmt"
simplejson "github.com/bitly/go-simplejson"
"io/ioutil"
"math/rand"
"net/http"
"net/url"
"sort"
"strconv"
"strings"
"time"
)
const (
apiUrl = "https://as.dun.163yun.com/v3/audio/callback/results"
version = "v3.1"
secretId = "your_secret_id" //产品密钥ID,产品标识
secretKey = "your_secret_key" //产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露
businessId = "your_business_id" //业务ID,易盾根据产品业务特点分配
)
//请求易盾接口
func check() *simplejson.Json {
params := url.Values{}
params["secretId"] = []string{secretId}
params["businessId"] = []string{businessId}
params["version"] = []string{version}
params["timestamp"] = []string{strconv.FormatInt(time.Now().UnixNano()/1000000, 10)}
params["nonce"] = []string{strconv.FormatInt(rand.New(rand.NewSource(time.Now().UnixNano())).Int63n(10000000000), 10)}
params["signature"] = []string{genSignature(params)}
resp, err := http.Post(apiUrl, "application/x-www-form-urlencoded", strings.NewReader(params.Encode()))
if err != nil {
fmt.Println("调用API接口失败:", err)
return nil
}
defer resp.Body.Close()
contents, _ := ioutil.ReadAll(resp.Body)
result, _ := simplejson.NewJson(contents)
return result
}
//生成签名信息
func genSignature(params url.Values) string {
var paramStr string
keys := make([]string, 0, len(params))
for k := range params {
keys = append(keys, k)
}
sort.Strings(keys)
for _, key := range keys {
paramStr += key + params[key][0]
}
paramStr += secretKey
md5Reader := md5.New()
md5Reader.Write([]byte(paramStr))
return hex.EncodeToString(md5Reader.Sum(nil))
}
func main() {
ret := check()
code, _ := ret.Get("code").Int()
message, _ := ret.Get("msg").String()
if code == 200 {
resultArray, _ := ret.Get("antispam").Array()
if len(resultArray) == 0 {
fmt.Printf("暂时没有结果需要获取, 请稍后重试!")
} else {
for _, result := range resultArray {
if resultMap, ok := result.(map[string]interface{}); ok {
taskId := resultMap["taskId"].(string)
asrStatus, _ := resultMap["asrStatus"].(json.Number).Int64()
if asrStatus == 4 {
asrResult, _ := resultMap["asrResult"].(json.Number).Int64()
fmt.Printf("检测失败: taskId=%s, asrResult=%s", taskId, asrResult)
} else {
action, _ := resultMap["action"].(json.Number).Int64()
labelArray := resultMap["labels"].([]interface{})
if action == 0 {
fmt.Printf("taskId=%s, 结果: 通过", taskId)
} else if action == 1 || action == 2 {
for _, labelItem := range labelArray {
if labelItemMap, ok := labelItem.(map[string]interface{}); ok {
_, _ = labelItemMap["label"].(json.Number).Int64()
_, _ = labelItemMap["level"].(json.Number).Int64()
_ = labelItemMap["details"].(map[string]interface{})
_ = labelItemMap["hint"].([]interface{})
var printString string
if action == 1 {
printString = "不确定"
} else {
printString = "不通过"
}
fmt.Printf("taskId=%s, 结果: %s,证据信息如下: %s", taskId, printString, labelArray)
}
}
}
}
}
}
}
} else {
fmt.Printf("ERROR: code=%d, msg=%s", code, message)
}
}
响应示例
当获取到离线结果时,输出示例如下:
{
"code":200,
"msg":"ok",
"antispam":[
{
"action":2,
"asrStatus":3,
"asrResult":0,
"taskId":"6ebc7288fd264926afd7d57bcafdf0ed",
"labels":[
{
"label":100,
"level":2,
"details":{
"hint":[
{
"value":"裸聊",
"segments":[
{
"startTime":0,
"endTime":9
}
]
}
],
"hitType":0
}
}
],
"callback":""
},
{
"action":0,
"asrStatus":3,
"asrResult":0,
"taskId":"ec7d4cd98dd447668559635d4a988344",
"labels":[
],
"callback":""
}
],
"language":[
{
"taskId":"6ebc7288fd264926afd7d57bcafdf0ed",
"details":[
{
"type":"English",
"segments":[
{
"startTime":0,
"endTime":10
}
]
}
]
}
]
}
当无最新离线结果需要获取时,输出示例如下:
{
"code": 200,
"msg": "ok",
"antispam":[],
"language":[]
}