ASRT语音识别系统 文档

常见问题
  • Last Edit by AI柠檬
  • 2020-07-22 19:18:18
## 常见问题 ### 环境安装和配置 ##### **为了加速计算,如何安装GPU版TensorFlow包** TensorFlow支持使用GPU来加速计算,需要安装Cuda驱动和cudnn计算API,详细过程请看这篇文章: [Linux系统下安装TensorFlow的GPU版本](https://blog.ailemon.me/2017/06/06/install-tensorflow-gpu-on-ubuntu-linux/) [在多平台上安装TensorFlow的方法](https://blog.ailemon.me/2017/05/21/install-tensorflow-on-muti-platform/) ##### **训练模型用工作站的建议配置** 最低:4x CPU, 1x GPU (NVIDIA), RAM 16GB, Graph Memory 11GB 建议:4x CPU, 1x GPU (NVIDIA), RAM 32GB, Graph Memory 12GB 以上 ##### **服务端API服务器部署的建议配置** 最低:1x CPU (Intel), 1 GB RAM 建议:2x CPU (Intel), 4 GB RAM 以上 ### 运行报错(包括训练和测试时) ##### **开始训练模型时,出现大量输出,最终提示:ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[64]之类** 这个是计算机的运行存储资源不足导致的,OOM即为Out of Memory,意为存储空间不足,通常在使用GPU训练模型时,只有2GB等小显存的情况下出现,在CPU训练的情况下内存不足会出现计算机系统卡死的情况。解决方案是,增加显存容量,使用显存较大的GPU,或者多GPU并行计算。本项目推荐显存大小为每个单GPU在8GB-12GB或以上。 ##### **训练模型过程中出现报错:InvalidArgumentError: Not enough time for target transition sequence** 这个是音频对应的标签输入的时间维长度过长(即字数/拼音数太多),或者神经网络输出的时间维的长度过短(长度太短以至于不能表示对应的数据标签中的内容)导致的。根据"采样定律"(雾),应该让神经网络的输出长度大于标签长度的2倍(根据CTC解码的原理),为最适宜。作者自己设计的模型就满足这个条件。 ##### **模型编译成功,但是一训练就报错,提示InvalidArgumentError** 首先请检查数据的输入格式,尤其是使用有自己生成的数据文件时,一切格式以仓库中 ` datalist/ ` 目录下的文件格式和根目录下的 ` dict.txt ` 文件的格式为准。 [参考issue](https://link.ailemon.me/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/5) 其次,请确认安装的TensorFlow和Keras的版本是否对应,如果不清楚,硬件条件如果支持(比如CUDA9.0)的话,请直接全部安装最新版本。 ##### **模型编译成功,但是一训练就报错,提示OSError: Unable to open file,No such file or directory** 请检查是不是 ms.LoadModel() 中指定的加载保存好的模型文件名路径不存在,当这个文件不存在时会触发错误。还需要注意一下python在windows系统和linux系统上文件路径字符串在表示上的区别,是用` '/' `还是` '\\' `等,以及,linux系统对文件路径区分大小写,也就是说A11_183.WAV和A11_183.wav是不一样的,但是在Windows系统下,这两个却是指向一样的文件,所以,应该避免同一个字母不同大小写的文件名。 [参考issue](https://link.ailemon.me/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/12) [参考issue](https://link.ailemon.me/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/15) 另外,如果是`OSError: Unable to create file (unable to open file: name = 'model_speech/m251/speech_model251_e_0_step_500.model', errno = 2, error message = 'No such file or directory', flags = 13, o_flags = 242)`这类的错误,在训练模型(如m251模型)的时候,需要在model_speech/目录下使用mkdir创建一个名为m251的目录,然后就好了。 [参考issue](https://link.ailemon.me/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/59) ##### **一运行就提示cannot import module xxx / ModuleNotFoundError: No module named xxx** 请检查python依赖库是否全部安装成功,如果存在没有安装成功的库,请手动安装。 . ##### **训练一个批次之后出现报错** 请检查保存模型的路径是否存在,是否有`model_speech`这个目录,或者,如果代码中保存模型的路径还包含了“m22”“m24”“m25”等文本,请检查这个目录下是否有对应文本的目录路径名称,比如,是否有`model_speech/m22`这个路径。 . ##### **训练过程中突然出错,找不到某wav文件,提示FileNotFoundError: [Errno 2] No such file or directory** 请确保文件列表和数据标签与数据集中的wav文件名和存储路径相对应,如果用到了自己生成的文件,请务必保证这一点。 [参考issue](https://link.ailemon.me/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/13) ##### **训练刚开始或者一批次刚结束时突然出错,提示UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3: ordinal not in range(128)** 一般来说是这类代码引起的: ` print('[*\u63d0\u793a] \u521b\u5efa\u6a21\u578b\u6210\u529f\uff0c\u6a21\u578b\u7f16\u8bd1\u6210\u529f') ` 我们可以看到程序出现了乱码,这是因为机器默认不支持UTF-8编码的字符集而是使用了ascii之类其他编码导致的,实际代码应该类似于这样: ` print('[*提示] 创建模型成功,模型编译成功') ` 解决方案:将中文换成英文,或者让系统支持UTF-8编码的字符集。 ##### **程序一运行就提示“xxx程序已停止工作”或者“非法指令(核心已转储)”** 这应该是tensorflow和CPU的锅,tf默认编译的是通用指令集,在大部分计算机上都可以正常运行,但是唯独当前的CPU连这种通用指令集都不支持,所以解决办法就是自己手动编译一个tensorflow吧。或者也可以直接使用GPU版的tensorflow试试,前提是要有Nvidia的GPU。 ##### **程序运行时报错,提示有“theano.xxx.xxx”** 这应该是您的Keras后端使用的是Theano的原因,请使用TensorFlow作为Keras的后端来运行。本项目需要使用TensorFlow作为Keras的后端backend,而不是Theano,请安装TensorFlow并将Keras切换到TF后端,程序即可正常运行。 [参考issue](https://link.ailemon.me/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/17) ##### **运行asrserver.py文件出现报错 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcd in position 0: invalid continuation byte** 据QQ群群友反馈,出现这个问题是因为计算机名字中有中文,改成英文或者数字就可以了。根据描述应该与中文编码问题有关。 ##### **程序运行时报错,提示类似“ValueError: could not broadcast input array from shape (2928,200,1) into shape (1600,200,1)”的报错信息** 这是因为ASRT一次识别,最大支持的录音长度为16秒,在当前情况下,shape中的1600对应16秒长度,2928则是29秒280毫秒的长度,超出了最大限制,所以肯定是会报错的。建议是切分为16秒一下的小段,然后再运行程序。 ## 训练时状态异常 ##### **训练模型一段时间后,由于内存不足,训练程序被kill** 这个是作者(我)的锅,程序可能存在一定的内存泄露的情况,目前暂时无法定位导致内存泄露的代码位置,在小内存的情况下可能会出现,目前解决方案是增大内存容量即可。跑深度学习的机器一般来说内存配置都是足够大的(我见过的最大的机器有200+GB内存,RAM),这点问题一般不会有什么影响。 ##### **训练模型时,一开始错误率为100%,然后突然变为0%,然后再100%和0%两个极端震荡,最后永远变为0%** 这个应该时训练时,测试函数的数值精度问题导致的,简单说就是,这个项目使用的是Python3编写的,这种情况就是在Python2上运行导致的,在Python2上运行会出现一些奇怪的问题,本项目不支持即将退休的Python2,请各位直接转战到Python3吧。 这个问题最先出现的时间比较早,但是持续了很长时间才发现问题所在,因为作者一直使用3,大多数网友也是,所以一直没遇到过,结果有个别网友使用的是2,直到他自己意识到这个问题才发现是Python2的锅。这个问题的原理就是,Python3的`1/2=0.5`,但是Python2中`1/2=0`,向下取整了,虽然最后看到的是错误率0%,但是这是假象,实际情况是并不是0%,而是中间的某一个数,然后丢失了精度。 [参考issue](https://link.ailemon.me/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/10) ### 其他 ##### **语音模型直接识别出来的是汉语拼音,能不能转为汉字** 语音模型是使用汉语拼音作为模型的输出的,如果需要转为汉字,还需要语言模型,仓库中的 `LanguageModel.py` 就是用来做这件事的,可以实现从拼音转为汉字。` test.py `文件包含了这整个一套的过程,可以实现从wav声音文件或序列,到最终的汉字。 ##### **自己电脑比较渣,在哪里可以下载作者已经训练好的模型** 本项目已经预发布了若干个版本的完整软件,可以在Github本仓库下[releases](https://github.com/nl8590687/ASRT_SpeechRecognition/releases)里面的发布的软件的压缩包`ASRT_vxx.xx.zip`里获得完整源程序,包含有已经训练好的模型,每个版本具体使用到的模型都有说明,发布的版本基本上有着不错的语音识别字准确率。 ##### **如何使用多GPU进行模型的训练** 在本项目的general_function中包含一个muti_gpu模块,这个模块可以实现多GPU并行计算,可以加速计算和扩展显存空间。 调用方式: ``` from general_function.muti_gpu import * ... NUM_GPU = 2 ... model.build((self.AUDIO_LENGTH, self.AUDIO_FEATURE_LENGTH, 1)) model = ParallelModel(model, NUM_GPU) ... model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer = ada_d) ``` [参考issue](https://link.ailemon.me/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/18) ##### **我的录音音质不是ASRT所采用的标准音质,如何将其进行转换?** 可以使用ffmpeg来实现,ffmpeg可以重采样,在音视频领域都可以使用它来进行操作。另外,sox也可以。 样例: ``` ffmpeg -i input.wav -ac 1 -ar 16000 output.wav ``` ``` sox -r 44200 input.wav -r 16000 output.wav ``` 感谢网友们提供的帮助。 ##### **为什么代码种删掉了LSTM层,这是出于什么考虑** 就是为了设计一种模型的结构而已,没什么考虑不考虑的。~~别问,问就是我偏要删掉~~(手动狗头) 为什么一定要用LSTM呢?这一点我其实一直都很好奇,希望大家不要被条条框框束缚,别问什么会不会效果更好,只有**实践才是检验真理的唯一标准**。 不过本项目仓库中,还是有用到循环层(GRU)的模型,比如m26和m261,大家都可以试试。~~(并不真香)~~ ##### **模型训练时能暂停保存,之后再接着训练吗** 模型会定期在指定迭代步数到达之后自动保存,比如设置为500时,每迭代500次就会自动保存一次最新的模型参数文件,下次接着训练时,重新加载最后保存的模型继续训练即可。在模型训练的代码中可以看到有LoadModel()函数,修改参数中的文件路径为要加载的模型参数文件路径即可。在测试模型效果的时候也是同理。 ##### **ASRT支持采样率为8kHz的音频吗** 目前暂不支持,如果有8kHz的音频识别需求请自行使用转码工具将音频转为16kHz后再训练和识别。如果目标使用场景下的数据全部为8kHz采样率,且有大量已标注的训练数据的话,可以考虑自行使用8kHz音频数据进行训练并使用。代码也需对应改为支持8kHz音频,需要修改的地方有:升学特征提取部分,加载数据时使用的numpy数组的维度,声学模型的升学特征维度。 ##### **ASRT支持中文方言(或英语、俄语、法语以及多语种混合等)的识别吗** 不支持,ASRT目前的设计为纯中文的语音识别,仅支持标准的中文普通话识别,其他方言或语种请自行修改代码和训练。如有需要帮助修改代码请联系AI柠檬博主。 ##### **ASRT如何指定使用CPU或者GPU运行** 安装CPU版TensorFlow的话,就只会使用CPU运行,不会使用GPU运行。如果正确安装了GPU版TensorFlow及其依赖的运行环境(GPU驱动/CUDA/cuDNN),就默认会使用GPU运行。在有GPU环境和安装了GPU版TF的情况下,不改变运行环境而使用纯CPU运行的话,需要在 `os.environ["CUDA_VISIBLE_DEVICES"]` 处,将值设置为不存在的GPU设备编号,比如`-1`等。 ##### **ASRT的运行在什么情况下会停止** ASRT在训练模型的时候默认是循环运行的,也就是说如果没有外力发命令停止运行是不会停止的。外力包含但不限于按Ctrl + C发送停止运行的信号,或者在基于提交作业队列自动调度的系统上设定的运行时间到了。由于模型是会自动定期保存的,当需要停止运行的时候,在直接操作服务器的情况下,直接按Ctrl +C停止运行即可,在其他使用作业队列的云计算平台上直接停止该道作业的执行即可。 其他未提及的问题请加入QQ群“AI柠檬博客群”进行交流讨论,群号见本文档首页,亦可发送邮件联系。