服务端

实现音视频安全检测

更新时间: 2024/03/25 11:00:41

本文介绍音视频通话2.0接入安全通的步骤。

背景介绍

泛娱乐类音视频聊天场景中,充斥着各种不可控的风险因素,例如色情、暴恐和涉政信息等。随着国家监管的日趋严格,各平台需要对平台的音视频内容进行管控,自行处理音视频内容审核需要投入大量人力进行甄别。 网易云信融合网易易盾的内容审核能力,为开发者提供实时音视频安全通(内容安全审核)服务(以下简称安全通),对音视频内容进行有效的判别和筛选,降低人力投入。

视频讲解

功能介绍

安全通是基于实时音视频通话的内容审核及处理功能。安全通的基础功能包含:

  • 创建安全通审核任务
  • 查询审核视频截图
  • 查询审核音频断句
  • 停止安全通审核任务
  • 接收安全审核结果
  • 处理安全审核结果

基于实时音视频通话内容,实现全流程的“审-查-禁”服务功能。

操作流程

安全通服务支持音视频2.0 全终端接入检测,无论您使用的是什么平台,接入流程一致。

流程图.png

功能实现

步骤一 准备工作

接入安全通之前,请确保已完成以下准备工作:

  • 登录云信控制台创建应用、申请开通音视频通话 2.0 服务和安全通服务。具体步骤请参见音视频通话2.0接入流程开通安全通服务
  • 实现基础的音视频通话功能,具体操作步骤请参见实现音视频通话
  • 准备接收抄送消息的服务器公网地址,并配置消息抄送。配置方法请参见开通消息抄送。审核结果会以消息抄送发送至您预留的抄送地址。
  • 配置内容检测相关规则。在安全通功能页面,单击右上角的更多安全配置,配置安全检测策略。具体步骤请参见开通安全通服务
  • 准备音视频通话开发环境。

步骤二 创建音视频通话

  1. (可选)创建房间,传入指定的房间名及用户ID。

    如果已存在音视频通话的房间,您也可以直接加入音视频通话的房间。

    例如,房间名为 neteasetest ,用户ID为 12345 。示例代码如下:

    curl --location --request POST 'https://logic-dev.netease.im/v2/api/room' \
    --header 'AppKey: ***' \  //请使用您应用的appkey
    --header 'Nonce: ***' \  //随机数,最大长度为 128 个字符。
    --header 'CurTime: 1639555317' \  //当前 Unix 时间戳,即从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在的秒数。数据类型为 String。
    --header 'CheckSum: ba193e4d4ba3991987eb72afe692095598552b79' \ //计算方式详见:https://doc.yunxin.163.com/nertc/server-apis/TA5MjEzNTM?platformId=50326
    --header 'Content-Type: application/json' \
    --data-raw '{
    "channelName": "neteasetest",
    "mode": 2,
    "uid": 12345
    }'
    
    

    返回示例如下:

    {
    "code": 200,
    "errmsg": "reason code 200", //code 200即为创建成功,其他状态码请参考 https://doc.yunxin.163.com/nertc/server-apis/DY2NDIwMTM?platformId=50326
    "cid": 1344424603797473
    }
    
  2. 建立音视频通话。

    为了方便演示,本文以Web端进行音视频通话,传入与创建房间时相同的房间名,建立音视频通话。

    this.client.join({
        channelName: "neteasetest", //房间名
        uid: 12345, //用户id
        token: '' //鉴权token,详见:https://doc.yunxin.163.com/nertc/server-apis/TQ0MTI2ODQ?platformId=50002
      });
    

步骤三 创建安全通审核任务

  • 创建安全通审核任务之前,请确保房间已创建且房间中已有一名以上成员。
  • 安全通审核任务的开始和结束,都是针对房间。

为对应房间开启安全通审核任务,具体步骤请参见创建安全通审核任务
您可根据自身业务选择是否开启自动打码,详细信息请参见安全通审核自动打码

示例代码如下:

curl --location --request POST 'https://logic-dev.netease.im/livewallsolution/submit' \
--header 'AppKey: ***' \  //请使用您应用的appkey
--header 'Nonce: ***' \  //随机数,最大长度为 128 个字符。
--header 'CurTime: 1639555317' \  //当前 Unix 时间戳,即从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在的秒数。数据类型为 String。
--header 'CheckSum: ba193e4d4ba3991987eb72afe692095598552b79' \ //计算方式详见:https://doc.yunxin.163.com/nertc/server-apis/TA5MjEzNTM?platformId=50326
--header 'Content-Type: application/json' \
--data-raw '{
    "monitorUid": 666666,
    "channelName": "neteasetest",
    "detectType": 0,
    "scFrequency": 5,
    "callbackUrl": "***",  //接收审核任务的地址,详见2.1
    "enableMask": true, //开启自动打码
    "maskType": 0,
    "duration": 15
}'

返回示例如下:

{
    "code": 200,
    "result": {
        "taskId": "***", //审核任务id,用于后续审核任务的详情查询
        "status": true,
        "dataId": "235979990138017090111639568801012" //网易云信为您自动生成的数据唯一标识。如果您对检测结果有任何疑问,请根据 dataId 咨询技术支持。
    }
}

至此,您的音视频通话即正式进入审核阶段。

步骤四 接收安全审核结果

  1. 实现审核结果接收服务。

    在准备工作中,我们已配置了接收抄送消息的服务器公网地址,安全审核过程中,会将异常行为实时回调到您配置的地址中,您需要在该地址中实现对应审核消息的接收。 PHP 解析抄送内容的相关示例请参见[KB0304] PHP解析网易服务器抄送和回调的Header和Body示例

    在本次演示中,以实现最简单的抄送内容接收及打印为例。

    public String robot(@RequestBody String msg) {
            logger.info(msg);
            System.out.println(msg);
            return "robot";
        }
    

