分类
ASRT 后端开发 智能语音技术 机器学习及应用

ASRT:一个中文语音识别系统

ASRT是一套基于深度学习实现的语音识别系统,全称为Auto Speech Recognition Tool,由AI柠檬博主开发并在GitHub上开源(GPL 3.0协议)。本项目声学模型通过采用卷积神经网络(CNN)和连接性时序分类(CTC)方法,使用大量中文语音数据集进行训练,将声音转录为中文拼音,并通过语言模型,将拼音序列转换为中文文本。算法模型在测试集上已经获得了80%的正确率。基于该模型,在Windows平台上实现了一个基于ASRT的语音识别应用软件,取得了较好应用效果。这个应用软件包含Windows 10 UWP商店应用和Windows 版.Net平台桌面应用,也一起开源在GitHub上了。

(在苹果系统下,如果文章中的图片不能正常显示,请升级Safari浏览器到最新版本,或者使用Chrome、Firefox浏览器打开。)

ASRT是一套基于深度学习实现的语音识别系统,全称为Auto Speech Recognition Tool,由AI柠檬博主开发并在GitHub上开源(GPL 3.0协议)。本项目声学模型通过采用卷积神经网络(CNN)和连接性时序分类(CTC)方法,使用大量中文语音数据集进行训练,将声音转录为中文拼音,并通过语言模型,将拼音序列转换为中文文本。算法模型在测试集上已经获得了80%的正确率。基于该模型,在Windows平台上实现了一个基于ASRT的语音识别应用软件,取得了较好应用效果。这个应用软件包含Windows 10 UWP商店应用和Windows 版.Net平台桌面应用,也一起开源在GitHub上了。

ASRT项目主页:

https://asrt.ailemon.net

ASRT项目文档:

https://asrt.ailemon.net/docs/

GitHub项目地址:

语音识别核心系统

https://github.com/nl8590687/ASRT_SpeechRecognition

语音识别客户端应用

Windows桌面版 https://github.com/nl8590687/ASRT_SpeechClient_WPF

Windows 10 UWP版 https://github.com/nl8590687/ASRT_SpeechClient_UWP

Java Web版 https://github.com/nl8590687/ASRT_SpeechClient_JavaWeb

Python SDK
https://github.com/nl8590687/ASRT_SDK_Python3

近年来,深度学习在人工智能领域兴起,其对语音识别也产生了深远影响,深层的神经网络逐步替代了原来的GMM-HMM模型。在人类的交流和知识传播中,大约 70% 的信息是来自于语音。未来,语音识别将必然成为智能生活里重要的一部分,它可以为语音助手、语音输入等提供必不可少的基础,这将会成为一种新的人机交互方式。因此,我们需要让机器听懂人的声音。

我们的语音识别系统的声学模型采用了深度全卷积神经网络,直接将语谱图作为输入。模型结构上,借鉴了图像识别中效果最好的网络配置VGG,这种网络模型有着很强的表达能力,可以看到非常长的历史和未来信息,相比RNN在鲁棒性上更出色。在输出端,这种模型可以和CTC方案可以完美结合,以实现整个模型的端到端训练,将声音波形信号直接转录为中文普通话拼音序列。在语言模型上,通过最大熵隐含马尔可夫模型,将拼音序列转换为中文文本。并且,为了通过网络提供服务给所有的用户,本项目还使用了Python的HTTP协议基础服务器包,提供基于网络HTTP协议的语音识别API,客户端软件通过网络,调用该API实现语音识别功能。

目前,该语音识别系统在考虑朝着语音识别框架方向发展,以方便研究人员随时上手研究新模型,使用新数据集等。

系统的流程

特征提取  将普通的wav语音信号通过分帧加窗等操作转换为神经网络需要的二维频谱图像信号,即语谱图。

声学模型  基于Keras和TensorFlow框架,使用这种参考了VGG的深层的卷积神经网络作为网络模型,并训练。

CTC解码  在语音识别系统的声学模型的输出中,往往包含了大量连续重复的符号,因此,我们需要将连续相同的符合合并为同一个符号,然后再去除静音分隔标记符,得到最终实际的语音拼音符号序列。

