文章目录
Transformers 是一个采用当下技术最新、表现最佳( State-of-the-art, SoTA)的模型和技术在预训练 自然语言处理 、 计算机视觉 、 音频 和 多模态 模型方面提供推理和训练的的开源库;旨在快速易用,以便每个人都可以开始使用 transformer 模型进行学习或构建。该库不仅包含 Transformer 模型,还包括用于计算机视觉任务的现代卷积网络等非 Transformer 模型。
音频处理
音频和语音处理任务与其他模态略有不同,主要是因为音频作为输入是连续信号。与文本不同,原始音频波形不能像将句子分成单词那样整齐地分成离散的块。为了解决这个问题,原始音频信号通常以固定的间隔采样。如果在一个间隔内采样次数越多,采样率就越高,音频就越接近原始音频源。
以往处理方式是对音频进行预处理,从中提取有用的特征。现在更常见的是直接将原始音频波形馈送到特征编码器以提取音频表示来启动音频和语音处理任务。这样简化了预处理步骤,并允许模型学习最基本的特征。
音频分类
音频分类(Audio classification)是一项根据给定音频数据输入从预定义的类别集合中找到最符合特征的分类的特定任务。具有许多具体的应用,包括:
- 声学场景分类:使用场景标签("办公室"、"海滩"、"体育场")对音频进行标记。
- 声学事件检测:使用声音事件标签("汽车喇叭声"、"鲸鱼叫声"、"玻璃破碎声")对音频进行标记。
- 标记:对包含多种声音的音频进行标记(鸟鸣、会议中的说话人识别)。
- 音乐分类:使用流派标签("金属"、"嘻哈"、"乡村")对音乐进行标记。
from transformers import pipeline classifier = pipeline(task="audio-classification", model="superb/hubert-base-superb-er") preds = classifier("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac") preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds] preds
结果:
[{'score': 0.4532, 'label': 'hap'},
{'score': 0.3622, 'label': 'sad'},
{'score': 0.0943, 'label': 'neu'},
{'score': 0.0903, 'label': 'ang'}]
自动语音识别
自动语音识别(Automatic speech recognition,ASR)实现将语音转录为文本的特定任务。如今,ASR 系统已经嵌入到各种智能技术产品中,如演讲者、电话和汽车等;通过语音识别控制,我们可以要求虚拟助手播放音乐、设置提醒和告诉天气情况等。
Transformer 架构还帮助解决了一个关键挑战即低资源语言。通过在大量语音数据上进行预训练,仅在一个低资源语言的一小时标记语音数据上进行微调,仍然可以产生与以前在100倍更多标记数据上训练的 ASR 系统相比高质量的结果。
from transformers import pipeline
transcriber = pipeline(task="automatic-speech-recognition", model="openai/whisper-small")
transcriber("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
结果:
{'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'}
语音合成
语音合成(Text-to-speech,TTS)是一项将文本转换为语音的特定任务,可以为不同的话语者用不同的语言生成语音。目前在 transformer中有几种语音合成模型可用,如 [Bark],[MMS], [VITS] 和 [SpeechT5] 等。
通过实例化"Pipeline并指定任务标识为 text-to-audio(另名 text-to-speech)轻松生成音频。有的模型如 Bark 还可以通过条件反射产生非语言交流如大笑、叹息和哭泣,甚至音乐等。
通过实例化 Pipeline 并指定任务名为 text-to-speech 并传入 suno/bark-small 模型实现语音合成:
from transformers import pipeline
pipe = pipeline("text-to-speech", model="suno/bark-small")
text = "[clears throat] This is a test ... and I just took a long pause."
output = pipe(text)
转换完成后,可使用下面的代码案例来听听转换后的语音:
from IPython.display import Audio
Audio(output["audio"], rate=output["sampling_rate"])
目前在 Transformers 中提供的语音合成模型是 SpeechT5 和 FastSpeech2Conformer,将来会不断的增加。
零样本音频分类
零样本音频分类(Zero-shot Audio classification)是对给定的音频输入识别音频类别并指派到给定的以前未知的分类中的特定任务。
首先将 Pipeline 实例化并在实例化过程中指定任务为 zero-shot-audio-classification :
from transformers import pipeline
from datasets import load_dataset
classifier = pipeline(task="zero-shot-audio-classification")
然后,我们准备需要的分析音频,这里我们使用现有的数据集[ ashraq/esc50 ]中训练集中提取一条数据中的音频:
dataset = load_dataset("ashraq/esc50")
audio = dataset["train"][1]["audio"]["array"]
其中,数据集的样式如下:
{
'filename': '1-100210-B-36.wav',
'fold': 1,
'target': 36,
'category': 'vacuum_cleaner',
'esc10': False,
'src_file': 100210,
'take': 'B',
'audio': {
'path': None,
'array': array([0.53897095, 0.39627075, 0.26739502, ..., 0.09729004, 0.11227417,0.07983398]),
'sampling_rate': 44100
}
}
从上面的数据可以看到,提取的音频数据是已经处理好的张量;如果实际加载原始音频数据或文件,需要将音频加载并预处理变成所需的张量。
最后,传入待分析的音频并通过输入参数 candidate_labels设置新的分类集合后对给定的音频预测,并将结果打印出来:
# audio是复合类型,可以是numpy.ndarray, 字节数组或者字符串的一种
result = classifier(audio, candidate_labels=["Sound of a dog", "Sound of vaccum cleaner","chirping_birds"])
print(result)
结果:
[
{'score': 0.9998486042022705, 'label': 'chirping_birds'},
{'score': 7.838715828256682e-05, 'label': 'Sound of vaccum cleaner'},
{'score': 7.297335105249658e-05, 'label': 'Sound of a dog'}
]