当前位置: 首页 > 编程日记 > 正文

实战:基于tensorflow 的中文语音识别模型 | CSDN博文精选

640?wx_fmt=jpeg

作者 | Pelhans

来源 | CSDN博客

目前网上关于tensorflow 的中文语音识别实现较少,而且结构功能较为简单。而百度在PaddlePaddle上的 Deepspeech2 实现功能却很强大,因此就做了一次大自然的搬运工把框架转为tensorflow….

简介

百度开源的基于PaddlePaddle的Deepspeech2实现功能强大,简单易用,但新框架上手有难度而且使用过程中遇到了很多bug,因此萌生了转成tensorflow的想法。网上看了一圈,发现基于tensorflow的中文语音识别开源项目很少,而且功能较为简单。英语的项目倒是很多,但奈何写代码的人功力太深厚,想转成中文的很麻烦。因此本项目的目标是做一个简单易理解,方便新手入门的基于神经网络的ASR模型,同时把常用的功能加上方便参考。(实际上是代码功力太差…), 语料采用Aishell 的170h语音.

项目连接ZASR_tensorflow
https://github.com/Pelhans/ZASR_tensorflow

识别流程

一、语料整理

1.1 生成 manifest.{train,dev,test} 文件

manifest 文件包含音频文件的元信息,如文件路径、对应的文本、持续时长。存储格式为JSON格式。类似于Kaldi里的scp文件 和text文件的结合。

{"audio_filepath": "/media/nlp/23ACE59C56A55BF3/wav_file/aishell/data_aishell/wav/train/S0002/BAC009S0002W0122.wav", "duration": 5.999, "text": "而对楼市成交抑制作用最大的限购"}
您可以通过example/aishell/run_data.sh 脚本中的第一部分生成该文件,也可以修改参数后运行data/aishell/aishell.py 来生成,同时若指定目录不包含指定文件,则自动下载语料并解压。

1.2 生成vocab.txt

vocab.txt 是基于字的,即统计语料文本中的汉字。通过data_utils/build_vocab.py 生成。

1.3 生成mean_std.npz

mean_std.npz 是2000 个随机音频文件进行特征处理后,计算功率谱特征得到的均值和标准差,在训练将会使用它对输入的特征做归一化。由data_utils/compute_mean_std.py 生成。

二、特征处理

2.1 MFCC

MFCC 也就是梅尔倒谱系数,在理论上它的获取流程为:

  • 先对语音进行预加重、分帧和加窗;(加强语音信号性能(信噪比,处理精度等)的一些预处理)

  • 对每一个短时分析窗,通过FFT得到对应的频谱;(获得分布在时间轴上不同时间窗内的频谱)

  • 将上面的频谱通过Mel滤波器组得到Mel频谱;(通过Mel频谱,将线形的自然频谱转换为体现人类听觉特性的Mel频谱)

  • 在Mel频谱上面进行倒谱分析(取对数,做逆变换,实际逆变换一般是通过DCT离散余弦变换来实现, 取DCT后的第2个到第13个系数作为MFCC系数),获得Mel频率倒谱系数MFCC,这个MFCC就是这帧语音的特征;(倒谱分析,获得MFCC作为语音特征)


在代码上已经被人包装好了,可以通过python_speech_features 中的mfcc函数直接得到音频的mfcc特征, 该函数的参数为:
mfcc(signal,samplerate=16000,winlen=0.025,winstep=0.01,numcep=13,    	
nfilt=26,nfft=512,lowfreq=0,highfreq=None,preemph=0.97,    	
ceplifter=22,appendEnergy=True)
具体的参数含义请查看官方介绍。
https://pypi.org/project/python_speech_features/0.4/

除了13 维 mfcc特征外,我们还通过python_speech_features 中的 delta 函数计算了mfcc的一阶差分和二阶差分特征,由此对每一帧得到了39维特征向量。以上过程由data_utils/audio_featurizer.py内的_compute_mfcc()函数实现。