语言模型  使用统计语言模型,将拼音转换为最终的识别文本并输出。拼音转文本的本质被建模为一条隐含马尔可夫链,这种模型有着很高的准确率。(其原理请看:https://blog.ailemon.net/2017/04/27/statistical-language-model-chinese-pinyin-to-words/

基于HTTP协议的API接口

本项目使用了Python内置的http.server包来实现了一个基础的基于http协议的API服务器。通过将声学模型和语言模型连接起来,使用该服务器程序,可以直接实现一个简单的API服务器,通过POST方式进行数据交互。

这是POST参数列表:

参数名 说明
token 服务器对连接的客户端进行认证用的口令,避免其被非法调用
fs 指示传送的wav波形信号的频率是多少,单位:Hz
wavs 一个包含了全部语音波形信号的列表

客户端

本项目的客户端分为两种,均为Windows客户端,一个是UWP客户端,另一个是WPF客户端,源码均需要使用VS2017来开发和编译,使用C#和XAML编写。项目包含有界面逻辑和录音模块、语音识别API调用模块,并包含对wav文件的raw格式进行的解析。

客户端通过自动控制录音的中断时间、两个录音模块连续交替录音,以及异步发送请求操作,最终按照先后顺序将返回结果显示在界面的文本框中,实现了长时间连续语音识别的功能。

未来

未来的ASRT,还要加入针对说话人进行识别的功能,也就是做一个说话人识别系统,用来实现AI的“认主”行为,让AI知晓现在是谁在说话,这将是AI实际应用时很多场景下会面临的一个问题。不过这个项目截至发稿前,暂时还没有动工,有感兴趣的小伙伴欢迎提前关注一波~

ASRT项目主页:

https://asrt.ailemon.net

ASRT项目文档:

https://asrt.ailemon.net/docs/

GitHub项目地址:

语音识别核心系统

https://github.com/nl8590687/ASRT_SpeechRecognition

语音识别客户端应用

Windows桌面版 https://github.com/nl8590687/ASRT_SpeechClient_WPF

Windows 10 UWP版 https://github.com/nl8590687/ASRT_SpeechClient_UWP

Java Web版 https://github.com/nl8590687/ASRT_SpeechClient_JavaWeb

Python SDK
https://github.com/nl8590687/ASRT_SDK_Python3

说话人识别系统

https://github.com/nl8590687/ASRT_SpeakerRecognition

有兴趣的欢迎加入我们的交流QQ群:AI柠檬博客群
2群群号:894112051 
1群群号:867888133 (即将满员)

加微信群请先加AI柠檬博主微信号:ailemon-me ,并注明“来自AI柠檬博客”“ASRT语音识别”等字样,之后会拉您入群。
欢迎大家的加入~

 

AI柠檬博客QQ群 2群
AI柠檬博客QQ群 1群(即将满员)
AI柠檬微信号
版权声明
本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。
本文地址: https://blog.ailemon.net/2018/08/29/asrt-a-chinese-speech-recognition-system/
All articles are under Attribution-NonCommercial-ShareAlike 4.0

关注“AI柠檬博客”微信公众号,及时获取你最需要的干货。


“ASRT:一个中文语音识别系统”上的29条回复

博主您好,感谢您的分享,github已star,我想请问一下有基于这个项目的论文可以瞻仰一下吗,谢谢博主。

请问为什么我训练了一遍,然后测试一下,错误率100%啊,是要重复训练好几遍吗?

博主您好,请问您在训练过程中,中文用到了哪些公开的数据集呢

最开始只用了THCHS30,后来还用了ST-CMDS这个,这些数据集都可以在openslr上下载到,博客另一篇列举了这些开源数据集的文章有这些数据集的链接,可以在热门文章TOP10里面找到,可以看一下。

博主您好,我参考了您 github 上的原码 SpeechModel251.py 。输入层是 200*1600 的 features,输出层 为1424维的向量,想请问博主输出层的1424维向量,实质代表什么呢 ?
若输入是以每一帧(frame)音讯为基础(及200维)每一次的output 为1424 为我还好理解,即是每一帧对于1424种label的概率分布,但是博主模型的输入却是200*1600的2D features,小弟有点不解如何解释那output的1424维的向量。
还恳请博主解惑!

输出层的1424维向量是1424个拼音类别,输出是从输入的1600映射到输出的200的时间步乘上1424维拼音类别的二维张量,跟输入在维度上是对应的,输入是1600时间步乘以200特征维度。

谢博主详细的回答,不知道博主在训练的过程中有没有使用什么中文字转拼音的工字一字多音的问题还是还是博主资料的资料集。

再次谢谢博主,
祝研究顺利!

柠檬博主你好,首先,真的非常感谢您将这么多的研究成果开源,这一定能帮到数不清刚踏入 ASR 领域的人。在此我有一些问题还希望能得到您的回覆:
1. 请问目前准确率的 80% 是指 Acoustic (Speech) Model 转换音码的正确率,还是指 HMM 后文本的正确率?如果是后者,想请问您 Acoustic (Speech) Model 的正确率为何?
2. 想请教目前的 HMM (Language Model) 是用多少的文本资料训练,才能有这么好的效果呢?

80%是声学模型的准确率,后续的HMM语言模型前后一直使用的是同一个,所以这里所说的都是声学模型的准确率。
HMM语言模型的话是我从中文新闻站点爬取的数万篇新闻文本生成的,目前的效果还可以。

亲爱的博主您好,谢谢您百忙中回覆。
小弟还想再向您确认以下:
1. HMM 的输入应该是「中文音码」输出为「中文文本」对吗?相较传统的 GMM-HMM approach,博主您的做法是将本来由 GMM 把音讯转到音码的部分换成以 CNN + GRU w/ CTC 来做对吧?不知道小弟理解是否有误。

2. 博主目前的 HMM 训练是以中文字(character)为单位做输出吗?还是有加入词(term)的概念?不知道能否拜托博主提供语言模型训练的范例,小弟困惑 HMM 这东西在 ASR 中的角色许久了

再次叩谢博主的回覆!
谢谢!

那么我如果做方言识别,我是不是要自己另搞一个HMM模型?

第一点是对的,关于那个HMM原理和作用,可以参考这篇文章:https://blog.ailemon.net/2017/04/27/statistical-language-model-chinese-pinyin-to-words/
生成这个HMM的请看这篇文章:https://blog.ailemon.net/2017/02/20/simple-words-frequency-statistic-without-segmentation-algorithm/

柠檬博主,谢谢您的解答。
研究有成我会再回来与您分享的。
还希望未来有问题还能继续找您讨论。

谢谢!

我自己其实一直使用的是普通的PC计算机和安卓手机用的线控耳机,确实有些噪声,但是对识别率影响不大,可以放心用。如果要追求音质的话,麦克风阵列是最好的,但是成本高,一般场景下不太可能使用。

可能是因为您的语音数据格式有问题,也有可能是录音设备硬件和驱动、软件调用的接口有问题,或者录音中的噪声太大等,很多细节有问题都会导致识别不出来,需要逐一排查一下问题。

非常感谢博主的工作!
我认为目前的ASRT对于deep learning based Chinese ASR的科研工作者来说是一个非常好的实验平台。基于Keras, Tensorflow和Python使修改、测试不同的模型变得很方便,数据库也是使用公开数据库。
同时我也注意到ASRT中包含HTTP server和不同平台下的示例client。如果ASRT将来考虑要在生产中被使用,现在的ASRT的性能可能是个问题。首先,python相比C++或者C,在做一个ASR服务器时相差感觉还是比较多?尤其如果要做audio streaming的时候。其次的话,在github issue中也有人提到,构建WFST的decoding graph会比较快。另外,现在的online decoding用的是两个录音模块交替进行的方式,算是一种比较hack的方式,感觉还是要实现真正的audio streaming与online decoding。
希望ASRT能做成比Kaldi,HTK优秀的deep learning语音识别库。

嗯嗯好的,非常感谢您提的建议,我之后将会根据大家的反馈,从对各方面,逐渐改善ASRT系统,使得其变得更好。
而且,API Server性能目前也确实是一个需要考虑的问题,之后我会研究研究如何提高其表现。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

11 − 8 =

如果您是第一次在本站发布评论,内容将在博主审核后显示,请耐心等待