自动语音识别技术,也称为语音转文本或转录系统,是一种将人类语音处理成可读文本的技术。如果使用过像苹果的Siri或亚马逊的Alexa这样的虚拟助手,就已经熟悉了自动语音识别系统。在过去的十年中,这个领域呈指数级增长,自动语音识别系统被广泛应用于金融、医疗等多个领域。随着自动语音识别系统快速接近人类的准确度水平,将会有越来越多的应用将自动语音识别技术整合到他们的产品中。鉴于这项技术的普及和需求,本文将尝试创建一个自动语音识别应用。
Wav2Vec2框架概述
Wav2Vec 2.0是一个用于自监督学习的语音表示模型,它在潜在空间中掩盖语音输入,并解决在联合学习的潜在表示的量化上定义的对比任务。它接受一个浮点数组,对应于语音信号的原始波形。由于它是使用连接时序分类(CTC)训练的,因此模型输出需要使用Wav2Vec2CTCTokenizer进行解码。它还通过在53k小时的未标记数据上预训练模型,并在仅十分钟的标记数据上微调,达到了4.8/8.2的词错误率(WER)。这表明语音识别可以在有限的标记数据下工作,这在为难以收集数据的本土语言和方言设计自动语音识别解决方案时可以发挥关键作用。
Wav2Vec2工作原理简述
Wav2Vec 2.0由多层卷积特征编码器f: X → Z组成,它接受原始音频输入(X)并为T时间步产生潜在的语音表示(z1, ..., zT)。然后它们被传递到一个Transformer g: Z → C,它创建了捕获整个序列数据的表示(c1, ..., cT)。与VQ-Wav2Vec相比,Wav2Vec 2.0在连续的语音表示上构建上下文表示,并且自注意力捕获了整个潜在表示序列的依赖关系。
创建自动语音识别应用的步骤
以下是使用Gradio和Hugging FaceSpaces创建自动语音识别应用的逐步指南。如果在将Gradio应用部署到Hugging Face Spaces时遇到问题,请查看1LittleCoder提供的详细指南。
# 导入必要的库
import nltk
import librosa
import torch
import gradio as gr
from transformers import Wav2Vec2Tokenizer, Wav2Vec2ForCTC
nltk.download("punkt")
# 加载预训练模型和相应的分词器
model_name = "facebook/wav2vec2-base-960h"
tokenizer = Wav2Vec2Tokenizer.from_pretrained(model_name)
model = Wav2Vec2ForCTC.from_pretrained(model_name)
# 确保语音输入的采样率为16kHz的函数
def load_data(input_file):
speech, sample_rate = librosa.load(input_file)
if len(speech.shape) > 1:
speech = speech[:,0] + speech[:,1]
if sample_rate != 16000:
speech = librosa.resample(speech, sample_rate, 16000)
return speech
# 纠正句子中字母大小写的函数
def correct_casing(input_sentence):
sentences = nltk.sent_tokenize(input_sentence)
return (' '.join([s.replace(s[0],s[0].capitalize(),1) for s in sentences]))
# 获取音频输入的转录文本的函数
def asr_transcript(input_file):
speech = load_data(input_file)
input_values = tokenizer(speech, return_tensors="pt").input_values
logits = model(input_values).logits
predicted_ids = torch.argmax(logits, dim=-1)
transcription = tokenizer.decode(predicted_ids[0])
transcription = correct_casing(transcription.lower())
return transcription
# 使用Gradio.Interface创建模型的UI
gr.Interface(
asr_transcript,
inputs=gr.inputs.Audio(source="microphone", type="filepath", optional=True, label="Speaker"),
outputs=gr.outputs.Textbox(label="Output Text"),
title="ASR using Wav2Vec 2.0",
description="This application displays transcribed text for given audio input",
examples=[["Test_File1.wav"], ["Test_File2.wav"], ["Test_File3.wav"]],
theme="grass"
).launch()