【人工智能】Transformers之Pipeline(一):音频分类(audio-classification)

2024-08-13 14:24:17 浏览数 (1)

一、引言

pipeline(管道)是huggingface transformers库中一种极简方式使用大模型推理的抽象,将所有大模型分为音频(Audio)、计算机视觉(Computer vision)、自然语言处理(NLP)、多模态(Multimodal)等4大类,28小类任务(tasks)。共计覆盖32万个模型

今天介绍Audio音频的第一篇,音频分类(audio-classification),在huggingface库内共有2500个音频分类模型。

二、音频分类(audio-classification)

2.1 概述

音频分类,顾名思义就是将音频打标签或分配类别的任务。主要应用场景有语音情绪分类语音命令分类说话人分类音乐风格判别语言判别等。

2.2 技术原理

音频分类,主要思想就是将音频的音谱切分成25ms-60ms的片段,通过CNN等卷积神经网络模型提取特征并进行embedding化,基于transformer与文本类别对齐训练。下面介绍2个代表模型:

2.2.1 Wav2vec 2.0模型

Wav2vec 2.0是 Meta在2020年发表的无监督语音预训练模型。它的核心思想是通过向量量化(Vector Quantization,VQ)构造自建监督训练目标,对输入做大量掩码后利用对比学习损失函数进行训练。模型结构如图,基于卷积网络(Convoluational Neural Network,CNN)的特征提取器将原始音频编码为帧特征序列,通过 VQ 模块把每帧特征转变为离散特征 Q,并作为自监督目标。同时,帧特征序列做掩码操作后进入 Transformer [5] 模型得到上下文表示 C。最后通过对比学习损失函数,拉近掩码位置的上下文表示与对应的离散特征 q 的距离,即正样本对。

2.2.1 HuBERT模型

HuBERT是Meta在2021年发表的模型,模型结构类似 Wav2vec 2.0,不同的是训练方法。Wav2vec 2.0 是在训练时将语音特征离散化作为自监督目标,而 HuBERT 则通过在 MFCC 特征或 HuBERT 特征上做 K-means 聚类,得到训练目标。HuBERT 模型采用迭代训练的方式,BASE 模型第一次迭代在 MFCC 特征上做聚类,第二次迭代在第一次迭代得到的 HuBERT 模型的中间层特征上做聚类,LARGE 和 XLARGE 模型则用 BASE 模型的第二次迭代模型提取特征做聚类。从原始论文实验结果来看,HuBERT 模型效果要优于 Wav2vec 2.0,特别是下游任务有监督训练数据极少的情况,如 1 小时、10 分钟。

2.3 pipeline参数

2.3.1 pipeline对象实例化参数

  • 模型(PreTrainedModel或TFPreTrainedModel)— 管道将使用其进行预测的模型。 对于 PyTorch,这需要从PreTrainedModel继承;对于 TensorFlow,这需要从TFPreTrainedModel继承。
  • feature_extractor ( SequenceFeatureExtractor ) — 管道将使用的特征提取器来为模型编码数据。此对象继承自 SequenceFeatureExtractor。
  • modelcardstrModelCard可选) — 属于此管道模型的模型卡。
  • frameworkstr可选)— 要使用的框架,"pt"适用于 PyTorch 或"tf"TensorFlow。必须安装指定的框架。 如果未指定框架,则默认为当前安装的框架。如果未指定框架且安装了两个框架,则默认为 的框架model,如果未提供模型,则默认为 PyTorch。
  • 任务str,默认为"")— 管道的任务标识符。
  • num_workersint可选,默认为 8)— 当管道将使用DataLoader(传递数据集时,在 Pytorch 模型的 GPU 上)时,要使用的工作者数量。
  • batch_sizeint可选,默认为 1)— 当管道将使用DataLoader(传递数据集时,在 Pytorch 模型的 GPU 上)时,要使用的批次的大小,对于推理来说,这并不总是有益的,请阅读使用管道进行批处理。
  • args_parser(ArgumentHandler,可选) - 引用负责解析提供的管道参数的对象。
  • 设备int可选,默认为 -1)— CPU/GPU 支持的设备序号。将其设置为 -1 将利用 CPU,设置为正数将在关联的 CUDA 设备 ID 上运行模型。您可以传递本机torch.devicestr
  • torch_dtypestrtorch.dtype可选) - 直接发送model_kwargs(只是一种更简单的快捷方式)以使用此模型的可用精度(torch.float16,,torch.bfloat16...或"auto"
  • binary_outputbool可选,默认为False)——标志指示管道的输出是否应以序列化格式(即 pickle)或原始输出数据(例如文本)进行。
2.3.2 pipeline对象使用参数

  • 输入np.ndarraybytesstrdict) — 输入可以是:
    • str这是音频文件的文件名,将以正确的采样率读取该文件以使用ffmpeg获取波形。这需要在系统上安装ffmpeg 。
    • bytes它应该是音频文件的内容,并以相同的方式由ffmpeg进行解释。
    • np.ndarray形状为(n,)类型为np.float32np.float64)正确采样率的原始音频(不再进行进一步检查)
    • dict形式可用于传递任意采样的原始音频sampling_rate,并让此管道进行重新采样。字典必须采用 或 格式{"sampling_rate": int, "raw": np.array}{"sampling_rate": int, "array": np.array}其中键"raw""array"用于表示原始音频波形。
  • top_kint可选,默认为 None)— 管道将返回的顶部标签数。如果提供的数字等于None或高于模型配置中可用的标签数,则将默认为标签数。

2.4 pipeline实战

2.4.1 指令识别(默认模型)

pipeline对于audio-classification的默认模型时superb/wav2vec2-base-superb-ks,使用pipeline时,如果仅设置task=audio-classification,不设置模型,则下载并使用默认模型。

代码语言:javascript复制
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["CUDA_VISIBLE_DEVICES"] = "2"

from transformers import pipeline

speech_file = "./output_video_enhanced.mp3"
pipe = pipeline(task="audio-classification")
result = pipe(speech_file)
print(result)

这是一个上下左右yes及no的指令识别模型,感觉像是训练动物。

代码语言:javascript复制
[{'score': 0.9988580942153931, 'label': '_unknown_'}, {'score': 0.000909291033167392, 'label': 'down'}, {'score': 9.889943612506613e-05, 'label': 'no'}, {'score': 7.015655864961445e-05, 'label': 'yes'}, {'score': 5.134344974067062e-05, 'label': 'stop'}]
2.4.2 情感识别

我们指定模型为情感识别模型ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition,具体代码为:

代码语言:javascript复制
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["CUDA_VISIBLE_DEVICES"] = "2"

from transformers import pipeline

speech_file = "./output_video_enhanced.mp3"
pipe = pipeline(task="audio-classification",model="ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition")
result = pipe(speech_file)
print(result)

输入为一段mp3格式的语音,输出为

代码语言:javascript复制
[{'score': 0.13128453493118286, 'label': 'angry'}, {'score': 0.12990005314350128, 'label': 'calm'}, {'score': 0.1262471228837967, 'label': 'happy'}, {'score': 0.12568499147891998, 'label': 'surprised'}, {'score': 0.12327362596988678, 'label': 'disgust'}]

2.5 模型排名

在huggingface上,我们筛选音频分类模型,并按下载量从高到低排序:

三、总结

本文对transformers之pipeline的音频分类(audio-classification)从概述、技术原理、pipeline参数、pipeline实战、模型排名等方面进行介绍,读者可以基于pipeline使用文中的代码极简的进行音频分类推理,应用于音频情感识别、音乐曲风判断等业务场景。

0 人点赞