市面上语音识别技术原理已经有很多很多了,然而很多程序员兄弟们想研究的时候却看的头大,一堆的什么转mfcc,然后获取音素啥的,对于非专业音频研究者或非科班出生的程序员来说,完全跟天书一样。

最近在研究相关的实现,并且学习了keras和tensorflow等。用keras做了几个项目之后,开始着手研究语音识别的功能,在网上下载了一下语音的训练文件,已上传到了百度云盘:https://pan.baidu.com/s/1Au85kI_oeDjode2hWumUvQ
目录如下,文件夹名就是里面的语音的标签,语音由很多不同年龄性别的人发音收集而来

拿到一个语音文件之后需要先转mfcc,这个操作很简单,不需要什么高深的内功。用python写一段函数专门用来获取语音文件的fmcc值。

def get_wav_mfcc(wav_path):f = wave.open(wav_path,'rb')params = f.getparams()# print("params:",params)nchannels, sampwidth, framerate, nframes = params[:4]strData = f.readframes(nframes)#读取音频,字符串格式waveData = np.fromstring(strData,dtype=np.int16)#将字符串转化为intwaveData = waveData*1.0/(max(abs(waveData)))#wave幅值归一化waveData = np.reshape(waveData,[nframes,nchannels]).Tf.close()### 对音频数据进行长度大小的切割,保证每一个的长度都是一样的#【因为训练文件全部是1秒钟长度,16000帧的,所以这里需要把每个语音文件的长度处理成一样的】data = list(np.array(waveData[0]))# print(len(data))while len(data)>16000:del data[len(waveData[0])-1]del data[0]# print(len(data))while len(data)<16000:data.append(0)# print(len(data))data=np.array(data)# 平方之后,开平方,取正数,值的范围在  0-1  之间data = data ** 2data = data ** 0.5return data

参数为单个文件在磁盘的位置,mfcc是一堆的正数和负数组成的数组:

为了在训练的时候避免损失函数应为负数导致输出结果相差太大,需要把原始的mfcc全部转为正数,直接平方后在开方就是正值了。

我们可以把每个音频的mfcc值当做对应的特征向量,然后进行训练,我这里为了测试速度,取了seven 和 stop 两个语音类别来进行训练和识别,每个大概2700多个文件。并且分别从两个文件夹中剪切出来100个当做测试集,并每样拿出5个当做后面的试验集。


test1 中放置的是 100个 seven 语音,test2 中放置的是100个 stop 语音,trunk中放的是5个seven 和5个stop 语音。

如图1开头的都是seven , 2开头的都是stop 。

训练之前需要先读取数据创建数据集和标签集:

# 加载数据集 和 标签[并返回标签集的处理结果]
def create_datasets():wavs=[]labels=[] # labels 和 testlabels 这里面存的值都是对应标签的下标,下标对应的名字在 labsInd 和 testlabsInd 中testwavs=[]   testlabels=[]labsInd=[]      ## 训练集标签的名字   0:seven   1:stoptestlabsInd=[]  ## 测试集标签的名字   0:seven   1:stop# 现在为了测试方便和快速直接写死,后面需要改成自动扫描文件夹和标签的形式#加载seven训练集path="D:\\wav\\seven\\"files = os.listdir(path)for i in files:# print(i)waveData = get_wav_mfcc(path+i)# print(waveData)wavs.append(waveData)if ("seven" in labsInd)==False:labsInd.append("seven")labels.append(labsInd.index("seven"))#加载stop训练集path="D:\\wav\\stop\\"files = os.listdir(path)for i in files:# print(i)waveData = get_wav_mfcc(path+i)wavs.append(waveData)if ("stop" in labsInd)==False:labsInd.append("stop")labels.append(labsInd.index("stop"))#加载seven测试集path="D:\\wav\\test1\\"files = os.listdir(path)for i in files:# print(i)waveData = get_wav_mfcc(path+i)testwavs.append(waveData)if ("seven" in testlabsInd)==False:testlabsInd.append("seven")testlabels.append(testlabsInd.index("seven"))#加载stop测试集path="D:\\wav\\test2\\"files = os.listdir(path)for i in files:# print(i)waveData = get_wav_mfcc(path+i)testwavs.append(waveData)if ("stop" in testlabsInd)==False:testlabsInd.append("stop")testlabels.append(testlabsInd.index("stop"))wavs=np.array(wavs)labels=np.array(labels)testwavs=np.array(testwavs)testlabels=np.array(testlabels)return (wavs,labels),(testwavs,testlabels),(labsInd,testlabsInd)

