本文以20170001P00001A0002.wav为例,逐步运行
持续更新…
general_function
file_dict.py
- 函数:GetSymbolList(datapath)
- 功能:加载dict.txt文件中的拼音符号列表,用于标记符号
- 返回:list_symbol列表,[‘a1’,‘a2’,…]
file_wav.py
-
函数:read_wav_data(filename)
- 功能:使用wav库读取xxx.wav
- 返回:wave_data:(声道数,帧数)语音信号的时域谱矩阵(一声道为一行)
fs: 帧速率
wave_data = array([[ 16, 16, 8, …, 0, -2, -15]], dtype=int16)
framerate = 16000
-
函数:GetMfccFeature(音频信号数据矩阵wave_data,采样率fs)
- 功能:获取语音信号的mfcc特征。wav_feature.shape = (248, 39)
- 返回:wav_feature:mfcc特征向量的矩阵、一阶差分矩阵、二阶差分矩阵
mfcc特征参考此文
-
函数:GetFrequencyFeature3(音频信号数据矩阵wave_data,采样率fs)
- 功能:获取语音信号的特征矩阵
- 返回:data_input:大小为(特征数量,窗口数)的矩阵
data_input.shape = (247, 200)
-
函数:wav_scale3((音频信号数据矩阵wave_data)
- 功能:对音频信号数据矩阵进行归一化
- 返回:归一化后的wave_data
-
函数:wav_show(音频信号数据矩阵wave_data, 采样率fs)
- 功能:可视化
- 返回:
-
函数:get_wav_list(filename)
- 功能:读取数据列表,wav文件列表
- 返回:dic_filelist:数据id-文件名字典 list_wavmark:名字列表
-
函数:get_wav_symbol(filename)
- 功能:原理与*get_wav_list类似,读取数据列表,标记符号列表
- 返回:dic_symbol_list:数据id-符号字典 list_symbolmark:标记符号列表
readdata24.py
DataSpeech类:
- init(数据存放位置根目录path,数据集类型type=train/dev/test)
- 属性:
- datapath:数据存放根目录
- type:数据集类型
- dic_wavlist_thchs30:thchs30数据集(语音id,语音路径)字典
- dic_symbollist_thchs30:thchs30数据集(语音id,拼音列表)字典
- dic_wavlist_stcmds:stcmds数据集(语音id,语音路径)字典
- dic_symbollist_stcmds:stcmds数据集(语音id,拼音列表)字典
- SymbolNum:记录拼音符号数量
- list_symbol:全部汉语拼音符号列表GetSymbolList()读dict.txt
- list_wavnum:wav文件标记列表
- list_symbolnum:symbol标记列表
- DataNum:记录数据量
- wavs_data:
- 函数:LoadDataList()
- 功能:根据type属性加载用于计算的数据列表并读取thchs30和stcmds数据集的wavalist(语音id 语音路径)和symbollist(语音id 拼音)
- 返回:DataNum:GetDataNum()的返回值
- 函数:GetDataNum()
- 功能:获取thchs30和stcmds数据集的总数据量,当wav数量和symbol数量一致的时候返回正确的值,否则返回-1,代表出错。
- 返回:DataNum:两个数据集的总数量
- 函数:GetData(读取数据开始的位置n_start,读取wav文件的个数n_amount=1)
- 功能:读取数据,返回神经网络输入值和输出值矩阵(可直接用于神经网络训练的那种)
- 返回:data_input:语音的特征矩阵(由2维reshape成3维)
data_label:神经网络输出值标签(语音对应的拼音序号数组)
- 函数:data_genetator(一次产生的数据量batch_size=32, 数据长度audio_length = 1600)
- 功能:数据生成器函数,用于Keras的generator_fit训练。
- 返回: [X, y, input_length, label_length ], labels
X.shape = (batch_size, audio_length, 200, 1) 存放batch_size个数据的语音特征矩阵
y.shape = (batch_size, 64) 存放batch_size个数据的输出值标签
input_length:batch_size个数据长度列表
label_length::batch_size个标签长度
labels:labels.shape = (batch_size,1)
- 函数:GetSymbolNum()
- 功能:获取拼音符号列表list_symbol的长度
- 返回:len(list_symbol)
- 函数:SymbolToNum(拼音符号symbol)
- 功能:符号转为数字
- 返回:list_symbol.index(symbol)
- 函数:NumToVector(数字num)
- 功能:数字转为对应的one-hot向量
- 返回:v:num对应的向量列表
SpeechModel251.py
ModelSpeech类(语音模型类)
-
init(数据存放位置根目录path)
-
属性
- MS_OUTPUT_SIZE = 1424:dict.txt中有1424个拼音(包含空白块),故默认输出的拼音的表示大小是1424
- label_max_string_length = 64:音频数据中最多拼音数
- AUDIO_LENGTH = 1600:数据长度
- .AUDIO_FEATURE_LENGTH = 200:音频特征矩阵维度
-
函数:CreateModel():
- 功能:定义CNN/LSTM/CTC模型,使用函数式模型
- 输入层:200维的特征值序列,一条语音数据的最大长度设为1600(大约16s)
- 隐藏层:卷积池化层,卷积核大小为3x3,池化窗口大小为2
- 隐藏层:全连接层
- 输出层:全连接层,神经元数量为self.MS_OUTPUT_SIZE,使用softmax作为激活函数
- CTC层:使用CTC的loss作为损失函数,实现连接性时序多输出
- 返回:model:输入:音频的特征矩阵 输出:y_pred
model_data:输入:[音频的特征矩阵input_data, 音频标签labels, input_length, label_length] 输出:以ctc做函数的损失值
-
函数:ctc_lambda_func(args)
- 功能:返回损失函数值,详情见CTC算法理解一文
- 返回:ctc_batch_cost(labels, y_pred, input_length, label_length)
-
函数:TrainModel(数据保存的路径datapath, 迭代轮数epoch = 2,每多少步保存一次模型 save_step = 1000, batch_size = 32, filename = abspath + ‘model_speech/m’ + ModelName + ‘/speech_model’+ModelName)
- 功能:训练模型
- 调用:._model.fit_generator()、SaveModel、TestMode
-
函数:LoadModel(filename = abspath + ‘model_speech/m’+ModelName+’/speech_model’+ModelName+’.model’)
- 功能:加载模型参数
- 调用:._model.load_weights、.base_model.load_weights
-
函数:SaveModel(sfilename = abspath + ‘model_speech/m’+ModelName+’/speech_model’+ModelName,comment=’’)
- 功能:保存模型参数
-
函数:TestModel( datapath=’’, str_dataset=‘dev’, data_count = 32, out_report = False, show_ratio = True, io_step_print = 10, io_step_file = 10)
-
参数说明:io_step_print:为了减少测试时标准输出的io开销,可以通过调整这个参数来实现
io_step_file:为了减少测试时文件读写的io开销,可以通过调整这个参数来实现 -
功能:使用编辑距离测试模型错误率
-
-
函数:Predict( 语音的特征矩阵data_input, 语音长度input_len)
- 功能:根据语音特征进行预测
- 返回:r1:返回语音识别后的拼音符号列表
-
函数:RecognizeSpeech(wavsignal, fs)
- 功能:最终做语音识别用的函数,识别一个wav序列的语音
- 返回:r_str:识别的拼音序列
LanguageModel2.py
ModelLanguage类(语言模型类)
- init(语言模型所在的目录modelpath)
- 函数:LoadModel()
- 功能:加载语言模型
- 返回:model:(dict_pinyin, model1, model2 ),元组类型
- 函数:GetPinyin(拼音文件所在位置filename)
- 功能:获取拼音字典
- 返回:dict:dic_pinyin.txt对应的字典
- 函数:GetLanguageModel(模型文件所在位置modelLanFilename)
- 功能:获取语言模型
- 返回:dic_model:language_model1/2.txt对应的字典
- 函数:GetSymbolDict(字典所在位置dictfilename)
- 功能:获取拼音符号字典
- 返回:dic_symbol:dict.txt对应的字典
- 函数:SpeechToText(拼音序列list_syllable)
- 功能:语音识别专用的处理函数,实现从语音拼音符号到最终文本的转换
- 返回:str_result:文本序列
- 函数:decode(拼音序列list_syllable, yuzhi = 0.0001)
- 功能:实现拼音向文本的转换,基于马尔可夫链
- 返回:list_words