找工作的事情暂时告一段落,感觉还需要不断提升自己,不说多少了,直接步入正题。
语音识别是人机交互、人工智能等领域必不可少的一个研究领域,下面就以该例为标准。
使用的数据集:THCHS30(Dong Wang, Xuewei Zhang, Zhiyong Zhang发布的开放语音数据集);
地址:
语音文件:http://data.cslt.org/thchs30/zip/wav.tgz
对应文本:http://data.cslt.org/thchs30/zip/doc.tgz
下载后,解压放到data文件夹下。
tensorflow环境:0.12.1
1)加载文件、分词等预处理操作:
#coding=utf-8
import tensorflow as tf
import numpy as np
import os
from collections import Counter
import librosa
import time
#训练样本路径
wav_path = 'data/wav/train'
label_file = 'data/doc/trans/train.word.txt'
# 获得训练用的wav文件路径列表
def get_wave_files(wav_path=wav_path):
wav_files = []
for (dirpath,dirnames,filenames) in os.walk(wav_path):#访问文件夹下的所有文件
#os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下
for filename in filenames:
if filename.endswith('.wav') or filename.endswith('.WAV'):
#endswith() 方法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False
filename_path = os.sep.join([dirpath,filename])#定义文件路径(连)
if os.stat(filename_path).st_size < 240000:#st_size文件的大小,以位为单位
continue
wav_files.append(filename_path)#加载文件
return wav_files
wav_files = get_wave_files()#获取文件名列表
#读取wav文件对应的label
def get_wav_label(wav_files=wav_files,label_file=label_file):
labels_dict = {}
with open(label_file,encoding='utf-8') as f:
for label in f :
label =label.strip('\n')
label_id = label.split(' ',1)[0]
label_text = label.split(' ',1)[1]
labels_dict[label_id]=label_text#以字典格式保存相应内容
labels=[]
new_wav_files = []
for wav_file in wav_files:
wav_id = os.path.basename(wav_file).split('.')[0]
#得到相应的文件名后进行'.'分割
if wav_id in labels_dict:
labels.append(labels_dict[wav_id])#存在该标签则放入
new_wav_files.append(wav_file)
return new_wav_files,labels#返回标签和对应的文件
wav_files,labels = get_wav_label()#得到标签和对应的语音文件
print("加载训练样本:",time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
print("样本数:",len(wav_files))
#词汇表(参考对话、诗词生成)
all_words = []
for label in labels:
all_words += [word for word in label]
counter = Counter(all_words)
count_pairs =sorted(counter.items(),key=lambda x: -x[1])
words,_=zip(*count_pairs)
words_size =len(words)#词汇表尺寸
print('词汇表大小:',words_size)
#词汇映射成id表示
word_num_map = dict(zip(words,range(len(words))))
to_num = lambda word: word_num_map.get(word,len(words))#词汇映射函数
labels_vector =[list(map(to_num,label)) for label in labels]
label_max_len= np.max([len(label) for label in labels_vector])#获取最长字数
print(<