内容安全服务
服务设计的初衷和背景
由于上半年工信部监管变得异常严格,很多 APP 因为各种原因被下架,特别是内容服务类的 APP,所以关于内容安全这块可以说是涉及到了公司的命脉,这块不能小视。
设计这个 safety_service(内容安全服务),主要基于业务的以下几个痛点:
- 1.由于历史迭代。人员更替等的原因,原先各个模块下的视频、图片,文本等的审核业务代码分散,不便管理。
 - 2.为了方便统一入口,让上游调用方全部以 单点 触发审核任务,且查询结果也保证 单点 的出口。
 - 3.将第三方审核 API 的并发额度最大化利用。(阿里内容安全,头条内容审核,腾讯云等等各家厂商)
 - 4.复杂资源对象的整体审核。
 
1.原先各个模块下的视频、图片,文本等的审核业务代码分散:
比如在上传 UGC 作品处,会在上传完之后触发异步审核业务,审核结果成功与否再触发回调,去修改相对应的作品上线状态,推荐级别等属性值。
在用户个人中心修改头像、背景图、昵称、个人简介等等信息之后,又会触发图片的异步审核和文本的同步审核,
在话题帖子中,上传图片和发表文章,也会触发内容审核,
在视频或图片详情页等下方留言评论,评论也会加上人工审核(尤其今年上半年工信部审核变严后,基本上评论都要走文本审核)
....
每一处业务逻辑处,都是单独建表,自己写回调逻辑,自己埋点触发任务等。然后获取历史审核结果时也是从各自的审核记录表里边拉取记录。
但我们发现各个时期写的审核模块,其记录的审核结果的结构都不一致,导致结果有的很简略,有的就比较详细。且如果要汇总所有内容的审核结果,这样的统计代码写起来工作量更是翻了几倍。
2.为了方便统一入口,单点触发审核任务,且查询结果也保证单点的出口:
这样做的好处是,所有媒体内容的审核,都由单点触发,表结构也是一整套结构,需要用的审核结果字段可以动态按需获取。另外同样的资源内容也可以在单一服务中进行去重,不占用第三方审核服务的接口使用额度。
使得不管开辟多少个新服务,都能让代码更简洁!
3.将第三方审核 API 的并发额度最大化利用。
这其实是由于第三方额度的限制。
比如阿里的内容安全 API,普通企业版开通后,对于视频、图片、文本的并发路数是由限制的。

(参考:https://help.aliyun.com/document_detail/70409.html?spm=5176.14908214.0.0.3d407e9cY1QTQ8
https://www.aliyun.com/price/product/?spm=a2c4g.11186623.2.22.c034c437j2Y0Mt#/lvwang/detail/cdibag
)
也就是所有调用阿里接口的地方,其实是共用一套额度。如果比方说上传作品处接口瞬时流量增大,并发量赠大,占用掉了所有并发额度。那么个人主页处再想提交审核任务,阿里的API 会返回错误码 588(EXCEED DATA) 并发额度超出。
做了这个 内容审核 service 之后,由单点统一管控并发额度,所有地方的任务都均匀地提交审核,并响应回调结果。这样上游业务方只关心提交任务,并写好回调逻辑即可。至于中间是否因瞬时额度超出而导致任务提交失败,或者需要重试等等,均不关心!
4.复杂资源对象的整体审核。
传统的审核任务是以细化的媒体资源为单位的,比如我现在审核一个用户上传的视频,视频是涉黄涉恐或是广告,然后根据结果去执行后续的业务逻辑。
但有些场景,比如涉及到作品推荐级别,作品可见性的场景。我们要求作品的复合属性需要全部审核通过。
比如用户上传了一个视频,视频属性包括
视频 url 链接,视频标题,视频描述,设置的封面图,
这四个属性。
业务方需要当视频的各个属性都审核通过时,才设置作品为 “线上可见”,或者推荐级别为推荐或精选等等。
如果传统的分散编写代码,它们需要分别记录这四个单独的任务的回调结果,自己维持这个临时记录,然后不断轮询结果,判断当所有子任务都审核过的时候,才触发后续的业务逻辑(修改作品可见性,推荐级别等等)。
显然临时结果的存储以及后续判断状态的轮询,对于业务上游的调用方都是额外的负担,不仅要单独建表(或redis),还要写定时任务去一直轮询。
所以我在这个 service 里设计了 组任务(group_task) 的概念。
这个组任务的概念涉及到两个方面:
- 提交任务时,任务参数提交的是多个任务的数组,也就是可以提交一个或多个子任务,每个子任务必须是视频、图片地址或是文本内容。同时可以附带上相应的回调函数(callback)。
 - 只有当一个 group_task 的所有子任务审核状态都为通过 (pass)时,group_task 的结果才为 pass,否则要么为审核中(submitted,还没审核完),要么为子任务中最严重的等级(若出现疑似(review),则组任务最终状态为 review,出现违规(block),则组任务最终状态为 block)。
 