为了更紧密的结合前后帧之间的关系,在实际输入中,每一帧的特征由前后n_context 的特征和本身的特征构成i,n_context 的大小可以在conf/hyparam.py内设置。即:
inputs = concat(n_context * 39, current, n_context * 39)	
dims_of_input = n_context * 39 * 2 + current

特征的n_context 连接由 data_utils/utils.py 内的 audiofile_to_input_vector()函数实现。

2.2 Linear specgram

通过FFT energy 计算linear specgram。其计算流程为:

  • 通过numpy.lib.stride_tricks.as_strided() 函数对输入的样本进行切块得到一个个的windows。

  • 加窗,窗口采用hanning 窗,hanning 窗是一个加权余弦窗函数,是升余弦窗的特列。此处我们通过调用 numpy.hanning(N) 来使用它并计算权重,N代表窗口长度。

  • 做FFT,调用np.fft.rfft()函数做FFT。而后经计算绝对值、求平方、计算对数等处理得到 linear specgram。


该特征的计算由 data_utils/audio_featurizer.py 内的_specgram_real() 函数实现。

三、模型结构

3.1 概览

DeepSpeech2 的模型结构如下图所示:

640?wx_fmt=png

其第一层为1D或2D的卷积神经网络,而后与BRNN或BGRU相连。其后添加了一个前瞻卷积神经网络(Lookahead CNN),该卷积神经网络的输入除当前时间步外还结合了BRNN层的后两时间步输出。Lookahead CNN后采用全连接层对输出进行整型。得到logits 去计算ctc损失函数和解码。

在模型内我们对每一层的输入都使用了Batch Normalization 来减少输入和输出间的分布差距,增加模型的泛化能力并加速训练。

3.2 卷积神经网络CNN

为了方便搭建网络,我们对CNN部分整合到data_utils/network.py 中的conv2d()函数中,它包含卷积、Relu、max_pool、dropout操作。通过设定参数可快速得到指定形状、步长的卷积层。

针对输入语音特征,在输入到卷积层之前需要对其进行reshape操作与expamd_dims 操作,得到形状为[batch_size, n_steps, n_dim, in_channel] 的tensor。因为我在输入特征时已经采用了前后帧的信息,因此我把filter的height 设置为1。conv2d()函数的输出shape 为 [batch_size, height, width. out_channel]。

3.3 双向长短期记忆网络 BLSTM

为了更有效的学习前后帧间的信息,在CNN层后使用了三层BLSTM。打包好的BLSTM实现位于 network.py 内 BiRNN()函数。在该函数内部首先定义了一个正向的LSTM和一个反向的LSTM,而后调用 tf.nn.bidirectional_dynamic_rnn() 函数生成一个BLSTM网络。需要注意的是这个函数有一个time_major 选项,如果为True,那你的输入数据的shape[0]就应该是time_steps而不是batch_size。

3.4 Lookahead CNN

前面说过该网络就是在输入上结合了BLSTM后两时间步的输出。因此理论上我们对该网络的输入进行错位叠加就可以了。。。但实现过程中发现tensor 因为在time_step 维度上形状不可知导致没有办法迭代的取计算这个叠加。有哪位大神知道的可以告诉我一声么,谢谢了。因此这个Lookahead CNN我用的是普通的CNN取代替的,这样当由解决方案后可以直接替换了。

四、模型的训练

4.1 损失函数

损失函数采用CTC损失函数,直接调用ctc_ops.ctc_loss 进行计算,其输入为训练文本标签、神经网络的输出logits和 序列长度。这里需要注意的是假如在网络处理时time_step的长度发生了变化的话有可能导致小于seq_length 引发报错。

4.2 损失函数的优化

优化算法为Adam算法,虽然有可能得不到最优的结果,但对于新人或调参能力不强的还是超级好用的。

五、解码

5.1 ctc_ops.ctc_beam_search_decoder 解码

最简单的方式我们使用tensorflow自带的ctc_ops.ctc_beam_search_decoder() 函数对网络输出进行解码,该解码不使用外部的语言模型,输入为网络输出的logits 和 seq_length。

5.2 带语言模型的解码

