一、引言
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。
- modelcard(
str
或ModelCard
,可选) — 属于此管道模型的模型卡。- framework(
str
,可选)— 要使用的框架,"pt"
适用于 PyTorch 或"tf"
TensorFlow。必须安装指定的框架。如果未指定框架,则默认为当前安装的框架。如果未指定框架且安装了两个框架,则默认为 的框架model
,如果未提供模型,则默认为 PyTorch。- 任务(
str
,默认为""
)— 管道的任务标识符。- num_workers(
int
,可选,默认为 8)— 当管道将使用DataLoader(传递数据集时,在 Pytorch 模型的 GPU 上)时,要使用的工作者数量。- batch_size(
int
,可选,默认为 1)— 当管道将使用DataLoader(传递数据集时,在 Pytorch 模型的 GPU 上)时,要使用的批次的大小,对于推理来说,这并不总是有益的,请阅读使用管道进行批处理。- args_parser(ArgumentHandler,可选) - 引用负责解析提供的管道参数的对象。
- 设备(
int
,可选,默认为 -1)— CPU/GPU 支持的设备序号。将其设置为 -1 将利用 CPU,设置为正数将在关联的 CUDA 设备 ID 上运行模型。您可以传递本机torch.device
或str
太- torch_dtype(
str
或torch.dtype
,可选) - 直接发送model_kwargs
(只是一种更简单的快捷方式)以使用此模型的可用精度(torch.float16
,,torch.bfloat16
...或"auto"
)- binary_output(
bool
,可选,默认为False
)——标志指示管道的输出是否应以序列化格式(即 pickle)或原始输出数据(例如文本)进行。
2.3.2 pipeline对象使用参数
- 输入(
np.ndarray
或bytes
或str
或dict
) — 输入可以是:
str
这是音频文件的文件名,将以正确的采样率读取该文件以使用ffmpeg获取波形。这需要在系统上安装ffmpeg 。bytes
它应该是音频文件的内容,并以相同的方式由ffmpeg进行解释。- (
np.ndarray
形状为(n,)类型为np.float32
或np.float64
)正确采样率的原始音频(不再进行进一步检查)dict
形式可用于传递任意采样的原始音频sampling_rate
,并让此管道进行重新采样。字典必须采用 或 格式{"sampling_rate": int, "raw": np.array}
,{"sampling_rate": int, "array": np.array}
其中键"raw"
或"array"
用于表示原始音频波形。
- top_k(
int
,可选,默认为 None)— 管道将返回的顶部标签数。如果提供的数字等于None
或高于模型配置中可用的标签数,则将默认为标签数。
2.4 pipeline实战
2.4.1 指令识别(默认模型)
pipeline对于audio-classification的默认模型时superb/wav2vec2-base-superb-ks,使用pipeline时,如果仅设置task=audio-classification,不设置模型,则下载并使用默认模型。
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的指令识别模型,感觉像是训练动物。
[{'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,具体代码为:
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格式的语音,输出为
[{'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使用文中的代码极简的进行音频分类推理,应用于音频情感识别、音乐曲风判断等业务场景。