使用 Hugging Face 推理终端搭建强大的“语音识别 + 说话人分割 + 投机解码”工作流

news/2025/3/15 11:09:59/文章来源:https://www.cnblogs.com/huggingface/p/18234806

Whisper 是当前最先进的开源语音识别模型之一,毫无疑问,也是应用最广泛的模型。如果你想部署 Whisper 模型,Hugging Face 推理终端 能够让你开箱即用地轻松部署任何 Whisper 模型。但是,如果你还想叠加其它功能,如用于分辨不同说话人的说话人分割,或用于投机解码的辅助生成,事情就有点麻烦了。因为此时你需要将 Whisper 和其他模型结合起来,但对外仍只发布一个 API。

本文,我们将使用推理终端的 自定义回调函数 来解决这一挑战,将其它把自动语音识别 (ASR) 、说话人分割流水线以及投机解码串联起来并嵌入推理端点。这一设计主要受 Insanely Fast Whisper 的启发,其使用了 Pyannote 说话人分割模型。

我们也希望能通过这个例子展现出推理终端的灵活性以及其“万物皆可托管”的无限可能性。你可在 此处 找到我们的自定义回调函数的完整代码。请注意,终端在初始化时会安装整个代码库,因此如果你不喜欢将所有逻辑放在单个文件中的话,可以采用 handler.py 作为入口并调用代码库中的其他文件的方法。为清晰起见,本例分为以下几个文件:

  • handler.py : 包含初始化和推理代码
  • diarization_utils.py : 含所有说话人分割所需的预处理和后处理方法
  • config.py : 含 ModelSettingsInferenceConfig 。其中,ModelSettings 定义流水线中用到的模型 (可配,无须使用所有模型),而 InferenceConfig 定义默认的推理参数

从 PyTorch 2.2 开始,SDPA 开箱即用支持 Flash Attention 2,因此本例使用 PyTorch 2.2 以加速推理。

主要模块

下图展示了我们设计的方案的系统框图:

系统框图

在实现时,ASR 和说话人分割流水线采用了模块化的方法,因此是可重用的。说话人分割流水线是基于 ASR 的输出的,如果不需要说话人分割,则可以仅用 ASR 的部分。我们建议使用 Pyannote 模型 做说话人分割,该模型目前是开源模型中的 SOTA。

我们还使用了投机解码以加速模型推理。投机解码通过使用更小、更快的模型来打草稿,再由更大的模型来验证,从而实现加速。具体请参阅 这篇精彩的博文 以详细了解如何对 Whisper 模型使用投机解码。

投机解码有如下两个限制:

  • 辅助模型和主模型的解码器的架构应相同
  • 在很多实现中,batch size 须为 1

在评估是否使用投机解码时,请务必考虑上述因素。根据实际用例不同,有可能支持较大 batch size 带来的收益比投机解码更大。如果你不想使用辅助模型,只需将配置中的 assistant_model 置为 None 即可。

如果你决定使用辅助模型,distil-whisper 是一个不错的 Whisper 辅助模型候选。

创建一个自己的终端

上手很简单,用 代码库拷贝神器 拷贝一个现有的带 自定义回调函数 的代码库。

以下是其 handler.py 中的模型加载部分:

from pyannote.audio import Pipeline
from transformers import pipeline, AutoModelForCausalLM...self.asr_pipeline = pipeline("automatic-speech-recognition",model=model_settings.asr_model,torch_dtype=torch_dtype,device=device)self.assistant_model = AutoModelForCausalLM.from_pretrained(model_settings.assistant_model,torch_dtype=torch_dtype,low_cpu_mem_usage=True,use_safetensors=True)...self.diarization_pipeline = Pipeline.from_pretrained(checkpoint_path=model_settings.diarization_model,use_auth_token=model_settings.hf_token,)...

然后,你可以根据需要定制流水线。 config.py 文件中的 ModelSettings 包含了流水线的初始化参数,并定义了推理期间要使用的模型:

class ModelSettings(BaseSettings):asr_model: strassistant_model: Optional[str] = Nonediarization_model: Optional[str] = Nonehf_token: Optional[str] = None

如果你用的是自定义容器或是自定义推理回调函数的话,你还可以通过设置相应的环境变量来调整参数,你可通过 Pydantic 来达成此目的。要在构建期间将环境变量传入容器,你须通过 API 调用 (而不是通过 GUI) 创建终端。

你还可以在代码中硬编码模型名,而不将其作为环境变量传入,但 请注意,说话人分割流水线需要显式地传入 HF 令牌 (hf_token )。 出于安全考量,我们不允许对令牌进行硬编码,这意味着你必须通过 API 调用创建终端才能使用说话人分割模型。

提醒一下,所有与说话人分割相关的预处理和后处理工具程序都在 diarization_utils.py 中。

该方案中,唯一必选的组件是 ASR 模型。可选项是: 1) 投机解码,你可指定一个辅助模型用于此; 2) 说话人分割模型,可用于对转录文本按说话人进行分割。