当音视频内容没有违规内容时,不会触发审核抄送。只有在音视频内容有违规问题时,才会触发具体异常详情抄送,具体请参见安全通审核事件

  1. 模拟触发违规内容。

    在进行通话之前,提前配置部分敏感词作为审核过滤条件。

关键词配置.png

在视频通话中,模拟相关的视频内容。

视频通话.png

  1. 接收审核结果。

    触发违规内容后,您配置的接收抄送服务的地址,就能收到该次通话相关的审核结果。以下示例代码展示了视频相关的审核结果,音频也可以进行同步审核。审核结果字段说明请参见 安全通审核事件字段说明

    {
    "data": {
    	"dataId": "235979990138***568801012",
    	"callback": "",
    	"channelName": "neteasetest",
    	"evidences": {
    		"video": {
    			"evidence": {
    				"uid": 12345,
    				"beginTime": 1639569545356,
    				"endTime": 1639569545356,
    				"type": 1,
    				"url": "https://yidun-video.nos-eastchina1.126.net/ur9j7xwis91ejyprqsuilchg04009rez_12345_1639569545374.jpg?            Signature=GR%2FQRk37f8k7ukRVLkeTtZiQWNfRMEx%2BL0uIeogAQ5M%3D&Expires=1642161545&NOSAccessKeyId=7b107844ee8e4f9689d54c726e3273ff"
    			},
    			"labels": [{
    				"subLabels": [{
    					"subLabel": 400017,
    					"rate": 1.0,
    					"details": {
    						"hitInfos": ["好好学习"],
    						"hitLocationInfos": [{
    							"y1": 0.33333334,
    							"x1": 0.20926562,
    							"y2": 0.56666666,
    							"x2": 0.7454219,
    							"hitInfo": "好好学习"
    						}],
    						"imageListInfos": [{
    							"type": 2,
    							"word": "好好学习"
    						}]
    					}
    				}],
    				"level": 2,
    				"rate": 1.0,
    				"label": 400
    			}]
    		}
    	},
    	"censorSource": 2,
    	"channelId": 1344424***7473,
    	"taskId": "ur9j7xwis91ejyprq****009rez",
    	"status": 101
    },
    "eventType": 400
    }
    

步骤五 处理安全审核结果。

1.移除成员。

发现通话存在违规只是安全审核的第一步,接下来需要处理安全审核的结果。在配置安全策略时,您可以根据您具体的业务情况,来辨别审核力度。

针对审核结果,每个业务会有不同的策略,或是在客户端弹出相关提示,或是直接结束该通通话。

云信的音视频通话提供房间管理的相关服务端 API 接口,可以对房间内的成员进行移除,或是对整个房间进行关闭。

以下示例代码以移除违规房间成员为例,服务端移除成员的接口说明请参见移除成员

 curl --location --request POST 'https://logic-dev.netease.im/v3/api/kicklist/members?cname=neteasetest1&uid=12345' \
        --header 'AppKey: ***' \  //请使用您应用的appkey
        --header 'Nonce: ***' \  //随机数,最大长度为 128 个字符。
        --header 'CurTime: 1639555317' \  //当前 Unix 时间戳,即从 197011000 秒开始到现在的秒数。数据类型为 String。
        --header 'CheckSum: ba193e4d4ba3991987eb72afe692095598552b79' \ //计算方式详见:https://doc.yunxin.163.com/nertc/server-apis/TA5MjEzNTM?platformId=50326
        --header 'Content-Type: application/json' \
        --data-raw ''

该请求无返回结果,HTTP 200表示请求成功。

2.客户端处理。

客户端会收到被移除房间的回调,以 Web 端为例:
this.client.on('client-banned', (event) => {
      logger.log('peer-leave', event);
      message.error('你已被踢出房间');
     });

被移出房间.png

步骤六 结束审核任务。

完成音视频通话的安全审核后,您需要结束该通话频道的审核任务。具体接口说明请参见 停止安全通审核任务

示例代码如下:

curl --location --request POST 'https://logic-dev.netease.im/livewallsolution/feedback' \
--header 'AppKey: ***' \  //请使用您应用的appkey
--header 'Nonce: ***' \  //随机数,最大长度为 128 个字符。
--header 'CurTime: 1639555317' \  //当前 Unix 时间戳,即从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在的秒数。数据类型为 String。
--header 'CheckSum: ba193e4d4ba3991987eb72afe692095598552b79' \ //计算方式详见:https://doc.yunxin.163.com/nertc/server-apis/TA5MjEzNTM?platformId=50326
--header 'Content-Type: application/json' \
--data-raw '{
    "realTimeInfoList": [
        {
        "channelName": "neteasetest",
        "status": 100
        }
    ]
}'

返回示例如下:

{
    "code": 200,
    "result": [
        {
            "channelName": "neteasetest",
            "result": 0,
            "taskId": "ur9j7xwis91ejyprqsuilchg04009rez"
        }
    ]
}
此文档是否对你有帮助?
有帮助
去反馈
  • 背景介绍
  • 视频讲解
  • 功能介绍
  • 操作流程
  • 功能实现
  • 步骤一 准备工作
  • 步骤二 创建音视频通话
  • 步骤三 创建安全通审核任务
  • 步骤四 接收安全审核结果
  • 步骤五 处理安全审核结果。
  • 步骤六 结束审核任务。