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

news2024/10/6 14:37:53

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

  • 推理终端https://hf.co/inference-endpoints/dedicated

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

  • 自定义回调函数https://hf.co/docs/inference-endpoints/guides/customhandler

  • Insanely Fast Whisperhttps://github.com/Vaibhavs10/insanely-fast-whisper#insanely-fast-whisper

  • Pyannotehttps://github.com/pyannote/pyannote-audio

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

  • 代码示例https://hf.co/sergeipetrov/asrdiarization-handler/

  • handler.py : 包含初始化和推理代码

  • diarizationutils.py : 含所有说话人分割所需的预处理和后处理方法

  • config.py : 含 ModelSettings 和 InferenceConfig 。其中,ModelSettings 定义流水线中用到的模型 (可配,无须使用所有模型),而 InferenceConfig 定义默认的推理参数

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

  • PyTorch 2.2https://pytorch.org/blog/pytorch2-2/

主要模块

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

e93db444a91d6256dbcac493781f0928.png
系统框图

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

  • Pyannote 模型https://hf.co/pyannote/speaker-diarization-3.1

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

  • 使用推测解码使 Whisper 实现 2 倍的推理加速https://hf.co/blog/zh/whisper-speculative-decoding

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

  • 辅助模型和主模型的解码器的架构应相同

  • 在很多实现中,batch size 须为 1

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

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

  • distil-whisperhttps://hf.co/distil-whisper

创建一个自己的终端

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

  • 代码库拷贝神器https://hf.co/spaces/huggingface-projects/repoduplicator

  • 自定义回调函数https://hf.co/sergeipetrov/asrdiarization-handler/blob/main/handler.py

以下是其 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: str
    assistant_model: Optional[str] = None
    diarization_model: Optional[str] = None
    hf_token: Optional[str] = None

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

  • Pydantichttps://docs.pydantic.dev/latest/concepts/pydanticsettings/

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

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

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

部署至推理终端

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

89bf5235adecbe6ae439e8abcb2d3b2c.png
一键部署

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

  • API 地址https://api.endpoints.huggingface.cloud/#post-/v2/endpoint/-namespace-

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进行了一系列基准测试,如下:

  • k6https://k6.io/docs/

# 设置:
# 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 = 24
    assisted: bool = False
    chunk_length_s: int = 30
    sampling_rate: int = 16000
    language: Optional[str] = None
    num_speakers: Optional[int] = None
    min_speakers: Optional[int] = None
    max_speakers: Optional[int] = None

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

请求格式

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

import base64
import requests

API_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类,或其异步版来发送请求:

  • InferenceClienthttps://hf.co/docs/huggingfacehub/en/packagereference/inferenceclient#huggingfacehub.InferenceClient

  • 异步版https://hf.co/docs/huggingfacehub/en/packagereference/inferenceclient#huggingfacehub.AsyncInferenceClient

from huggingface_hub import InferenceClient

client = 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 的一系列Whisperhttps://hf.co/openai/whisper-large-v3模型

  • Pyannote 的说话人分割模型https://hf.co/pyannote/speaker-diarization-3.1

  • Insanely Fast Whisper 代码库https://github.com/Vaibhavs10/insanely-fast-whisper/tree/main,这是本文的主要灵感来源

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

  • Fast Whisper Server 代码库https://github.com/plaggy/fast-whisper-server


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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0531作业 链表

结果 整体代码 主要实现 /**实现* */ #include "./linklist.h"linklist* create_linklist(datatype param){linklist* node(linklist*)malloc(sizeof(linklist));if(NULLnode){puts("节点创建失败");}node->paramparam;node->pnextNULL;puts("…

每天CTF小练--ctfshow新手村

easy_base 密文&#xff1a;0XezFWZfNXafRjNlNXYit3dvh2cmR3Y 等号在前面&#xff0c;直接倒序后解码 ctfshow{base64_is_easy} 代码解&#xff1a; s 0XezFWZfNXafRjNlNXYit3dvh2cmR3Y print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转…

运放应用2 - 同相放大电路

1. 前置知识 同相放大电路存在 负反馈电路 &#xff0c;工作在线性区&#xff0c;可以利用 虚短 概念来分析电路。 注&#xff1a;运放的 虚断 特性是一直存在的&#xff0c;虚短 特性则需要运放工作在 线性区 有关运放的基础知识&#xff0c;可以参考我的另外一篇文章&#x…

【深度学习】目标检测,Faster-RCNN算法训练,使用mmdetection训练

文章目录 资料环境数据测试 资料 https://mmdetection.readthedocs.io/zh-cn/latest/user_guides/config.html 环境 Dockerfile ARG PYTORCH"1.9.0" ARG CUDA"11.1" ARG CUDNN"8"FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}…

掘金AI商战宝典-系统班:2024掘金AIGC课程(30节视频课)

课程下载&#xff1a;掘金AI商战宝典-系统班&#xff1a;2024掘金AIGC课程(30节视频课)-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 课程目录 1-第一讲学会向Al提问&#xff1a;万能提问公式_1.mp4 2-第二讲用AI写视频脚本_1.mp4 3-第三讲…

教科书般的充电桩平台多租户技术架构设计,建议收藏!-慧哥充电桩开源平台