在训练声学模型阶段使用的是5.1的解码方式,在实际使用过程中需要添加语言模型来提升识别的准确率。该部分由 utils/decoder/model.py 下的 decode_batch_beam_search()函数完成 。该函数接收一个2维的概率矩阵, 通过结合神经网络的输出概率和语言模型的评分来对输出进行解码。

扫码查看作者更多文章

▼▼▼

640?wx_fmt=jpeg


原文链接:https://blog.csdn.net/pelhans/article/details/81387472

(*本文为 AI科技大本营转载文章,转载联系作者


彩蛋~ 


1024程序员节超值特惠限时秒杀!

活动时间:2019年10月24日00:00-24:00凡在此活动期间购买大会单人票,即送价值298元的CSDN VIP年卡哦!

(VIP年卡特权:全站免广告+600个资源免积分下载+学院千门课程免费看+购课9折)

640?wx_fmt=png


推荐阅读


640?wx_fmt=png

你点的每个“在看”,我都认真当成了AI

相关文章:

js获取Html元素的实际宽度高度

第一种情况就是宽高都写在样式表里,就比如#div1{width:120px;}。这中情况通过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度。第二种情况就是宽和高是写在行内中,比如style"width:120px;",这中…

新框架ES-MAML:基于进化策略、简易的元学习方法

作者 | Xingyou Song、Wenbo Gao、Yuxiang Yang、Krzysztof Choromanski、Aldo Pacchiano、Yunhao Tang译者 | TroyChang编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】现有的MAML算法都是基于策略梯度的,在试图利用随机策…

Tesseract-OCR 3.04简单使用举例(读入图像输出识别结果)

下面code是对Tesseract-OCR 3.04版本进行简单使用的举例&#xff1a;包括两段&#xff0c;一个是读入带有中文字符的图像&#xff0c;一个是读入仅有英文字符的图像&#xff1a; #include "funset.hpp"#include <iostream> #include <string> #include &…

坑爹的微软官方文档:SQL无人值守安装

我在部署项目的时候&#xff0c;需要用批处理无人值守安装SQLserver,.Net等组件。 于是查了微软官方文档&#xff0c;其中一项内容如下&#xff1a; http://msdn.microsoft.com/zh-cn/library/ms144259.aspx SQL Server 安装程序控件 /IACCEPTSQLSERVERLICEN…

各种 django 静态文件的配置总结【待续】

2019独角兽企业重金招聘Python工程师标准>>> 最近在学习django框架的使用&#xff0c;想引用静态css文件&#xff0c;怎么都引用不到&#xff0c;从网搜了好多&#xff0c;大多因为版本问题&#xff0c;和我现在的使用的dango1.1配置不同&#xff0c;根据资料和公司…

实战:人脸识别的Arcface实现 | CSDN博文精选

来源 | CSDN博客本文将简单讲述arcface从训练到部署的整个过程&#xff0c;主要包括前期的数据筛选和准备&#xff0c;模型训练以及模型部署。此文参考的arcface的代码地址&#xff1a;https://github.com/ronghuaiyang/arcface-pytorch数据集准备1. 首先准备需要训练的人脸数据…

Windows7/10上快速搭建Tesseract-OCR开发环境操作步骤

之前在https://blog.csdn.net/fengbingchun/article/details/51628957 中描述过如何在Windows上搭建Tesseract-OCR开发环境&#xff0c;那时除了需要clone https://github.com/fengbingchun/OCR_Test 工程外&#xff0c;还需要依赖 https://github.com/fengbingchun/Liblept_T…

C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)

反射以及Attribute在ORM中的应用 一、 反射什么是反射&#xff1f;简单点吧&#xff0c;反射就是在运行时动态获取对象信息的方法&#xff0c;比如运行时知道对象有哪些属性&#xff0c;方法&#xff0c;委托等等等等。反射有什么用呢&#xff1f;反射不但让你在运行是获取对象…

Network | sk_buff

sk_buff结构可能是linux网络代码中最重要的数据结构&#xff0c;它表示接收或发送数据包的包头信息。它在中定义&#xff0c;并包含很多成员变量供网络代码中的各子系统使用。 这个结构被不同的网络层&#xff08;MAC或者其他二层链路协议&#xff0c;三层的IP&#xff0c;四…

