首页 > 分享 > 语音识别(一):介绍和简单实现

语音识别(一):介绍和简单实现

1. 语音识别介绍

语音识别的最主要过程是:

特征提取:从声音波形中提取声学特征;声学模型(语音模型):将声学特征转换成发音的音素;语言模型使用语言模型等解码技术转变成我们能读懂的文本。

语音识别系统的典型结构如图1所示:

图1 语音识别结构

1.1 声学特征提取

声音实际上一种波,原始的音频文件叫WAV文件,WAV文件中存储的除了一个文件头以外,就是声音波形的一个个点。如图2所示:

图2 声音波形示意图

要对声音进行分析,首先对声音进行分帧,把声音切分成很多小的片段,帧与帧之间有一定的交叠,如图3,每一帧长度是25ms,帧移是10ms,两帧之间有25-10=15ms的交叠。

图3 帧切割图

分帧后,音频数据就变成了很多小的片段,然后针对小片段进行特征提取,常见的提取特征的方法有:线性预测编码(Linear Predictive Coding,LPC),梅尔频率倒谱系数(Mel-frequency Cepstrum),把一帧波形变成一个多维向量的过程就是声学特征提取。

1.2. 声学特征转换成音素(声学模型)

音素是人发音的基本单位。对于英文,常用的音素是一套39个音素组成的集合。对于汉语,基本就是汉语拼音的生母和韵母组成的音素集合,大概200多个。本文例子中LSTM+CTC神经网络就是声学特征转换成音素这个阶段,该阶段的模型被称为声学模型。

1.3. 音素转文本(语言模型+解码)

得到声音的音素序列后,就可以使用语言模型等解码技术将音素序列转换成我们可以读懂的文本。解码过程对给定的音素序列和若干假设词序列计算声学模型和语言模型分数,将总体输出分数最高的序列作为识别的结果。

2. 语音识别简单实现

本文通过一个简单的例子演示如何用tensorflow的LSTM+CTC完成一个端到端的语音识别,为了简化操作,本例子中的语音识别只训练一句话,这句话中的音素分类也简化成对应的字母(与真实因素的训练过程原理一致)。计算过程如下图所示:

                                               

2.1 提取WAV文件中特征

首先读者肯定会有疑问?什么是WAV文件?笔者在此简单的介绍一下,WAV格式是微软公司开发的一种声音文件格式,也叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持,是一种无损的音频数据存放格式。

本文在读取WAV的特征数据后,采用python_speech_features包中的方法来读取文件的MFCC特征,详细代码如下:

def get_audio_feature():

'''

获取wav文件提取mfcc特征之后的数据

'''

audio_filename = "audio.wav"

fs, audio = wav.read(audio_filename)

inputs = mfcc(audio, samplerate=fs)

feature_inputs = np.asarray(inputs[np.newaxis, :])

feature_inputs = (feature_inputs - np.mean(feature_inputs))/np.std(feature_inputs)

feature_seq_len = [feature_inputs.shape[1]]

return feature_inputs, feature_seq_len

函数的返回值feature_seq_len表示这段语音被分割成了多少帧,一帧数据计算出一个13维长度的特征值。返回值feature_inputs是一个二维矩阵,矩阵行数是feature_seq_len长度,列数是13。

2.2 将WAV文件对应的文本文件转换成音素分类

本文音素的数量是28,分别对应26个英文字母、空白符和没有分到类情况。WAV文件对应的文本文件的内容是she had your dark suit in greasy wash water all year。现在把这句话转换成整数表示的序列,空白用0表示,a-z分别用数字1-26表示,则转换的结果为:[19 8 5 0 8 1 4 0 25 15 21 18 0 4 1 18 110 19 21 9 20 0 9 14 0 7 18 5 1 19 25 0 231 19 8 0 23 1 20 5 18 0 1 12 12 0 25 5 118],最后将整个序列转换成稀疏三元组结构,这样就可以直接用在tensorflow的tf.sparse_placeholder上。转换代码如下:

with open(target_filename, 'r') as f:

line = f.readlines()[0].strip()

targets = line.replace(' ', ' ')

targets = targets.split(' ')

targets = np.hstack([SPACE_TOKEN if x == '' else list(x) for x in targets])

targets = np.asarray([SPACE_INDEX if x == SPACE_TOKEN else ord(x) - FIRST_INDEX

for x in targets])

train_targets = sparse_tuple_from([targets])

print(train_targets)

return train_targets

2.3 定义双向LSTM

定义双向LSTM及LSTM之后的特征映射的代码如下:

def inference(inputs, seq_len):

cell_fw = tf.contrib.rnn.LSTMCell(num_hidden,

initializer=tf.random_normal_initializer(

mean=0.0, stddev=0.1),

state_is_tuple=True)

cells_fw = [cell_fw] * num_layers

cell_bw = tf.contrib.rnn.LSTMCell(num_hidden,

initializer=tf.random_normal_initializer(

mean=0.0, stddev=0.1),

state_is_tuple=True)

cells_bw = [cell_bw] * num_layers

outputs, _, _ = tf.contrib.rnn.stack_bidirectional_dynamic_rnn(cells_fw, cells_bw, inputs,

dtype=tf.float32,

sequence_length=seq_len)

shape = tf.shape(inputs)

batch_s, max_timesteps = shape[0], shape[1]

outputs = tf.reshape(outputs, [-1, num_hidden])

W = tf.Variable(tf.truncated_normal([num_hidden,

num_classes],

stddev=0.1))

b = tf.Variable(tf.constant(0., shape=[num_classes]))

logits = tf.matmul(outputs, W) + b

logits = tf.reshape(logits, [batch_s, -1, num_classes])

logits = tf.transpose(logits, (1, 0, 2))

return logits

2.4 模型训练和测试

最后将读取数据、构建LSTM+CTC网络及训练过程结合起来,在完成500次迭代训练后,进行测试,并将结果输出,部分代码如下:

def main():

inputs = tf.placeholder(tf.float32, [None, None, num_features])

targets = tf.sparse_placeholder(tf.int32)

seq_len = tf.placeholder(tf.int32, [None])

logits = inference(inputs, seq_len)

loss = tf.nn.ctc_loss(targets, logits, seq_len)

cost = tf.reduce_mean(loss)

训练过程及结果如下图:

从上图训练结果可以清洗的看出经过500次的迭代训练,语音文件基本已经可以完全识别,本例只演示了一个简单的LSTM+CTC的端到端的训练,实际的语音识别系统还需要大量训练样本以及将音素转换成文本的解码过程。后续文章中,笔者会继续深入语音识别。

相关知识

宠物语音识别软件
语音情感识别调研
几款免费的语音转文字工具推荐(附识别准确度排行榜)
MeowBot:ESP32 语音控制宠物猫 DIY 教程——玩转语音识别与 MQTT 智能家居控制 (附代码解析)
一种利用宠物语音信号识别情绪的方法及系统与流程
动物声音识别
AI智能语音宠物语言识别APP下载,AI智能语音宠物语言识别APP v1.0
传感器让电子宠物狗可识别语音命令
喵?如何用机器学习识别猫叫和狗叫声?
天猫精灵 喵控智能语音管家

网址: 语音识别(一):介绍和简单实现 https://m.mcbbbk.com/newsview171190.html

所属分类:萌宠日常
上一篇: 智能机器宠物的设计与实现
下一篇: [AI行业案例]