慧哥充电桩开源平台V2.5.2_----- SpringCloud 汽车 电动自行车 云快充1.5、云快充1.6 https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001.5502 一、多租户的概念 多租户本质上是一种软件的技术架构&#xff0c;它最核心的特征是多个租户可以共享一…

Mamba v2诞生:1 儒(Transformers)释(SSD)道(Mamba)本是一家?!

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

基于MinGW64 GCC编译Windows平台上的 libuvc

安装cmake 打开cmake官网 https://cmake.org/download/&#xff0c;下载安装包&#xff1a; 安装时选择将cmake加到系统环境变量里。安装完成后在新的CMD命令窗口执行cmake --version可看到输出&#xff1a; D:\>cmake --version cmake version 3.29.3 CMake suite mainta…

Hotcoin精彩亮相Consensus 2024 Austin,探索行业风向标

5 月 31 日&#xff0c;由CoinDesk主办的“Consensus 2024”大会在德克萨斯州的奥斯汀市正式落下帷幕。作为全球规模最大、最具影响力的加密货币、区块链、Web3盛会&#xff0c;本次Consensus 2024 Austin吸引来自 100 多个国家/地区的 15,000 多名与会者、6,800 家公司、850 多…

LeetCode-2246. 相邻字符不同的最长路径【树 深度优先搜索 图 拓扑排序 数组 字符串】

LeetCode-2246. 相邻字符不同的最长路径【树 深度优先搜索 图 拓扑排序 数组 字符串】 题目描述&#xff1a;解题思路一&#xff1a;找路径背诵版&#xff1a;解题思路三&#xff1a; 题目描述&#xff1a; 给你一棵 树&#xff08;即一个连通、无向、无环图&#xff09;&…

python中实现队列功能

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python中实现队列功能 选择题 以下代码最后一次输出的结果是&#xff1f; from collections import deque queue deque() queue.append(1) queue.append(2) queue.append(3) print(【显示】…

Nginx 配置:gzip动态压缩、静态压缩

动态压缩 动态压缩开启的现象 Nginx配置 http {# 启用 gzip 压缩gzip on;# 设置 gzip 压缩级别&#xff0c;范围是1-9&#xff0c;数字越大压缩率越高但CPU消耗也越大gzip_comp_level 5;# 设置最低压缩的文件大小&#xff08;大于1KB的文件才进行压缩&#xff09;gzip_min_le…

【Linux进程篇】Linux进程管理应用——虚假的shell脚本

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们已经了解了进程的工作原理&#xff0c;并且学习了进程创建、进程终止、进程等待以及进程程序替换。为了更好的巩固这些知识&#xff0c;我们可以创建一个简易的shell命令行。 目录 做一个简易的s…

【DevOps】网站安全案例分析:真实事件中的经验与教训

目录 一、常见的网站安全事故案例 1. Equifax 数据泄露事件&#xff08;2017年&#xff09; 2. WannaCry 勒索软件攻击事件&#xff08;2017年&#xff09; 3. GitHub DDoS 攻击事件&#xff08;2018年&#xff09; 二、网站安全事件的一般分析方法 1、事件背景调查 2、…

09-spring的bean创建流程(一)

文章目录 spring中bean的创建流程finishBeanFactoryInitialization(beanFactory)beanFactory.preInstantiateSingletons();getMergedLocalBeanDefinition(beanName);流程实现FactoryBean接口,里面的对象实例化过程 spring中bean的创建流程 finishBeanFactoryInitialization(be…

14-ShardingSphere的分布式主键实现

1 ShardingSphere自动生成键 MySQL自增键、Oracle自增序列等。分片场景下问题就复杂了&#xff0c;不能依靠单实例上的自增键来实现不同数据节点之间的全局唯一主键&#xff0c;分布式主键的需求应运而生。ShardingSphere 作为一款优秀分库分表开源软件&#xff0c;同样提供分…

Ubuntu18.04安装pwntools报错解决方案

报错1&#xff1a;ModuleNotFoundError: No module named ‘setuptools_rust’ 报错信息显示ModuleNotFoundError: No module named setuptools_rust&#xff0c;如下图所示 解决方案&#xff1a;pip install setuptools_rust 报错2&#xff1a;pip版本低 解决方案&#xff…

【Test 49 】OSI 七层模型初识、网络传输的流程、IP地址和MAC地址! 面试高频考点!

文章目录 1. OSI七层模型2. TCP/IP五层(或四层)模型3. 网络传输基本流程 &#x1f427;&#x1f427;&#x1f427;&#x1f427;&#x1f427;&#x1f427;&#x1f427;&#x1f427;&#x1f427;&#x1f427;&#x1f427;&#x1f427;&#x1f427;&#x1f427;&#…

MyBatis中的接口代理机制及其使用

1. MyBatis中的接口代理机制及其使用 文章目录 1. MyBatis中的接口代理机制及其使用2. 实操2.1 准备工作2.2 insert 增加操作2.3 delete 删除操作2.4 update 修改操作2.5 select 查询一条记录操作2.6 select 查询多条记录操作 3. 总结&#xff1a;4. 最后&#xff1a; MyBatis …

五、数据源池化技术实现

学这一节的时候重新梳理了DataSource、DriverManager、Driver、DriverProxy、Connection之间的关系&#xff0c;如下图 在整体流程中&#xff0c;这一块就是通过配置文件配置&#xff0c;在解析配置文件的时候就创建对应的数据源封装到Environment中&#xff0c;在执行sql的时…