部署至推理终端

如果仅需 ASR 组件,你可以在 config.py 中指定 asr_model 和/或 assistant_model ,并单击按钮直接部署:

一键部署

如要使用环境变量来配置推理终端托管的容器,你需要用 API 以编程方式创建终端。下面给出了一个示例:

body = {"compute": {"accelerator": "gpu","instanceSize": "medium","instanceType": "g5.2xlarge","scaling": {"maxReplica": 1,"minReplica": 0}},"model": {"framework": "pytorch","image": {# a default container"huggingface": {"env": {# this is where a Hub model gets mounted"HF_MODEL_DIR": "/repository","DIARIZATION_MODEL": "pyannote/speaker-diarization-3.1","HF_TOKEN": "<your_token>","ASR_MODEL": "openai/whisper-large-v3","ASSISTANT_MODEL": "distil-whisper/distil-large-v3"}}},# a model repository on the Hub"repository": "sergeipetrov/asrdiarization-handler","task": "custom"},# the endpoint name"name": "asr-diarization-1","provider": {"region": "us-east-1","vendor": "aws"},"type": "private"
}

何时使用辅助模型

为了更好地了解辅助模型的收益情况,我们使用 k6 进行了一系列基准测试,如下:

# 设置:
# GPU: A10
ASR_MODEL=openai/whisper-large-v3
ASSISTANT_MODEL=distil-whisper/distil-large-v3# 长音频: 60s; 短音频: 8s
长音频 _ 投机解码 ..................: avg=4.15s min=3.84s med=3.95s max=6.88s p(90)=4.03s p(95)=4.89s
长音频 _ 直接解码 ..............: avg=3.48s min=3.42s med=3.46s max=3.71s p(90)=3.56s p(95)=3.61s
短音频 _ 辅助解码 .................: avg=326.96ms min=313.01ms med=319.41ms max=960.75ms p(90)=325.55ms p(95)=326.07ms
短音频 _ 直接解码 .............: avg=784.35ms min=736.55ms med=747.67ms max=2s p(90)=772.9ms p(95)=774.1ms

如你所见,当音频较短 (batch size 为 1) 时,辅助生成能带来显著的性能提升。如果音频很长,推理系统会自动将其切成多 batch,此时由于上文述及的限制,投机解码可能会拖慢推理。

推理参数

所有推理参数都在 config.py 中:

class InferenceConfig(BaseModel):task: Literal["transcribe", "translate"] = "transcribe"batch_size: int = 24assisted: bool = Falsechunk_length_s: int = 30sampling_rate: int = 16000language: Optional[str] = Nonenum_speakers: Optional[int] = Nonemin_speakers: Optional[int] = Nonemax_speakers: Optional[int] = None

当然,你可根据需要添加或删除参数。与说话者数量相关的参数是给说话人分割流水线的,其他所有参数主要用于 ASR 流水线。 sampling_rate 表示要处理的音频的采样率,用于预处理环节; assisted 标志告诉流水线是否使用投机解码。请记住,辅助生成的 batch_size 必须设置为 1。

请求格式

服务一旦部署,用户就可将音频与推理参数一起组成请求包发送至推理终端,如下所示 (Python):

import base64
import requestsAPI_URL = "<your endpoint URL>"
filepath = "/path/to/audio"with open(filepath, "rb") as f:audio_encoded = base64.b64encode(f.read()).decode("utf-8")data = {"inputs": audio_encoded,"parameters": {"batch_size": 24}
}resp = requests.post(API_URL, json=data, headers={"Authorization": "Bearer <your token>"})
print(resp.json())

这里的 “parameters” 字段是一个字典,其中包含你想调整的所有 InferenceConfig 参数。请注意,我们会忽略 InferenceConfig 中没有的参数。

你还可以使用 InferenceClient 类,或其 异步版 来发送请求:

from huggingface_hub import InferenceClientclient = InferenceClient(model = "<your endpoint URL>", token="<your token>")with open("/path/to/audio", "rb") as f:audio_encoded = base64.b64encode(f.read()).decode("utf-8")
data = {"inputs": audio_encoded,"parameters": {"batch_size": 24}
}res = client.post(json=data)

总结

本文讨论了如何使用 Hugging Face 推理终端搭建模块化的 “ASR + 说话人分割 + 投机解码”工作流。该方案使用了模块化的设计,使用户可以根据需要轻松配置并调整流水线,并轻松地将其部署至推理终端!更幸运的是,我们能够基于社区提供的优秀公开模型及工具实现我们的方案:

  • OpenAI 的一系列 Whisper 模型
  • Pyannote 的 说话人分割模型
  • Insanely Fast Whisper 代码库,这是本文的主要灵感来源

本文相关的代码已上传至 这个代码库中,其中包含了本文论及的流水线及其服务端代码 (FastAPI + Uvicorn)。如果你想根据本文的方案进一步进行定制或将其托管到其他地方,这个代码库可能会派上用场。


英文原文: https://hf.co/blog/asr-diarization

原文作者: Sergei Petrov,Vaibhav Srivastav,Pedro Cuenca,Philipp Schmid

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/720854.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年离职和后续发展

目录前言个人情况2023年底2024年初,找工作失败2024年2月,计划开公司家里关系开公司原因2024年4月,说明我要离职的想法5月,开始办理公司6月,开始准备资料,提离职 前言 最近我也快离职回家了,简单说一下最近发送的事情好了,这里按照时间的顺序 个人情况 2022年毕业,来到…

华为matebook 14s笔记本,Chrome浏览器开启硬件加速,屏幕闪屏,黑框,页面屏幕卡死,解决办法

解决办法使用了 https://zhuanlan.zhihu.com/p/644296061 这个连接下的最后一个折中办法解决! 一、现象 Chrome开启“硬件加速模式”后,在观看视频时,尤其是全屏时,会出现短暂黑屏或黑块或闪屏。如果关闭“硬件加速”,则会造成播放某些高清视频(例如HEVC)视频或弹幕卡顿(…

BD10100CS-ASEMI肖特基二极管BD10100CS

BD10100CS-ASEMI肖特基二极管BD10100CS编辑:ll BD10100CS-ASEMI肖特基二极管BD10100CS 型号:BD10100CS 品牌:ASEMI 封装:TO-252 最大平均正向电流(IF):10A 最大循环峰值反向电压(VRRM):100V 最大正向电压(VF):0.80V 工作温度:-65C~175C 芯片个数:2 芯片尺寸:mi…

grafana 密码怎么重置

昨天手抖把sqlite的数据清除了,今天登不上了 进入到grafana的安装目录下的bin 执行 ./grafana-cli admin reset-admin-password 新的密码

SHR工号加1问题解决方案

SHR工号加1问题解决方案查询出有问题的用户,会出现两条数据。select * from T_PM_USER where FNAME_L2 like刘权基%删除s02113 保留 s021131。 然后FForbidden设置为0。 去shr管理平台移除用户的占用,同步后点击占用。就解决了‍

无需搭建环境,零门槛带你体验Open-Sora文生视频应用

基于开源解决方案“Open-Sora 1.0”,在华为云AI Gallery上通过ModelArts体验文字生成视频应用。本文分享自华为云社区《Open-Sora 文生视频原来在AI Gallery上也能体验了》,作者:码上开花_Lancer。 体验链接:Open-Sora 文生视频案例体验 不久前,OpenAI Sora 凭借其惊人的视…

疯狂的麦克斯:狂暴女神迅雷BT下载[百度云AVI/1.26G]高清版[HD720p国语中字

《疯狂的麦克斯:狂暴女神》是由乔治米勒执导,汤姆哈迪和查理兹塞隆主演。这部电影是《疯狂的麦克斯》系列的第四部作品,取材于1980年代的系列电影,以麦克斯和女战士伊梅拉的故事为主线,将观众带入一个被暴力和毁灭统治的废土世界。影片以一个后末日时代的世界为背景,麦克斯…

亚信安全64位卸载教程

我们的目的是修改注册表的一些信息,达到我们无密码的退出或者卸载软件。想要修改注册表,必须进入安全模式:(注意:以前进入安全模式的方法,重启电脑,按F8进入安全模式。但是这个方法在win10,就没有效果了,所以下面用另一种方式) ​ 电脑上同时按住win+R键,然后输入mi…

windows使用qt-mingw编译opencv4

windows使用qt-mingw编译opencv4 所需软件:cmake-gui qt工具链能正常使用 git1. 下载opencv源码 2.cmake配置opencv 2.1 选择opencv源码目录和编译目录 以opencv4.10为例。 ​​ 2.2 配置cmake指定qt-mingw工具链 点击configure。 ​​ ​​ ​​ ​​ 设置CMAKE_MAKE_PROGRAM…

4.7K+ Star!一款开源工作流开发平台!

RuoYi-activiti —— 基于若依、Activiti 6.0,集流程设计、流程部署、流程执行、任务办理、流程监控于一体的开源工作流开发平台。大家好,我是 Java陈序员。 今天,给大家介绍一个开源的工作流平台,适用于 OA 办公!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副…

c#WinFrom自定义图表仪表控件-频谱

这是为客户定制的一个频谱图表控件,先看下成品效果,gif较大,略等片刻 开发步骤分析: 1、界面有多个间距不等的线分割的区域,每个区域的值范围不同,我们就需要把每个区域定义出来,方便我们操作的时候来计算值 2、有几个圆圈是需要鼠标来回拖动的,那么就需要将每个圆的区域…

2024年腾讯云618玩法攻略大全,让你一薅到底!

重要事情说三遍,2024年腾讯云618活动来了,它来了,它真来了!!今年直接干到骨折价格,云服务器秒杀0.5折起;代金券抵扣折上折;爆品产品88元专区选购、618神秘彩蛋... 关键的关键是,老用户也能享受! 多重福利堪称丧心病狂,但是想全拿完,还是的花点时间研究。废话不多说…