拿到数据集之后就可以开始进行神经网络的训练了,keras提供了很多封装好的可以直接使用的神经网络,我们先建立神经网络模型

# 构建一个4层的模型
model = Sequential()
model.add(Dense(512, activation='relu',input_shape=(16000,))) # 音频为16000帧的数据,这里的维度就是16000,激活函数直接用常用的relu
model.add(Dense(256, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(2, activation='softmax'))  # 因为只有两个类别的语音,最后输出应该就是2个分类的结果
# [编译模型] 配置模型,损失函数采用交叉熵,优化采用Adadelta,将识别准确率作为模型评估
model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy'])
#  validation_data为验证集
model.fit(wavs, labels, batch_size=124, epochs=5, verbose=1, validation_data=(testwavs, testlabels)) ## 进行5轮训练,每个批次124个# 开始评估模型效果 # verbose=0为不输出日志信息
score = model.evaluate(testwavs, testlabels, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1]) # 准确度
训练之后的结果:


两个类型的文件一个4500多个,我本机使用CPU训练大概用时20多秒。
最后显示结果准确率为0.9050.也就是90.5%的准确率,这里可以加大数据集的数量和调参来加大准确率。

最后保存模型到文件:

model.save('asr_model_weights.h5') # 保存训练模型

保存之后会在文件夹中生成一个文件【95M】:

先在训练的模型已经有了,我们开始使用trunk中的文件进行试验:

先加载之前训练的模型:

model = load_model('asr_model_weights.h5') # 加载训练模型

然后获得当前需要试验的文件的mfcc。并且将数据封装成和训练时一样的维度。并且使用模型的predict函数输出结果:

wavs=[]
wavs.append(get_wav_mfcc("D:\\wav\\trunk\\2c.wav")) # 使用某一个文件
X=np.array(wavs)
print(X.shape)
result=model.predict(X[0:1])[0] # 识别出第一张图的结果,多张图的时候,把后面的[0] 去掉,返回的就是多张图结果
print("识别结果",result)

结果输出:

可以看出结果是一个2个数的数组,里面返回的对应类别相似度,也就是说哪一个下标的值最大,就跟那个下标对应的标签最相似。

之前训练的时候,标签的集是:[seven , stop]

所以如图下标1的值达到了89.9%的相似度。

#  因为在训练的时候,标签集的名字 为:  0:seven   1:stop    0 和 1 是下标
name = ["seven","stop"] # 创建一个跟训练时一样的标签集
ind=0 # 结果中最大的一个数
for i in range(len(result)):if result[i] > result[ind]:ind=1
print("识别的语音结果是:",name[ind])

我们把试验文件换成 1b.wav

wavs.append(get_wav_mfcc("D:\\wav\\trunk\\1b.wav"))

结果输出:

本机的试验的识别速度在2秒内。

本文相关的代码已上传github:https://github.com/BenShuai/kerasTfPoj/tree/master/kerasTfPoj/ASR