吴恩达老师深度学习视频课笔记:深度学习的实用层面

训练、验证和测试数据集(training、development and test sets)&#xff1a;训练神经网络时&#xff0c;我们需要作出很多决策&#xff0c;如神经网络分多少层(layers)、每层含有多少个隐藏层单元(hidden units)、学习率(learning rates)、各层采用哪些激活函数(activation fun…

FtpCopy数据定时自动备份软件(FTP定时备份)

1. 软件说明 FtpCopy是一款免费的FTP数据自动备份软件&#xff0c;如果FtpCopy对您有较大的帮助&#xff0c;欢迎捐赠我们&#xff0c;我们对您表示衷心的感谢&#xff01; 如果有需求的话会一直更新下去&#xff0c;将软件做到极致&#xff01; 有问题可直接“反馈留言”。 特…

专注NLP,竹间智能完成4500万美元B+轮融资

近日&#xff0c;竹间智能在成立四周年之际宣布完成4500万美元B轮融资。本轮由某重要战略合作方、云晖资本及领沨资本联合领投&#xff0c;凯思博投资、众安资本、趋势资本、普华资本、一路资本跟投&#xff0c;光源资本担任本轮融资的独家财务顾问。竹间智能方面表示&#xff…

JDBC连接各种数据库方法

为什么80%的码农都做不了架构师&#xff1f;>>> 声明 以下内容收集自网络&#xff0c;并没有亲自测试可用性。 一、Oracle8/8i/9i数据库&#xff08;thin模式&#xff09; Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url&…

OpenCV支持中文字符输出实现

在 http://www.opencv.org.cn/forum.php?modviewthread&tid2083&extra&page1 中&#xff0c;作者给出了原始的在OpenCV中 支持中文字符的输入&#xff0c;原始的实现使用的是OpenCV的C接口&#xff0c;使用起来不怎么方便&#xff0c;这里对原作者的实现进行调整&…

CSDN”原力计划“在召唤:技术人请集结,用原创技术影响万千开发者

技术深不可测、薪资难以想象、着装招人吐槽、发量让人惊叹、笑点着实密集、情商令人堪忧......在这个你我他她它通过网络紧密互联、消息实时互通的 21 世纪&#xff0c;人们对身处技术至高点的程序员们仍然有着以上不接地气、呆板保守的误解&#xff0c;对此&#xff0c;操着一…

.asmx支持post请求或者get请求调用(WebService 因 URL 意外地以 结束,请求格式无法识别 的解决方法)...

使用Post调用以asmx形式提供的webservice时&#xff0c;在本机调试没有调用问题。一旦部署至服务器后会提示如下信息&#xff1a; <html><head><title>因 URL 意外地以“/GetCertByToken”结束&#xff0c;请求格式无法识别。</title><meta name&qu…

关于StartCoroutine的简单线程使用

StartCoroutine在unity3d的帮助中叫做协程&#xff0c;意思就是启动一个辅助的线程。 在C#中直接有Thread这个线程&#xff0c;但是在unity中有些元素是不能操作的。这个时候可以使用协程来完成。 使用线程的好处就是不会出现界面卡死的情况&#xff0c;如果有一次非常大量的运…

Robot Framework(十八) 支持工具

5支持工具 5.1库文档工具&#xff08;libdoc&#xff09; libdoc是一种用于为HTML和XML格式的测试库和资源文件生成关键字文档的工具。前一种格式适用于人类&#xff0c;后者适用于RIDE和其他工具。Libdoc也没有很少的特殊命令来显示控制台上的库或资源信息。 可以创建文档&…

基于开源TiRG的文本检测与提取实现

在 http://funkybee.narod.ru/ 中作者给出了文本检测和提取的实现&#xff0c;仅有一个.hpp文件&#xff0c;为了在windows上编译通过&#xff0c;这里简单进行了改动&#xff0c;改动后的code如下&#xff1a; #include <math.h> #include <stdio.h> #include &l…

