精品项目

在亚马逊SageMaker上部署Hugging Face (PyAnnote) 说话人分隔模型作为异

在亚马逊 SageMaker 上部署 Hugging Face (PyAnnote) 说话者分离模型

关键要点

本文介绍了如何在亚马逊 SageMaker 上使用 Hugging Face 的 PyAnnote 模型进行音频说话者分离diarization。提供了一步步指南,展示如何利用 SageMaker 部署模型,处理多说话者录音。还讨论了异步推理的优势,包括节约成本和高效处理长音频文件。

说话者分离是音频分析中的一个重要过程,它根据说话者身份对音频文件进行分段。本文深入探讨了如何将 Hugging Face 的 PyAnnote 集成到亚马逊 SageMaker 的异步端点中。

我们提供一份全面的指南,说明如何使用 SageMaker 在 AWS 云上部署说话者分段和聚类解决方案。该解决方案适用于处理多达 100 位说话者的音频记录。

解决方案概述

Amazon Transcribe 是 AWS 中的首选说话者分离服务。然而,对于不支持的语言,您可以使用其他模型在本案例中为 PyAnnote,将其部署到 SageMaker 进行推理。对于推理时间不超过 60 秒的短音频文件,可以使用 实时推理。若超过 60 秒,则应使用 异步推理。异步推理的一大好处是,在没有待处理请求时,自动将实例数量缩减至零,从而节约成本。

Hugging Face 是一个流行的开源机器学习模型集散地。AWS 与 Hugging Face 建立了 战略合作关系,通过 SageMaker 实现无缝集成,并提供一系列 AWS 深度学习容器DLC,用于 PyTorch 或 TensorFlow 的训练和推理。同时,支持 Hugging Face 的估计器和预测器,以便在 SageMaker Python SDK 中使用。SageMaker 的功能帮助开发者和数据科学家轻松开始在 AWS 上进行自然语言处理NLP。

这个解决方案的集成涉及使用 Hugging Face 预训练的说话者分离模型,基于 PyAnnote 库。PyAnnote 是一个用 Python 编写的开源工具包,专用于说话者分离。该模型使用样本音频数据集进行训练,能够有效地进行音频文件的说话者划分。模型被部署在 SageMaker 作为异步端点,从而提供有效且可扩展的分离任务处理。

以下图表说明了该解决方案的架构。

在本文中,我们使用了以下音频文件。

立体声或多声道音频文件会自动通过平均通道进行降混至单声道。以不同采样率采样的音频文件会在加载时自动重采样为 16kHz。

前提条件

请完成以下前提条件:

创建 SageMaker 域。确保您的 AWS 身份与访问管理IAM用户具有创建 SageMaker 角色 的必要访问权限。确保 AWS 账户对托管 mlg52xlarge 实例的 SageMaker 端点有服务配额。

创建模型函数以访问 Hugging Face 的 PyAnnote 说话者分离

您可以使用 Hugging Face Hub 访问所需的预训练 PyAnnote 说话者分离模型。在创建 SageMaker 端点时,您可以使用相同的脚本下载模型文件。

示例代码

pythonfrom PyAnnoteaudio import Pipeline

def modelfn(modeldir) # 从指定的模型目录加载模型 model = Pipelinefrompretrained( PyAnnote/speakerdiarization31 useauthtoken=将此处替换为HuggingFace认证令牌 ) return model

打包模型代码

准备必要的文件,比如包含推理代码的 inferencepy:

pythonwritefile model/code/inferencepyfrom PyAnnoteaudio import Pipelineimport subprocessimport boto3from urllibparse import urlparseimport pandas as pdfrom io import StringIOimport osimport torch

def modelfn(modeldir) model = Pipelinefrompretrained( PyAnnote/speakerdiarization31 useauthtoken=hfoBxxxxxxxxxxxx ) return model

def diarizationfroms3(model s3file language=None) s3 = boto3client(s3) o = urlparse(s3file allowfragments=False) bucket = onetloc key = opathlstrip(/) s3downloadfile(bucket key tmpwav) result = model(tmpwav) data = {} for turn speaker in resultitertracks(yieldlabel=True) data[turn] = (turnstart turnend speaker) datadf = pdDataFrame(datavalues() columns=[start end speaker]) print(datadfshape) result = datadftojson(orient=split) return result

def predictfn(data model) s3file = datapop(s3file) language = datapop(language None) result = diarizationfroms3(model s3file language) return { diarizationfroms3 result }

准备 requirementstxt 文件,里面列出了运行推理所需的 Python 库:

鲸鱼加速器下载时间

pythonwith open(model/code/requirementstxt w) as f fwrite(transformers==4251n) fwrite(boto3n) fwrite(PyAnnoteaudion) fwrite(soundfilen) fwrite(librosan) fwrite(onnxruntimen) fwrite(wgetn) fwrite(pandas)

最后,将 inferencepy 和 requirementstxt 文件压缩并保存为 modeltargz:

bash!tar zcvf modeltargz

配置 SageMaker 模型

定义 SageMaker 模型资源,指定镜像 URI、模型数据位置,以及 SageMaker 角色:

pythonimport sagemakerimport boto3

sess = sagemakerSession()

sagemakersessionbucket = Noneif sagemakersessionbucket is None and sess is not None sagemakersessionbucket = sessdefaultbucket()

try role = sagemakergetexecutionrole()except ValueError iam = boto3client(iam) role = iamgetrole(RoleName=sagemakerexecutionrole)[Role][Arn]

sess = sagemakerSession(defaultbucket=sagemakersessionbucket)

print(fsagemaker role arn {role})print(fsagemaker bucket {sessdefaultbucket()})print(fsagemaker session region {sessbotoregionname})