python+keras实现语音识别相关推荐

  1. python+keras汉字单字语音识别

    python+keras单字语音识别 一.两种思路 二.代码更新 三.汉字语音识别 一.两种思路 就当前学习所知,有两种语音识别的思路 1.将语音文件提取mfcc,即转为二维张量形式,然后进行dens ...

  2. 成功解决AttributeError: module 'tensorflow.python.keras' has no attribute 'Model'

    成功解决AttributeError: module 'tensorflow.python.keras' has no attribute 'Model' 目录 解决问题 解决方法 解决问题 File ...

  3. Python Keras ValueError: Layer sequential expects 1 input(s), but it received 2 input tensors. 解决方法

    在fashion_mnist的学习中遇到这样一个问题,代码如下: from tensorflow.keras import Sequential from tensorflow.keras.layer ...

  4. 如何利用python进行在线语音识别

    如何利用python实现在线语音识别 本篇文章主要介绍使用 python 借助 百度人工智能 实现在线的 语音识别 功能. 学习经历 在正式介绍如何进行在线语音识别功能之前我想先分享一下我自己的学习顺 ...

  5. python 语音识别_带有Python的AI –语音识别

    python 语音识别 带有Python的AI –语音识别 (AI with Python – Speech Recognition) In this chapter, we will learn a ...

  6. 用Python程序实现语音识别就是这么简单!​

    前言 Python程序提供了其他技术无法比拟的交互性和可访问性,重要的是,在 Python 程序中实现语音识别非常简单.我们一起来了解python程序的:语音识别的工作原理.PyPI 支持哪些软件包以 ...

  7. 成功解决ImportError: cannot import name ‘adam‘ from ‘tensorflow.python.keras.optimizers‘

    成功解决ImportError: cannot import name 'adam' from 'tensorflow.python.keras.optimizers' 目录 解决问题 解决思路 解决 ...

  8. python怎么加字幕_使用Python和百度语音识别生成视频字幕的实现

    从视频中提取音频 安装 moviepy pip install moviepy 相关代码: audio_file = work_path + '\\out.wav' video = VideoFile ...

  9. python 视频语音转文字_使用Python和百度语音识别生成视频字幕的实现

    从视频中提取音频 安装 moviepy pip install moviepy 相关代码: audio_file = work_path + '\\out.wav' video = VideoFile ...

  10. Python 技术篇-百度语音识别API接口调用演示

    百度语音识别api官网文档 现在演示的是识别音频文件的内容. 重要:token 参数的获取请看上一篇文章: Python 技术篇-百度语音API鉴权认证获取Access Token 注:下面的 tok ...

最新文章

  1. 在AI Studio上部署外部可以直接调用的云端服务
  2. HTML5 javascript修改canvas的大小
  3. synchronized底层是怎么实现的?年薪超过80万!
  4. python安装包为什么这么小-python(x,y)安装好了为何还是加载不了包
  5. python 类-python--类
  6. c#对象集合去重_C# List集合去重操作注意点
  7. php java 架构_JAVA和PHP到底谁才是老大?
  8. ClassNotFoundException:是否减慢了您的JVM?
  9. 海康、大华IPC的rtsp格式
  10. Atitit 项目通讯接口方案attilax总结.docx
  11. cron表达式解析 3秒执行一次
  12. linux镜像下载和vmware虚拟主机部署
  13. java后端使用freemarker生成echarts图表word
  14. 微信公众号开发之删除公众号的菜单按钮
  15. 解决:Firefox添加xpi扩展组件提示“此附件组件无法安装,未通过验证”
  16. 上传文件submit提交form表单 success返回数据多了div获取不到正确的返回数据
  17. 滑窗优化、边缘化、舒尔补、FEJ及fill-in问题
  18. 百度热搜词词云图-python
  19. 天啦噜,项目上使用InputStream,我被坑了一把!
  20. Python爬虫之findall和lxml

热门文章

  1. 基于互联网位置数据的通勤特征挖掘技术
  2. 大数据技术——Spark实时计算
  3. Java widget xui_XUI使用总结
  4. CCF CSP 20190301解答
  5. 考研408-计算机组成原理-总线
  6. 如何搭建点燃式发动机仿真模型
  7. 躺平国历险记:两个超平面之间距离的计算
  8. 计算几何小结 我对计算几何的理解以及叉积和点积
  9. Python基础学习资料视频下载链接
  10. FPGA之JESD204B接口——总体概要 实例 下