Kaggle Days首次落地中国,日本团队拿下冠军

2019 年 10 月 20 日&#xff0c; 为期两天的 Kaggle Days 中国活动在北京圆满结束。作为全球最知名的线下数据科学活动在中国的首次落地&#xff0c;Kaggle Days 获得了谷歌、Kaggle 以及 16 位来自美国、俄罗斯、捷克、日本以及中国的 Kaggle Grandmaster 以及 Master 的大力…

《WF编程》笔记目录

《WF编程》笔记目录

activity的四种加载模式

在android里&#xff0c;有4种activity的启动模式&#xff0c;分别为&#xff1a; standard, singleTop, singleTask和singleInstance, 其中standard和singleTop类似&#xff0c; singleTask和singleInstance类似&#xff0c; 用法如下&#xff1a; (1).standard和singleTop 这…

吴恩达老师深度学习视频课笔记:优化算法

优化算法能够帮助你快速训练模型。mini-batch梯度下降法&#xff1a;把训练集分割(split)为小一点的子训练集&#xff0c;这些子集被叫做mini-batch。batch梯度下降法指的是&#xff1a;同时处理整个训练集&#xff0c;只有处理完整个训练集才更新一次权值和偏置。并且预期每次…

程序员编程时戴耳机是在听什么?

1024程序员节&#xff0c;CSDN旗下的码书商店为程序员放个“价”&#xff0c;全场所有书籍8折&#xff0c;电子产品可以拥有大额优惠券&#xff0c;购买前可加文末客服微信领取优惠券哦。兰士顿耳机&#xff0c;原价199元&#xff0c;1024专属价159元&#xff0c;购买时候请输入…

Mac中MacPorts安装和使用

文章转载至http://www.zikercn.com/node/8 星期四, 06/07/2012 - 19:02 — 张慧敏 MacPorts简单介绍 MacPorts&#xff0c;以前叫做DarwinPorts&#xff0c;是一个软件包管理系统&#xff0c;用来简化Mac OS X和Darwin操作系统上软件的安装。它是一个用来简化自由软件/开放源码…

小白入门:我是如何学好机器学习的?

作者 | Jae Duk Seo译者 | Tianyu编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;在我看来&#xff0c;机器学习是一个计算机科学和数学知识相融合的研究领域。虽然这是个很有趣的领域&#xff0c;但它其实没有想象中那么难。我相信只要你有足够的动力、…

数据库服务器 之 PostgreSQL数据库的日常维护工作

来自&#xff1a;LinuxSir.Org摘要&#xff1a;为了保持所安装的 PostgreSQL 服务器平稳运行, 我们必须做一些日常性的维护工作。我们在这里讨论的这些工作都是经常重复的事情&#xff0c; 可以很容易地使用标准的 Unix 工具&#xff0c;比如cron 脚本来实现; 目录1. 综述&…

吴恩达老师深度学习视频课笔记:超参数调试、Batch正则化和程序框架

Tuning process(调试处理)&#xff1a;神经网络的调整会涉及到许多不同超参数的设置。需要调试的重要超参数一般包括&#xff1a;学习率、momentum、mini-batch size、隐藏单元(hidden units)、层数、学习率衰减。一般对于你要解决的问题而言&#xff0c;你很难提前知道哪个参数…

AD上删除了Exchange容器,再重装时报'找不到企业组织容器

AD上删除了Exchange容器,再重装时报找不到企业组织容器。安装日志如下:[06/16/2014 04:58:15.0054] [0] **********************************************[06/16/2014 04:58:15.0054] [0] Starting Microsoft Exchange Server 2013 Service Pack 1 Setup[06/16/2014 04:58:15.0…

实战:基于OpenPose的卡通人物可视化 | CSDN博文精选

作者 | Wuzebiao2016来源 | CSDN博客前言去年打算用些现成的Pose做些展示&#xff0c;因为以前有在OpenPose做些识别等开发工作&#xff0c;所以这次我就简单在OpenPose上把骨架用动画填充上去&#xff0c;关于能够和人动作联系起来的动画&#xff0c;我找到了Unity提供的示例A…