使用 Azure AI 视频索引器 API 对人脸进行修订

可以使用 Azure AI 视频索引器检测和识别视频中的人脸。 若要修改视频以模糊(编辑)特定人员的人脸,可以使用 API。

包含多个人脸的几分钟片段可能需要数小时才能手动编辑,但通过使用视频索引器 API 中的预设,人脸修订过程只需几个简单的步骤。

本文介绍如何使用 API 来编辑人脸。 视频索引器 API 包括人 脸修订 预设,可在云中提供可缩放的人脸检测和修订(模糊)。 本文演示了如何使用 API 详细编辑人脸的每个步骤。

以下视频演示如何使用 Azure AI 视频索引器 API 编辑视频。

符合性、隐私和安全性

作为重要 提醒,必须使用视频索引器派生的分析或见解时遵守所有适用的法律。

人脸服务访问基于资格和使用条件进行限制,以支持Microsoft负责任的 AI 原则。 人脸服务仅适用于Microsoft托管客户和合作伙伴。 使用人脸识别引入表单来申请访问。 有关详细信息,请参阅人脸受限访问页面。

人脸修订术语和层次结构

视频索引器中的人脸修订依赖于我们在视频标准和高级分析预设中提供的现有视频索引器人脸检测结果的输出。

若要编辑视频,必须先将视频上传到视频索引器,然后使用标准高级视频预设完成分析。 可以使用 Azure AI 视频索引器网站或 API 执行此操作。 然后,可以使用人脸修订 API 通过该值引用此视频 videoId 。 我们将创建一个新视频,其中已指示的人脸经过修订。 视频分析和人脸修订都是单独的计费作业。 有关详细信息,请参阅我们的 定价页

模糊的类型

可以从不同类型的模糊面部修订中进行选择。 若要选择类型,请在请求正文中使用参数的名称或代表编号 blurringKind

模糊Kind 数字 模糊Kind 名称 示例
0 MediumBlur Azure AI 视频索引器中等模糊的照片。
1 HighBlur Azure AI 视频索引器高模糊的照片。
2 LowBlur Azure AI 视频索引器低模糊的照片。
3 BoundingBox Azure AI 视频索引器边界框的照片。
4 Azure AI 视频索引器黑盒类型的照片。

可以使用参数指定请求正文 blurringKind 中的模糊类型。

下面是一个示例:

{
    "faces": {
        "blurringKind": "HighBlur"
    }
}

或者,使用表示上表中所述的模糊类型的数字:

{
    "faces": {
        "blurringKind": 1
    }
}

筛选器

可以应用筛选器来设置要模糊的人脸 ID。 可以在 JSON 文件的正文中以逗号分隔的数组指定人脸 ID。 使用 scope 参数排除或包括这些人脸进行修订。 通过指定 ID,可以编辑除你指示的 ID 以外的所有人脸,或只编辑这些 ID。 请参阅下一节中的示例。

排除范围

在以下示例中,若要编辑除人脸 ID 1001 和 1016 之外的所有人脸,请使用范围 Exclude

{
    "faces": {
        "blurringKind": "HighBlur",
        "filter": {
            "ids": [1001, 1016],
            "scope": "Exclude"
        }
    }
}

包括范围

在以下示例中,若要仅编辑人脸 ID 1001 和 1016,请使用范围 Include

{
    "faces": {
        "blurringKind": "HighBlur",
        "filter": {
            "ids": [1001, 1016],
            "scope": "Include"
        }
    }
}

编辑所有人脸

若要编辑所有人脸,请删除范围筛选器:

{
    "faces": {
        "blurringKind": "HighBlur",
    }
}

若要检索人脸 ID,可以转到索引视频并检索 项目文件。 项目包含faces.json文件和缩略图.zip文件,其中包含视频中检测到的所有人脸。 可以将人脸与 ID 匹配,并决定要修订的人脸 ID。

创建修订作业

若要创建修订作业,可以调用以下 API 调用:

POST https://api.videoindexer.ai/{location}/Accounts/{accountId}/Videos/{videoId}/redact[?name][&priority][&privacy][&externalId][&streamingPreset][&callbackUrl][&accessToken]

需要以下值:

名称 说明
Accountid {accountId} 视频索引器帐户的 ID。
Location {location} 视频索引器帐户所在的 Azure 区域。 例如 westus。
AccessToken {token} 具有通过 Azure 资源管理器 REST API 生成的帐户参与者权限的令牌。
Videoid {videoId} 要编辑的源视频的视频 ID。 可以使用列表视频 API 检索视频 ID
Name {name} 新编辑的视频的名称。

下面是请求的示例:

https://api.videoindexer.ai/westeurope/Accounts/{id}/Videos/{id}/redact?priority=Low&name=testredaction&privacy=Private&streamingPreset=Default 

可以将令牌指定为具有密钥值类型的 bearertoken:{token}授权标头,也可以使用它作为查询参数 ?token={token}提供。

还需要使用要应用的编修作业选项以 JSON 格式添加请求正文。 下面是一个示例:

{
    "faces": {
        "blurringKind": "HighBlur"
    }
}

请求成功后,会收到响应 HTTP 202 ACCEPTED

监视作业状态

在作业创建请求的响应中,你会收到一个具有作业 URL 的 HTTP 标头 Location 。 可以使用同一令牌向此 URL 发出 GET 请求,以查看修订作业的状态。

下面是一个示例 URL:

https://api.videoindexer.ai/westeurope/Accounts/<id>/Jobs/<id>

下面是示例响应:

{
    "creationTime": "2023-05-11T11:22:57.6114155Z",
    "lastUpdateTime": "2023-05-11T11:23:01.7993563Z",
    "progress": 20,
    "jobType": "Redaction",
    "state": "Processing"
}

如果在完成修订作业时调用相同的 URL,则 Location 标头中会获取已编入视频的存储共享访问签名 (SAS) URL。 例如:

https://api.videoindexer.ai/westeurope/Accounts/<id>/Videos/<id>/SourceFile/DownloadUrl 

此 URL 重定向到存储在 Azure 存储 帐户中的.mp4文件。

常见问题

问题 答案
是否可以在一个操作中上传视频和修订? 否。 首先需要使用视频索引器 API 上传和分析视频。 然后,在修订作业中引用索引的视频。
是否可以使用 Azure AI 视频索引器网站 来编辑视频? 否。 目前只能使用 API 创建修订作业。
是否可以使用视频索引器 网站播放经过编辑的视频? 是的。 修订的视频与任何其他索引视频一样在视频索引器网站上可见,但它不包含任何见解。
如何实现删除经过修订的视频? 可以使用 “删除视频 API”并为编辑的视频提供 Videoid 值。
是否需要通过面部识别标志才能使用面部修订? 除非你在美国中代表警察局,否则不。 即使你被关门,我们仍然提供人脸检测。 如果你被关门,我们不会提供人脸识别。 但是,只能使用人脸检测来修改视频中的所有人脸。
人脸修订是否会覆盖原始视频? 否。 人脸修订作业将创建新的视频输出文件。
并非所有人脸都经过正确编辑。 我该怎么办? 修订依赖于分析管道的初始人脸检测和检测输出。 虽然我们大部分时间都检测到所有人脸,但在某些情况下,我们无法检测到人脸。 人脸角度、人脸存在帧数等因素,源视频的质量会影响人脸修订的质量。 有关详细信息,请参阅 人脸见解
是否可以编辑人脸以外的对象? 否。 目前,我们仅提供人脸修订。 如果需要编辑其他对象,可以在 Azure 用户语音频道中提供有关产品的反馈。
SAS URL 对下载经过修订的视频有效多长时间? 若要在 SAS URL 过期后下载经过编辑的视频,需要调用初始作业状态 URL。 最好将这些 Jobstatus URL 保留在后端的数据库中,以供将来参考。

错误代码

以下部分介绍使用人脸修订时可能发生的错误。

响应:找不到 404

找不到帐户或未找到视频。

响应标头

