深度学习模型通常需要大量的标注训练数据才能达到良好的性能。然而,在语音识别领域,获取标注数据尤其困难,因为需要数千小时的转录语音数据来覆盖全球超过6000种语言。近年来,自监督学习作为一种新的范式,通过从无标注样本中学习通用数据表示,并在标注数据上微调模型,已经在自然语言处理和计算机视觉领域取得了显著成功。
Wav2Vec2利用自监督学习,通过无标注训练数据学习,使得语音识别能够覆盖更多的语言和方言。仅使用一小时的标注训练数据,Wav2Vec2就能在LibriSpeech基准测试的100小时子集上超越之前的最先进技术,同时使用的标注数据减少了100倍。
如果对数据科学领域感兴趣,并希望了解这些令人兴奋的技术,推荐查看。
Wav2Vec2模型接收任何语言的原始语音信号作为输入。这些音频数据是一维的,并被传递给多层一维卷积神经网络以生成每25毫秒的音频表示。该模型使用了类似于VQ-Vae的量化器概念,其中潜在表示与码本匹配,以便为数据选择最合适的表示。
当这些量化数据被送入Transformer时,大约一半的音频表示会被掩蔽。目标是预测这些掩蔽向量,这是通过对比损失函数有效地完成的。在无标注语音上预训练后,模型会在标注数据上进行微调,以用于下游的语音识别任务,如情感识别和说话人识别。
在有100小时标注数据的Noisy Student自训练中,Word Error Rate(WER)为8.6。这里,Wav2Vec2使用100小时的数据进行训练,而1小时的数据已经能够提供更好的性能。更令人惊讶的是,Wav2Vec2在仅有10分钟标注数据的情况下的性能。
类似于Transformers中的Bidirectional Encoder Representations(BERT),Wav2Vec2通过预测音频掩蔽部分的语音单元进行训练,但使用的是25毫秒长的表示。这使得它即使在标注训练数据减少100倍的情况下,也能超越最佳的半监督方法。
Hugging Face为在960小时Librispeech上预训练和微调的基模型提供了一个,该模型在16kHz采样的语音音频上进行了预训练。可以通过浏览器录制音频样本并查看结果!
以下是如何使用Transformers库和Wav2Vec2将任何英语音频转换为文本的示例代码。
!pip install -q transformers
import librosa
import torch
from transformers import Wav2Vec2ForCTC, Wav2Vec2Tokenizer
# 加载模型和分词器
tokenizer = Wav2Vec2Tokenizer.from_pretrained("facebook/wav2vec2-base-960h")
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h")
# 由于基础模型是在16 kHz音频上预训练的,必须确保音频样本也被重新采样到16 kHz的采样率。
speech, rate = librosa.load("Audio.wav", sr=16000)
input_values = tokenizer(speech, return_tensors='pt').input_values
# 存储对数几率(未归一化的预测)
logits = model(input_values).logits
# 存储预测的ID
predicted_ids = torch.argmax(logits, dim=-1)
# 解码音频以生成文本
transcriptions = tokenizer.decode(predicted_ids[0])
print(transcriptions)