上传模型到亚马逊 S3

将压缩的 PyAnnote Hugging Face 模型文件上传到 S3 桶:

bashs3location = fs3//{sagemakersessionbucket}/whisper/model/modeltargz!aws s3 cp modeltargz s3location

创建 SageMaker 异步端点

配置异步端点以在 SageMaker 上部署模型,使用以下异步推理配置:

pythonfrom sagemakerhuggingfacemodel import HuggingFaceModelfrom sagemakerasyncinferenceasyncinferenceconfig import AsyncInferenceConfigfrom sagemakers3 import s3pathjoinfrom sagemakerutils import namefrombase

asyncendpointname = namefrombase(customasyc)

创建 Hugging Face 模型类

huggingfacemodel = HuggingFaceModel( modeldata=s3location # 您的模型和脚本路径 role=role # 有权创建端点的 IAM 角色 transformersversion=417 # 使用的 transformers 版本 pytorchversion=110 # 使用的 pytorch 版本 pyversion=py38 # 使用的 python 版本)

创建异步端点配置

asyncconfig = AsyncInferenceConfig( outputpath=s3pathjoin( s3// sagemakersessionbucket asyncinference/output ) # 结果将存储的位置 notificationconfig={ # SuccessTopic PUT YOUR SUCCESS SNS TOPIC ARN # ErrorTopic PUT YOUR ERROR SNS TOPIC ARN } # 通知配置)

env = {MODELSERVERWORKERS 2}

部署端点

asyncpredictor = huggingfacemodeldeploy( initialinstancecount=1 instancetype=mlxx asyncinferenceconfig=asyncconfig endpointname=asyncendpointname env=env)

测试端点

通过发送一个音频文件进行分离,并获取存储在指定 S3 输出路径中的 JSON 输出,来评估端点的功能:

python

用 S3 中音频对象的路径替换

from sagemakerasyncinference import WaiterConfigres = asyncpredictorpredictasync(data=data)print(fResponse output path {resoutputpath})print(开始轮询以获取响应)

config = WaiterConfig( maxattempts=10 # 尝试次数 delay=10 # 每次尝试间隔的时间秒)resgetresult(config)

为了大规模部署此解决方案,建议使用 AWS Lambda、亚马逊简单通知服务 (Amazon SNS) 或 亚马逊简单队列服务 (Amazon SQS)。这些服务旨在支持可扩展性、事件驱动架构,并实现高效的资源利用。它们可以帮助将异步推理过程与结果处理分离,从而允许您独立扩展每个组件,更有效地处理推理请求的激增。

结果

模型输出存储在 s3//sagemakerxxxx/asyncinference/output/。输出显示,音频录音已经分段为三列:

开始以秒为单位的开始时间结束以秒为单位的结束时间说话者说话者标签

以下代码展示了我们的结果示例:

python[09762308998 89049235993 SPEAKER01][9533106961 121646859083 SPEAKER01][131324278438 139303904924 SPEAKER00][143548387097 261884550085 SPEAKER00][272410865874 282258064516 SPEAKER01][283446519525 31298811545 SPEAKER01]

清理

您可以通过将 MinCapacity 设置为 0 来设置缩放策略;异步推理 允许您在没有请求时自动缩放到零。您不需要删除端点,系统在需要时可以从零进行扩展,从而降低不使用时的成本。请参见以下代码:

python

在亚马逊SageMaker上部署Hugging Face (PyAnnote) 说话人分隔模型作为异

表示应用程序自动缩放的通用类

client = boto3client(applicationautoscaling)

这是应用程序自动缩放引用端点的格式

resourceid=endpoint/ /variant/ ltvariant1gt

定义并注册您的端点变体

response = clientregisterscalabletarget( ServiceNamespace=sagemaker ResourceId=resourceid ScalableDimension=sagemakervariantDesiredInstanceCount # 您的 Amazon SageMaker 模型端点变体所需的 EC2 实例数 MinCapacity=0 MaxCapacity=5)

如果您想要删除端点,请使用以下代码:

pythonasyncpredictordeleteendpoint(asyncendpointname)

异步端点部署的好处

此解决方案提供以下好处:

能有效处理多个或大型音频文件。本示例演示中使用了单个实例。如果您希望使用该解决方案处理数百或数千个视频,并使用异步端点在多个实例上进行处理,可以使用 自动缩放策略,该策略旨在处理大量源文档。自动缩放会根据工作负载的变化动态调整模型所需的实例数量。该解决方案通过将长时间运行的任务与实时推理分离来优化资源,并降低系统负载。

结论

在本文中,我们提供了一种简单的方法,利用 Python 脚本在 SageMaker 上部署 Hugging Face 的说话者分离模型。使用异步端点提供了一种有效且可扩展的方式,能将分离预测作为服务提供,轻松适应并发请求。

立即开始您的音频项目中的异步说话者分离。如果您对如何让自己的异步分离端点运行有任何疑问,请在评论中联系我。

关于作者

Sanjay Tiwary 是一名人工智能/机器学习领域的专业解决方案架构师。他与战略客户合作,定义业务需求,提供特定用例的 L300 课程,并设计可扩展、可靠和高效的 AI/ML 应用和服务。他曾帮助推出和扩展 AI/ML 驱动的 Amazon SageMaker 服务,并实施了多个使用 Amazon AI 服务的概念验证。他还在数字转型过程中开发了先进的分析平台。

Kiran Challapalli 是 AWS 公共部门的深度技术业务开发人员。他在 AI/ML 领域拥有超过 8 年的经验和 23 年的整体软件开发与销售经验。Kiran 帮助印度的公共部门企业探索和共同创造基于云的解决方案,该解决方案使用 AI、ML 和生成式 AI,包括大型语言模型技术。