ASRT语音识别系统 文档

常见问题
  • Last Edit by AI柠檬
  • 2021-03-07 19:46:16
## 常见问题 ### 环境安装和配置 ##### **为了加速计算,如何安装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/) [linux卸载旧版CUDA并安装新版CUDA](https://blog.ailemon.me/2019/10/28/linux-remove-old-cuda-and-install-new-cuda/) [Windows安装CUDA和CUDNN运行环境](https://blog.ailemon.me/2020/07/27/windows-install-cuda-and-cudnn-environment/) ##### **训练模型用工作站的建议配置** 最低: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.net/?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.net/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/12) [参考issue](https://link.ailemon.net/?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.net/?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.net/?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.net/?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秒一下的小段,然后再运行程序。 ##### **程序运行后报错:`AttributeError: 'str' object has no attribute 'decode'`** 经过测试,在当前条件下,直接安装tensorflow和keras的上述指定版本时,默认安装的h5py最新版本与此时的tensorflow和keras包不兼容,需要手动指定安装的版本号,2.10.0和2.8.0都是适用于当前版本ASRT软件的python依赖包版本。 如果出现了诸如` 'str' object has no attribute 'decode' `报错信息,请手动pip安装指定版本的h5py依赖库。 ##### **程序运行后报错:`ModuleNotFoundError: No module named 'keras.backend.tensorflow_backend', 'keras.backend' is not a package`** 这是由于安装的TensorFlow和Keras版本不对应造成的。当您使用ASRT时,安装运行环境等操作,请严格按照本文档中列出的内容和教程来做,不要想当然。 * [ASRT项目文档:程序运行依赖环境](/docs/dependent-environment) * [教你如何使用ASRT训练中文语音识别模型](https://blog.ailemon.me/2020/08/20/teach-you-how-use-asrt-train-chinese-asr-model/) * [教你如何使用ASRT部署中文语音识别API服务器](https://blog.ailemon.me/2020/08/27/teach-you-how-use-asrt-deploy-chinese-asr-api-server/) ### 训练时状态异常 ##### **训练模型一段时间后,由于内存不足,训练程序被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.net/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/10) ##### ** 程序运行一段时间后报错,包含有 `ValueError:generator already executing` 和 `RuntimeError: Your generator is Not thread-safe.` 等字样的报错信息 ** 这种报错出现是因为使用的数据集的数据量较小,或者机器运算速度过快,导致出现在多线程并发或并行时的线程不安全的问题。AI柠檬博客中曾发布过这种问题发生的原理的介绍文章和对针对python数据生成器进行处理的解决方案文章: * 原理:[通过同步和加锁解决多线程的线程安全问题](https://blog.ailemon.me/2019/05/15/solving-multithreaded-thread-safety-problems-by-synchronization-and-locking/) * 解决方案:[为Keras包装一个线程安全的数据生成器](https://blog.ailemon.me/2019/05/20/a-thread-safety-warped-generator-for-keras/) ### 模型训练或测试相关问题 ##### **如何使用多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.net/?target=https://github.com/nl8590687/ASRT_SpeechRecognition/issues/18) ##### **模型训练时能暂停保存,之后再接着训练吗** 模型会定期在指定迭代步数到达之后自动保存,比如设置为500时,每迭代500次就会自动保存一次最新的模型参数文件,下次接着训练时,重新加载最后保存的模型继续训练即可。在模型训练的代码中可以看到有LoadModel()函数,修改参数中的文件路径为要加载的模型参数文件路径即可。在测试模型效果的时候也是同理。 ##### **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停止运行即可,在其他使用作业队列的云计算平台上直接停止该道作业的执行即可。 ##### **ASRT的训练和测试能否使用超过16秒的录音音频** 进行训练和测试的时候不能使用超过16秒的,因为你的机器的内存或显存大概率是不够用的,太长时间的音频只会加大内部存储空间的开销。建议在实际使用的时候,采用音频分割的方法进行识别,一次识别短于16秒就可以。在训练的时候,如果有时间过长的音频,可采用删除忽略或人为切分等方法处理。 ### 数据相关问题 ##### **我的录音音质不是ASRT所采用的标准音质,如何将其进行转换?** 可以使用ffmpeg来实现,ffmpeg可以重采样,在音视频领域都可以使用它来进行操作。另外,sox也可以。 样例: ``` ffmpeg -i input.wav -ac 1 -ar 16000 output.wav ``` ``` sox -r 44200 input.wav -r 16000 output.wav ``` 感谢网友们提供的帮助。 ##### **ASRT支持采样率为8kHz的音频吗** 目前暂不支持,如果有8kHz的音频识别需求请自行使用转码工具将音频转为16kHz后再训练和识别。如果目标使用场景下的数据全部为8kHz采样率,且有大量已标注的训练数据的话,可以考虑自行使用8kHz音频数据进行训练并使用。代码也需对应改为支持8kHz音频,需要修改的地方有:升学特征提取部分,加载数据时使用的numpy数组的维度,声学模型的升学特征维度。 ##### **ASRT支持中文方言(或英语、俄语、法语以及多语种混合等)的识别吗** 不支持,ASRT目前的设计为纯中文的语音识别,仅支持标准的中文普通话识别,其他方言或语种请自行修改代码和训练。如有需要帮助修改代码请联系AI柠檬博主。 ### 其他 ##### **语音模型直接识别出来的是汉语拼音,能不能转为汉字** 语音模型是使用汉语拼音作为模型的输出的,如果需要转为汉字,还需要语言模型,仓库中的 `LanguageModel.py` 就是用来做这件事的,可以实现从拼音转为汉字。` test.py `文件包含了这整个一套的过程,可以实现从wav声音文件或序列,到最终的汉字。 ##### **自己电脑比较渣,在哪里可以下载作者已经训练好的模型** 本项目已经预发布了若干个版本的完整软件,可以在Github本仓库下[releases](https://github.com/nl8590687/ASRT_SpeechRecognition/releases)里面的发布的软件的压缩包`ASRT_vxx.xx.zip`里获得完整源程序,包含有已经训练好的模型,每个版本具体使用到的模型都有说明,发布的版本基本上有着不错的语音识别字准确率。 ##### **为什么代码种删掉了LSTM层,这是出于什么考虑** 就是为了设计一种模型的结构而已,没什么考虑不考虑的。~~别问,问就是我偏要删掉~~(手动狗头) 为什么一定要用LSTM呢?这一点我其实一直都很好奇,希望大家不要被条条框框束缚,别问什么会不会效果更好,只有**实践才是检验真理的唯一标准**。 不过本项目仓库中,还是有用到循环层(GRU)的模型,比如m26和m261,大家都可以试试。~~(并不真香)~~ ##### **readdata里面有一行代码中,`data_input.shape[0] // 8`是什么意思** 这个问题被问了太多遍了。。。严格来讲这个问题并不是一个通用的常见问题,只不过当前代码这样写,它刚好就是这样。这个问题属于深度学习中的基础问题,跟卷积神经网络的卷积层和池化层原理有关,不知道为什么要除以8的话,建议去网易云课堂上看一看吴恩达的深度学习工程师课程视频。 言归正传,简单说,它当前除以8是因为神经网络输入的尺寸从1600经过卷积池化网络(主要是三次步长为2的2x2池化的原因)后,尺寸变为200,大小降到了8分之一。如果只有一次步长为2的2x2池化那就是除以2了,同理两次就是除以4了,如果是四次步长为2的2x2池化的话,那应该是多少?对没错,相信聪明的你应该猜出答案了! ------ 其他未提及的问题请加入QQ群“AI柠檬博客群”进行交流讨论,群号见本文档首页,亦可发送邮件联系。