这样就解决了复合对象的整体审核问题,调用方只关心提交任务和查询结果(或处理回调),不关心中途是如何记录子任务状态,也不用自己去写失败重试逻辑等。
后来经过内部讨论,决定整合所有内容安全的审核业务,独立出来这个服务( safety_service).
表结构ER图:

设计流程图:

具体详见博客文章:http://www.liuyang1.com/content-safety
监测指标:
- 平均从提交任务,到返回结果至更新表 status 字段所耗时:(平均文本1-3 秒,图片2-4 秒,视频取决于时长 1~2min +)
 - 任务超时率(一定时间内未接收回调并更新表 status)
 - 任务提交失败率。(常见错误码 588 
EXCEED DATA, 超出瞬时并发检测路数限制) - 任务回调的失败率。(见附表:
阿里API返回错误码) - 任务平均重试次数
 
SQL 设计:
1. 组任务审核记录表:xxx_resource_safety_validation_group_task
```DROP TABLE IF EXISTS xxx_resource_safety_validation_group_task;
CREATE TABLE xxx_resource_safety_validation_group_task
(
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`group_id` varchar(100) NOT NULL COMMENT '审核组 ID',
`group_task_status`     varchar(50)  NOT NULL DEFAULT 'submitted' COMMENT 'task状态,processing——正在处理中, failed——审核失败, submitted——已提交, success——审核成功',
`resource_hash_mappings` mediumtext COMMENT '关联的 resource_hash,多个之间用逗号分割',
`callback` varchar(255) NOT NULL DEFAULT '' COMMENT '调用方传入的结果回调url',
`raw_task_info` mediumtext COMMENT '原任务信息,encode(task_params)',
`ctime`           datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`utime`           datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_group_id` (`group_id`),
KEY `index_group_task_status` (`group_task_status`),
KEY `index_utime` (`utime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx资源内容安全,组审核任务';
2. 子任务审核结果(sharding:20张表):xxx_resource_safety_validation_results_new
-- 分表二十张
DROP TABLE IF EXISTS `xxx_resource_safety_validation_results_new`;
CREATE TABLE `xxx_resource_safety_validation_results_new`
(
    `id`              int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `validation_type` varchar(50)  NOT NULL DEFAULT 'aliyun' COMMENT '审核方式,aliyun——阿里内容安全接口',
    `task_id`         varchar(100) NOT NULL COMMENT '阿里内容安全 taskId',
    `task_status`     varchar(50)  NOT NULL DEFAULT 'submitted' COMMENT 'task状态,processing——正在处理中, failed——审核失败, submitted——已提交, success——审核成功',
    `task_result`     varchar(100) NOT NULL DEFAULT '' COMMENT '任务执行结果详情,DOWNLOAD_TIMEOUT —— 资源链接下载失败, ...',
    `resource_hash`    varchar(40) NOT NULL COMMENT 'sha1(resource_type + resource_url + text_content)',
    `content_hash` varchar(50) NOT NULL COMMENT '内容去重hash,地址不同可能 hash 相同,防止重复内容提交',
    `resource_type`   varchar(100) NOT NULL COMMENT '资源类型,text--文本类型,image--图片类型,video--视频类型,voice--音频类型',
    `callback` varchar(255) NOT NULL DEFAULT '' COMMENT '调用方传入的结果回调url',
    `validation_result`    varchar(32) NOT NULL DEFAULT '' COMMENT '正常——pass, review——疑似, block——违规',
    `validation_label`    varchar(2000) NOT NULL DEFAULT '' COMMENT '审核不过的结果json,包含label: porn(涉黄), terrorism(涉恐),...',
    `ctime`           datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `utime`           datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uniq_task_id` (`task_id`),
    UNIQUE KEY `uniq_resource_hash` (`resource_hash`),
    KEY               `index_validation_result` (`validation_result`),
    KEY               `index_ctime` (`ctime`),
    KEY               `index_utime` (`utime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx资源内容安全审核结果_0';
3.子任务resource_hash - 详情映射表(sharding:20张表):xxx_resource_safety_validation_resource_hash_to_detail
DROP TABLE IF EXISTS `xxx_resource_safety_validation_resource_hash_to_detail`;
CREATE TABLE `xxx_resource_safety_validation_resource_hash_to_detail`
(
    `id`              int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `resource_hash`    varchar(40) NOT NULL COMMENT 'sha1(resource_type + resource_url + text_content)',
    `resource_url`    varchar(255) NOT NULL DEFAULT '' COMMENT '资源链接(非文本类型)',
    `text_content` mediumtext COMMENT '文本详情',
    `ext_info` varchar(255) NOT NULL DEFAULT '' COMMENT '调用方附带的额外信息',
    `ctime`           datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `utime`           datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uniq_resource_hash` (`resource_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx资源内容安全,资源“hash-详情”映射表';
4.三方平台审核任务ID - resource_hash 映射表(sharding:20张表):xxx_resource_safety_validation_task_id_to_resource
DROP TABLE IF EXISTS `xxx_resource_safety_validation_task_id_to_resource`;
CREATE TABLE `xxx_resource_safety_validation_task_id_to_resource`
(
    `task_id` varchar(50) NOT NULL COMMENT '阿里的回调是以 taskId 做唯一标识,此表方便反查定位 resource_hash 来更新记录',
    `resource_hash`    varchar(40) NOT NULL COMMENT 'sha1(resource_type + resource_url + text_content)',
    PRIMARY KEY (`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx资源内容安全,“task_id-resource_hash”映射表';
5.资源内容特征hash - resource_hash 映射表(sharding:20张表):xxx_resource_safety_validation_content_hash_to_resource
DROP TABLE IF EXISTS `xxx_resource_safety_validation_content_hash_to_resource`;
CREATE TABLE `xxx_resource_safety_validation_content_hash_to_resource`
(
    `content_hash` varchar(50) NOT NULL COMMENT '内容去重hash,地址不同可能 hash 相同,防止重复内容提交',
    `resource_hash`    varchar(40) NOT NULL COMMENT 'sha1(resource_type + resource_url + text_content)',
    PRIMARY KEY (`content_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx资源内容安全,“content_hash-resource_hash”映射表';
阿里API 相关问题:
1.返回 code 592, download_timeout:

实际测下来发现图片尺寸和大小未超,反馈阿里问是不是下载超时 3s,给的 CDN 地址按道理不会下载很慢,所以让那边帮忙查 log 看具体是不是下载超时?
2.任务回调结果失败,定期补偿重试?重试三次仍失败则标记任务失败。
由于传过去的 URL 图片类型是 CDN 地址,但 CDN 地址有可能 cdn 缓存没刷过,导致第一次下载超时(阿里设置的下载 5s 超时),所以子任务会有一定次数的重试机制。
当 task_status = failed 或 submitted 时,回调失败触发一次子任务重试,retry_count 字段 + 1
风控部分:
1.【灰产】有人用自动工具频繁上传同一视频,每次把标题做部分修改替换然后上传,这部分人需要识别出 UID,将其作品标识为 “仅自己可见”:
审核任务同步异步形式及检测标签范围:
| 资源类型 | 同步/异步 | 检测范围 | 
|---|---|---|
| 图片 | 【√】同步支持 | 图片智能鉴黄、图片暴恐涉政、图文违规、图片二维码、图片不良场景、图片logo | 
| 【√】异步支持 | 图片智能鉴黄、图片暴恐涉政、图文违规、图片二维码、图片不良场景、图片logo | |
| 视频 | 【√】同步支持 | 视频智能鉴黄、视频暴恐涉政、视频不良场景、视频logo、视频图文违规 | 
| 【√】异步支持 | 视频智能鉴黄、视频暴恐涉政、视频不良场景、视频logo、视频图文违规、视频语音违规 | |
| 文本 | 【√】同步支持 | antispam (包含规则为:色情、广告、灌水、渉政、辱骂等) :文本反垃圾算法 | 
| 语音 | 【√】短语音同步检测 | antispam:音频反垃圾算法 | 
| 【√】异步支持 | antispam:音频反垃圾算法 | 
阿里云内容安全 API 检测覆盖场景:
| 资源类型 | label | 场景名称 | 描述 | 检测结果分类 | 
|---|---|---|---|
| 图片 | 【porn】图片智能鉴黄 | 检测图片是否包含色情、性感内容。 | 正常、色情、性感 | 
| 【terrorism】图片暴恐涉政 | 检测图片是否包含暴恐或涉政类内容。 | 正常、血腥、爆炸烟光、特殊装束、特殊标识、武器、涉政、打斗、聚众、游行、车祸现场、旗帜、地标 | |
| 【ad】图文违规 | 检测图片是否包含广告和文字违规信息。 | 正常、文字含涉政内容、文字含涉黄内容、文字含辱骂内容、文字含暴恐内容、文字含违禁内容、文字含其他垃圾内容、牛皮癣广告、含二维码、含小程序码、其他广告说明 默认仅支持正常、广告分类。(如果需要其他分类,需要提交工单)。 | |
| 【qrcode】图片二维码 | 检测图片是否包含二维码或小程序码。 | 正常、含二维码、含小程序码说明 默认仅支持正常、含二维码分类。(如果需要其他分类,需要提交工单)。 | |
| 【live】图片不良场景 | 检测图片是否包含黑屏、黑边、昏暗画面、画中画、吸烟、车内直播等不良场景。 | 正常、图片中无内容(例如黑屏、白屏)、画中画、吸烟、车内直播 | |
| 【logo】图片logo | 检测图片是否包含logo信息,例如台标,商标等。 | 正常、含受管控的logo、含商标 | |
| 视频 | 【porn】视频智能鉴黄 | 检测视频中是否包含色情内容。 | 正常、色情 | 
| 【terrorism】视频暴恐涉政 | 检测视频中是否包含暴恐涉政内容。 | 正常、暴恐涉政 | |
| 【live】视频不良场景 | 检测视频中是否包含不良场景。 | 正常、不良场景(例如黑屏、白屏) | |
| 【logo】视频logo | 检测视频中是否包含特定的logo。 | 正常、logo | |
| 【ad】视频图文违规 | 检测视频中是否包含广告或违规的文字内容。 | 正常、广告或文字违规 | |
| 视频语音违规说明 该场景仅支持通过视频异步检测接口调用。如需使用,请参见 异步检测。 | 检测视频中的语音内容是否包含违规信息。说明 默认识别语言为中文。(如果需要识别英文内容,需要提交工单)。 | 正常、含垃圾信息、广告、涉政、暴恐、辱骂、色情、灌水、违禁、自定义(例如命中自定义关键词) | |
| 文本 | 【antispam】反垃圾算法 | 检测文本内容是否触发反垃圾规则 | 色情、广告、灌水、渉政、辱骂等 | 
| 音频 | 【antispam】反垃圾算法 | 检测音频内容是否触发反垃圾规则 | 色情、广告、灌水、渉政、辱骂等 | 
审核结果常量:
| 字段名 | 取值 | 
|---|---|
| suggestion | pass:正常,可以直接放行。 | 
| review:疑似,建议自行人工审核确认。 | |
| block:违规,可以直接删除或者限制公开。 | |
| scene | porn: 涉黄 | 
| terrorism: 涉恐 | |
| ad: 广告 | |
| qrcode: 图片二维码 | |
| live: 图片不良场景 | |
| logo: 图片logo | |
| label | normal: 正常 | 
| sexy: 性感 | |
| porn: 黄色 | |
| bloody: 血腥 | |
| explosion: 爆炸烟光 | |
| outfit: 特殊装束 | |
| logo: 特殊标识 | |
| weapon: 武器 | |
| politics: 涉政 | |
| violence: 打斗 | |
| crowd: 聚众 | |
| parade: 游行 | |
| carcrash: 车祸现场 | |
| flag: 旗帜 | |
| location: 地标 | |
| others: 其他 | |
| abuse: 文字含辱骂内容 | |
| contraband: 文字含违禁内容 | |
| spam: 文字含垃圾内容 | |
| npx: 牛皮癣广告 | |
| programCode: 小程序码 | |
| meaningless: 图片中无内容(例如,黑屏、白屏) | |
| PIP: 画中画 | |
| smoking: 吸烟 | |
| drivelive: 车内直播 | |
| TV: 含受管控的logo | |
| trademark: 含商标 | |
| flood:(文字)灌水 | |
| customized: 命中阿里内容安全后台配置的自定义关键词 | 
阿里云 API 输入文件限制:
| 资源类型 | 同步/异步 | 输入限制 | 
|---|---|---|
| 视频 | 同步 | 视频要求: 1.视频文件链接支持以下协议:HTTP和HTTPS。 2.视频文件支持以下格式:AVI、FLV、MP4、MPG、ASF、WMV、MOV、WMA、RMVB、RM、FLASH、TS。 3.视频大小限制:单个视频大小不超过200 MB。(如果有大视频的检测需求(最大支持2 GB),可以提交工单进行调整。) 4.视频流支持以下协议:RTMP、HLS、HTTP-FLV、RTSP。 5.视频流时长限制:单个视频流检测任务最长支持24小时,超过24小时任务自动结束。 | 
| 异步 | 视频要求: 1.视频文件链接支持以下协议:HTTP和HTTPS。 2.视频文件支持以下格式:AVI、FLV、MP4、MPG、ASF、WMV、MOV、WMA、RMVB、RM、FLASH、TS。 3.视频大小限制:单个视频大小不超过200 MB。(如果有大视频的检测需求(最大支持2 GB),可以提交工单进行调整。) 4.视频流支持以下协议:RTMP、HLS、HTTP-FLV、RTSP。 5.视频流时长限制:单个视频流检测任务最长支持24小时,超过24小时任务自动结束。 6.视频检测的时间依赖于视频的下载时间。需要保证被检测的视频文件所在的存储服务稳定可靠。 | |
| 视频按帧审核 | 视频截帧要求: 1.视频帧链接支持以下协议:HTTP和HTTPS。 2.视频帧支持以下格式:PNG、JPG、JPEG、BMP、GIF、WEBP。 视频帧大小限制为10 MB以内。3. 视频帧像素建议不低于256*256,像素过低可能会影响识别效果。4. 视频检测接口的响应时间依赖视频帧的下载时间。需要保证被检测视频帧所在的存储服务稳定可靠。 | |
| 图片 | 同步 | 图片要求: 1.图片链接支持以下协议:HTTP和HTTPS。 2.图片支持以下格式:PNG、JPG、JPEG、BMP、GIF、WEBP。3. 图片大小限制为20 MB以内(适用于同步和异步调用),高度或者宽度不能超过30,000像素(px),且图像总像素不超过2.5亿px。 4.图片下载时间限制为3秒内,如果下载时间超过3秒,返回下载超时。 5.图片像素建议不低于256*256,像素过低可能会影响识别效果。 6.图片检测接口的响应时间依赖图片的下载时间。需要保证被检测图片所在的存储服务稳定可靠。 | 
| 异步 | 图片要求: 1.图片链接支持以下协议:HTTP和HTTPS。2. 图片支持以下格式:PNG、JPG、JPEG、BMP、GIF、WEBP。 3.图片大小限制为20 MB以内(适用于同步和异步调用),高度或者宽度不能超过30,000像素(px),且图像总像素不超过2.5亿px。 4.图片下载时间限制为3秒内,如果下载时间超过3秒,返回下载超时。 5.图片像素建议不低于256*256,像素过低可能会影响识别效果。 6.图片检测接口的响应时间依赖图片的下载时间。需要保证被检测图片所在的存储服务稳定可靠。 | |
| 文本 | 同步 | 无明确规定大小限制,但限于 POST 方式大小限制,一般我们使用时不要超过 2M。具体我们使用时限制文本字数 2000字,如果过长可以进行截断然后分次审核。 | 
| 音频 | 同步 | 音频文件要求: 1. 支持的音频文件大小小于20 MB。 2.支持的语音文件时长小于1分钟。 3.支持的音频文件格式:MP3、WAV、AAC、WMA、OGG、M4A、M3U8。 4.支持以下包含音频的视频文件格式:AVI、FLV、MP4、MPG、ASF、WMV、MOV、RMVB、RM。 | 
| 异步 | 音频文件要求: 1.支持的音频文件大小小于200 MB。 2.支持的音频文件格式:MP3、WAV、AAC、WMA、OGG、M4A、AMR、AUDIO、M3U8。 3.支持以下包含音频的视频文件格式:AVI、FLV、MP4、MPG、ASF、WMV、MOV、RMVB、RM。 | |
| 异步(音频流) | 语音流要求: 1.语音流时长小于24小时。 2.支持的语音流协议:HTTP、RTMP、RTSP。 3.支持的语音流格式:M3U8、FLV。 | 
阿里API返回错误码
| 错误代码Enum | HTTP code | 描述 | 
|---|---|---|
| 2xx | 成功 | |
| 4xx | 客户端请求有误 | |
| 5xx | 后端处理有误 | |
| OK | 200 | 请求成功。 | 
| PROCESSING | 280 | 任务正在执行中,建议您等待一段时间(例如5s)后再查询结果。 | 
| BAD_REQUEST | 400 | 请求有误,通常由于请求参数不正确导致,请仔细检查请求参数。 | 
| NOT_ALLOWED | 401 | 请求失败,通常是由于使用了不安全的图片、视频、语音链接地址。 | 
| FORBIDDEN | 403 | 请求访问失败,通常由于您的图片、视频、语音链接无法访问导致,请确认公网是否可访问,并且无防盗链策略。 | 
| NOT_FOUND | 404 | 待检测内容未找到,通常是由于您的图片、视频、语音内容无法下载导致,请确认内容可通过公网访问到。 | 
| DOWNLOAD_FAILED | 480 | 下载失败,请确认待检测内容的大小、分辨率(如果有)在API的限制范围内。 | 
| GENERAL_ERROR | 500 | 一般是服务端临时出错。建议重试,若持续返回该错误码,请通过工单联系我们。 | 
| DB_FAILED | 580 | 数据库操作失败。建议重试,若持续返回该错误码,请通过工单联系我们。 | 
| TIMEOUT | 581 | 超时。建议重试,若持续返回该错误码,请通过工单联系我们。 | 
| CACHE_FAILED | 585 | 缓存出错。建议重试,若持续返回该错误码,请通过工单联系我们。 | 
| ALGO_FAILED | 586 | 算法出错。请通过工单联系我们。 | 
| MQ_FAILED | 587 | 中间件出错。请通过工单联系我们。 | 
| EXCEED_QUOTA | 588 | 请求频率超出配额。默认配额:图片检测50张/秒,视频检测20路/秒,语音检测20路/秒,文本检测100条/秒。如果需要调整配额,请通过工单联系我们。说明 关于价格说明,请参见 内容安全产品定价。 | 
| TOO_LARGE | 589 | 待检测内容过大,请确保检测的内容在API的限制范围内。建议重试,若持续返回该错误码,请通过工单联系我们。 | 
| BAD_FORMAT | 590 | 待检测内容格式错误,请确保检测的内容在API的限制范围内。 | 
| CONNECTION_POOL_FULL | 591 | 连接池满。请通过工单联系我们。 | 
| DOWNLOAD_TIMEOUT | 592 | 下载超时,下载时间限制为3s,请确保检测的内容大小在API的限制范围内。 | 
| EXPIRED | 594 | 任务过期,如taskId过期。 | 
| CATCH_FRAME_FAILED | 595 | 截帧失败,请通过工单联系我们。 | 
| PERMISSION_DENY | 596 | 账号未授权、账号欠费、账号未开通、账号被禁等原因,具体可以参考返回的msg。 | 
todolist
| todo | 
|---|
| 2.3 测试头条内容审核服务,腾讯内容审核服务的接口,加入多平台实现。 | 
| 3.2 任务回调失败时,往往是 download timeout, algo failed 等错误。拿到回调失败通知时,尝试重试一到两次。 |