全文共6655字,预计学习时长13分钟
本文阐述了如何利用Tensorflow编写一个基本的端到端自动语音识别(Automatic Speech Recognition,ASR)系统,详细介绍了最小神经网络的各个组成部分以及可将音频转为可读文本的前缀束搜索解码器。
虽然当下关于如何搭建基础机器学习系统的文献或资料有很多,但是大部分都是围绕计算机视觉和自然语言处理展开的,极少有文章就语音识别展开介绍。本文旨在填补这一空缺,帮助初学者降低入门难度,提高学习自信。
前提
初学者需要熟练掌握:
· 神经网络的组成
· 如何训练神经网络
· 如何利用语言模型求得词序的概率
概述
· 音频预处理:将原始音频转换为可用作神经网络输入的数据
· 神经网络:搭建一个简单的神经网络,用于将音频特征转换为文本中可能出现的字符的概率分布
· CTC损失:计算不使用相应字符标注音频时间步长的损失
· 解码:利用前缀束搜索和语言模型,根据各个时间步长的概率分布生成文本
本文重点讲解了神经网络、CTC损失和解码。
音频预处理
搭建语音识别系统,首先需要将音频转换为特征矩阵,并输入到神经网络中。完成这一步的简单方法就是创建频谱图。
def create_spectrogram(signals): stfts = tf.signal.stft(signals, fft_length=256) spectrograms = tf.math.pow(tf.abs(stfts), 0.5) return spectrograms
这一方法会计算出音频信号的短时傅里叶变换(Short-time Fourier Transform)以及功率谱,其最终输出可直接用作神经网络输入的频谱图矩阵。其他方法包括滤波器组和MFCC(Mel频率倒谱系数)等。
了解更多音频预处理知识:https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html
神经网络
下图展现了一个简单的神经网络结构。
语音识别基本结构
频谱图输入可以看作是每个时间步长的向量。1D卷积层从各个向量中提取出特征,形成特征向量序列,并输入LSTM层进一步处理。LSTM层(或双LSTM层)的输入则传递至全连接层。利用softmax激活函数,可得出每个时间步长的字符概率分布。整个网络将会用CTC损失函数进行训练(CTC即Connectionist Temporal Classification,是一种时序分类算法)。熟悉整个建模流程后可尝试使用更复杂的模型。
class ASR(tf.keras.Model): def __init__(self, filters, kernel_size, conv_stride, conv_border, n_lstm_units, n_dense_units): super(ASR, self).__init__() self.conv_layer = tf.keras.layers.Conv1D(filters, kernel_size, strides=conv_stride,