名称 必需 类型​​ 描述
x-ms-request-id false string 请求的全局唯一标识符(GUID)由服务器分配,用于检测目的。 服务器确保与处理请求关联的所有日志都可以链接到服务器请求 ID。 客户端可以在支持票证中提供此请求 ID,以便支持工程师可以找到链接到此特定请求的日志。 服务器确保每个作业的请求 ID 是唯一的。

响应正文

名称 必需 类型
ErrorType false ErrorType
Message false string

默认 JSON

{
    "ErrorType": "GENERAL",
    "Message": "string"
}

响应:400 错误的请求

输入无效或无法修改视频,因为它的原始上传失败。 请再次上传视频。

输入无效或无法编辑视频,因为它的原始上传失败。 再次上传视频。

响应标头

名称 必需 类型​​ 描述
x-ms-request-id false string 请求的 GUID 由服务器分配,用于检测目的。 服务器确保与处理请求关联的所有日志都可以链接到服务器请求 ID。 客户端可以在支持票证中提供此请求 ID,以便支持工程师可以找到链接到此特定请求的日志。 服务器确保每个作业的请求 ID 是唯一的。

响应正文

名称 必需 类型
ErrorType false ErrorType
Message false string

默认 JSON

{
    "ErrorType": "GENERAL",
    "Message": "string"
}

响应:409 冲突

视频已编制索引。

响应标头

名称 必需 类型​​ 描述
x-ms-request-id false string 请求的 GUID 由服务器分配,用于检测目的。 服务器确保与处理请求关联的所有日志都可以链接到服务器请求 ID。 客户端可以在支持票证中提供此请求 ID,以便支持工程师可以找到链接到此特定请求的日志。 服务器确保每个作业的请求 ID 是唯一的。

响应正文

名称 必需 类型
ErrorType false ErrorType
Message false string

默认 JSON

{
    "ErrorType": "GENERAL",
    "Message": "string"
}

响应:401 未授权

访问令牌无权访问帐户。

响应标头

名称 必需 类型​​ 描述
x-ms-request-id false string 请求的 GUID 由服务器分配,用于检测目的。 服务器确保与处理请求关联的所有日志都可以链接到服务器请求 ID。 客户端可以在支持票证中提供此请求 ID,以便支持工程师可以找到链接到此特定请求的日志。 服务器确保每个作业的请求 ID 是唯一的。

响应正文

名称 必需 类型
ErrorType false ErrorType
Message false string

默认 JSON

{
    "ErrorType": "USER_NOT_ALLOWED",
    "Message": "Access token is not authorized to access account 'SampleAccountId'."
}

响应:500 内部服务器错误

服务器上出错。

响应标头

名称 必需 类型​​ 描述
x-ms-request-id false string 请求的 GUID 由服务器分配,用于检测目的。 服务器确保与处理请求关联的所有日志都可以链接到服务器请求 ID。 客户端可以在支持票证中提供此请求 ID,以便支持工程师可以找到链接到此特定请求的日志。 服务器确保每个作业的请求 ID 是唯一的。

响应正文

名称 必需 类型
ErrorType false ErrorType
Message false string

默认 JSON

{
    "ErrorType": "GENERAL",
    "Message": "There was an error."
}

响应:429 请求过多

发送的请求过多。 Retry-After使用响应标头确定何时发送下一个请求。

响应标头

名称 必需 类型​​ 描述
Retry-After false integer 一个非负十进制整数,指示接收响应后延迟的秒数。

响应:504 网关超时

服务器未在预期时间内响应网关。

响应标头

名称 必需 类型​​ 描述
x-ms-request-id false string 请求的 GUID 由服务器分配,用于检测目的。 服务器确保与处理请求关联的所有日志都可以链接到服务器请求 ID。 客户端可以在支持票证中提供此请求 ID,以便支持工程师可以找到链接到此特定请求的日志。 服务器确保每个作业的请求 ID 是唯一的。

默认 JSON

{
    "ErrorType": "SERVER_TIMEOUT",
    "Message": "Server did not respond to gateway within expected time"
}