1. 模型训练或测试相关问题

1) 如何使用多GPU进行模型的训练

由于tensorflow框架的迭代速度较快,代码更新难度较大,本项目旧版的多GPU加速功能已经不可用,暂时去除,将来也许会继续支持。

2) 模型训练时能暂停保存,之后再接着训练吗

模型会定期在指定epoch数到达之后自动保存,原理为判断 epoch % n == 0True还是False,结果为True时会触发自动保存。
比如设置为1时,每迭代1次就会自动保存一次最新的模型参数文件,下次接着训练时,重新加载最后保存的模型继续训练即可。在模型训练的代码中可以看到有LoadModel()函数,修改参数中的文件路径为要加载的模型参数文件路径即可。在测试模型效果的时候也是同理。

3) ASRT如何指定使用CPU或者GPU运行

安装CPU版TensorFlow的话,就只会使用CPU运行,不会使用GPU运行。如果正确安装了GPU版TensorFlow及其依赖的运行环境(GPU驱动/CUDA/cuDNN),就默认会使用GPU运行。在有GPU环境和安装了GPU版TF的情况下,不改变运行环境而使用纯CPU运行的话,需要在 os.environ["CUDA_VISIBLE_DEVICES"] 处,将值设置为不存在的GPU设备编号,比如-1等。

4) ASRT的训练和识别时能否使用超过16秒的录音音频

进行训练和测试的时候不能使用超过16秒的音频片段,因为你的机器的内存或显存大概率是不够用的,太长时间的音频只会加大内部存储空间的开销。
如果要识别长度超过16秒的音频或文件,建议在实际使用的时候,采用音频分割的方法进行切分后再识别,一次用于识别的片段短于16秒就可以。在训练的时候,如果有时间过长的音频,可采用删除、忽略该条数据或人为处理进行再次切分等方法。

否则会出现诸如“ValueError: could not broadcast input array from shape (2928,200,1) into shape (1600,200,1)”的报错信息

2. 数据相关问题

1) 我的录音音质不是ASRT所采用的标准音质,如何将其进行转换?

可以使用ffmpeg来实现,ffmpeg可以重采样,在音视频领域都可以使用它来进行操作。另外,sox也可以。

样例:

    ffmpeg -i input.wav -ac 1 -ar 16000 output.wav

另有网友反映上述命令默认情况下会给wav音频文件header带有额外的junk区块,使得其长度变长,而不是统一的最小的44个字节的header,很多现有的相关依赖库中wav解析程序对此并没有太好的处理,会导致影响最终识别效果的问题。因此可尝试使用下述代码转换:

    ffmpeg -i input.wav -map_metadata -1 -fflags +bitexact -acodec pcm_s16le -ac 1 -ar 16000 output.wav
    sox -r 44200 input.wav -r 16000 output.wav

感谢网友们提供的帮助。

2) ASRT支持采样率为8kHz的音频吗

目前暂不支持,如果有8kHz的音频识别需求请自行使用转码工具将音频转为16kHz后再训练和识别。如果目标使用场景下的数据全部为8kHz采样率,且有大量已标注的训练数据的话,可以考虑自行使用8kHz音频数据进行训练并使用。代码也需对应改为支持8kHz音频,需要修改的地方有:升学特征提取部分,加载数据时使用的numpy数组的维度,声学模型的升学特征维度。

3) ASRT支持中文方言(或英语、俄语、法语以及多语种混合等)的识别吗

不支持,ASRT目前的设计为纯中文的语音识别,仅支持标准的中文普通话识别,其他方言或语种请自行修改代码和训练。如有需要帮助修改代码请联系AI柠檬博主。

4) 文档中所列出的数据集需要全部下载解压吗

默认情况下是需要全部下载解压的。
如果你都想用的话就全部下载解压,如果你只想用一部分的话,可以只下载一部分,但是需要改一下配置文件,删掉不用的数据集配置。关于如何修改配置文件,详见:ASRT文件格式标准

但是AI柠檬建议,如果是为了通过自己训练获得一个效果较好的语音识别模型,还是应当使用默认所列出的全部数据集。减少数据集会使得训练出来效果变得较差。如果您自己训练得到的模型还没有我发布的版本效果好,是没有意义的。

不过如果是做科研实验,打算做对比实验或改进算法,那么使用其中一个或部分数据集是没有问题的,根据需要做就行,注意修改配置文件。

5) 如果我想用ASRT语音识别系统训练自己的数据集,该如何对我的数据进行处理?

参考本文档中的ASRT文件格式标准相关内容,数据集中的音频文件和数据列表、数据标签等文件需要按照标准格式说明整理为ASRT标准格式。
数据处理完成后,按与默认数据集相同的配置将您自己的数据加入其中,然后即可启动训练过程。

3. 关于ASRT项目的问题

1) ASRT是否支持实现“流式”“实时”语音识别?

支持。ASRT项目当前所使用的算法模型和工程实现本身不会限制实时、流式的语音识别功能。推荐您启动基于gRPC协议的API服务来运行,在服务端实现了数据的双向流式传输和严格的从前到后顺序进行识别解码。若使用基于HTTP协议接口,鉴于不同的人对“流式”和“实时”的定义和需求可能有所不同,也许您需要针对您的应用需求进行代码的二次修改。

2) 语音模型直接识别出来的是汉语拼音,能不能转为汉字

语音模型是使用汉语拼音作为模型的输出的,如果需要转为汉字,还需要语言模型,仓库中的 LanguageModel.py 就是用来做这件事的,可以实现从拼音转为汉字。test.py文件包含了这整个一套的过程,可以实现从wav声音文件或序列,到最终的汉字。

3) 自己电脑比较渣,在哪里可以下载作者已经训练好的模型

本项目已经预发布了若干个版本的完整软件,可以在Github本仓库下releases里面的发布的软件的压缩包ASRT_vxx.xx.zip里获得完整源程序,包含有已经训练好的模型,每个版本具体使用到的模型都有说明,发布的版本基本上有着不错的语音识别字准确率。

**4) 使用ASRT语音识别系统的发布版,“感觉识别的效果不是很好”怎么办?

首先,您的表述不严谨。“效果不是很好”这一描述很主观,如果60%正确率算效果不好,那85%正确率算效果好还是不好呢?那90%是不是就应该算效果好呢?但是90%也低于95%这一数值。
一方面,当前ASRT的发布版的识别率基线是85%。其中,Demo页面用的ASRT服务的识别准确率在90%以上(90%-96%之间),区别主要在于加了非公开数据集,故不用于公开发布,请谅解。因此ASRT开源语音识别项目有能力达到业界先进水平,只要您的技术和实力足够。另外,如果在你实际场景下识别率不够85%,也正常,噪声、口音、方言、录音设备等多种因素都会影响准确率。如果有条件用你自己目标场景的数据集训练是最好不过的。

5) 为什么代码种删掉了LSTM层,这是出于什么考虑

就是为了设计一种模型的结构而已,没什么考虑不考虑的。别问,问就是我偏要删掉(手动狗头)

为什么一定要用LSTM呢?这一点我其实一直都很好奇,希望大家不要被条条框框束缚,别问什么会不会效果更好,只有实践才是检验真理的唯一标准

不过本项目仓库中,还是有用到循环层(GRU)的模型,比如m26和m261,大家都可以试试。(并不真香)

6) 里面有一行代码,input_shape[0] // 8是什么意思

这个问题被问了太多遍了。。。严格来讲这个问题并不是一个通用的常见问题,只不过当前代码这样写,它刚好就是这样。这个问题属于深度学习中的基础问题,跟卷积神经网络的卷积层和池化层原理有关,不知道为什么要除以8的话,建议去网易云课堂上看一看吴恩达的深度学习工程师课程视频。

言归正传,简单说,它当前除以8是因为神经网络输入的尺寸从1600经过卷积池化网络(主要是三次步长为2的2x2池化的原因)后,尺寸变为200,大小降到了8分之一。如果只有一次步长为2的2x2池化那就是除以2了,同理两次就是除以4了,如果是四次步长为2的2x2池化的话,那应该是多少?对没错,相信聪明的你应该猜出答案了!

4. 运行报错问题(包括训练和测试时)

1) 程序一运行就提示“xxx程序已停止工作”或者“非法指令(核心已转储)” “Illegal Instruction(Core Dump)”

这应该是tensorflow和CPU的锅,tf默认编译的是通用指令集,在大部分计算机上都可以正常运行,但是唯独当前的CPU连这种通用指令集都不支持,所以解决办法就是自己手动编译一个tensorflow吧。或者也可以直接使用GPU版的tensorflow试试,前提是要有Nvidia的GPU。

2) 程序运行时报错,提示类似“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秒一下的小段,然后再运行程序。

虽然也可以通过调大self.AUDIO_LENGTH这个参数来提高最大限制,但是计算机内存空间总是有限的,这样并不解决根本问题,建议还是按照上面说的方式进行切分。调大这个参数只能减小切分后的片段数量,但是不能彻底消除切分的必要性。

3) 开始训练模型时,出现大量输出,最终提示:ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[64]之类

这个是计算机的运行存储资源不足导致的,OOM即为Out of Memory,意为存储空间不足,通常在使用GPU训练模型时,只有2GB等小显存的情况下出现,在CPU训练的情况下内存不足会出现计算机系统卡死的情况。解决方案是,增加显存容量,使用显存较大的GPU,或者多GPU并行计算。本项目推荐显存大小为每个单GPU在11GB或以上。

4) 训练模型过程中出现报错:InvalidArgumentError: Not enough time for target transition sequence

这个是音频对应的标签输入的时间维长度过长(即字数/拼音数太多),或者神经网络输出的时间维的长度过短(长度太短以至于不能表示对应的数据标签中的内容)导致的。根据”采样定律”(雾),应该让神经网络的输出长度大于标签长度的2倍(根据CTC解码的原理),为最适宜。ASRT作者自己设计的模型就满足这个条件。

5) 程序加载模型参数文件时,提示找不到文件OSError: Unable to open file,No such file or directory

首先,如果程序报错说“找不到文件” “没有这样的文件”等,那就是真的找不到文件,没有什么奇怪的,不要说什么“明明文件是存在的”之类的话,该检查的是文件路径位置是否正确或者是否符合预期。

如果是在加载模型参数文件,请检查是不是 load_model() 中指定的加载保存好的模型文件名路径是否存在,当这个文件不存在时会触发该错误。还需要注意一下python在windows系统和linux系统上文件路径字符串在表示上的区别,是用'/'还是'\\'等,以及,linux系统对文件路径区分大小写,也就是说A11_183.WAV和A11_183.wav是不一样的,但是在Windows系统下,这两个却是指向一样的文件,所以,应该避免同一个字母不同大小写的文件名。

参考issue
参考issue

另外,如果是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

6) 一运行就提示cannot import module xxx / ModuleNotFoundError: No module named xxx

请检查python依赖库是否全部安装成功,如果存在没有安装成功的库,请手动安装。

.

7) 运行过程中出错,提示找不到某wav文件,提示FileNotFoundError: [Errno 2] No such file or directory

首先,如果程序报错说“找不到文件” “没有这样的文件”等,那就是真的找不到文件,没有什么奇怪的,不要说什么“明明文件是存在的”之类的话,该检查的是文件路径位置是否正确或者是否符合预期。

请确认保存解压数据的位置是否正确,或者是否需要适当修改配置文件中的路径等。
请确保文件列表和数据标签与数据集中的wav文件名和存储路径相对应,如果用到了自己生成的文件,请务必保证这一点。

参考issue

5. 客户端和SDK调用问题

1) 调用API时出现目标计算机积极拒绝,无法连接 远程主机没有响应并关闭了连接等类似错误提示信息

例如:

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))`

首先,ASRT语音识别系统的运行是需要同时具备API服务端调用客户端的,所以在调用API和SDK或者运行客户端demo时,请确保已经启动了服务端程序。
然后,请检查客户端调用API接口或SDK时填写的HostPortProtocol等字段是否正确,详情请看客户端SDK调用二次开发手册中的对应内容,客户端调用时填写的信息应该与调用目标服务器的信息对应。
最后,以上信息确认无误时,请检查防火墙,尤其是服务端的防火墙配置,检查指定的端口是否可以客户端建立网络连接。客户端在调用时如果有安全软件弹出拦截窗口进行审查时,也应当选择允许。

6. 训练时状态异常问题

1) 程序运行一段时间后报错,包含有 ValueError:generator already executingRuntimeError: Your generator is Not thread-safe. 等字样的报错信息

这种报错出现是因为使用的数据集的数据量较小,或者机器运算速度过快,导致出现在多线程并发或并行时的线程不安全的问题。AI柠檬博客中曾发布过这种问题发生的原理的介绍文章和对针对python数据生成器进行处理的解决方案文章:

7. 已变得相对少见或不适应当前版本的问题 (将来也许会删掉)

(过期的旧问题已删除)

其他未提及的问题请加入QQ群“AI柠檬博客群”进行交流讨论,群号见本文档首页,亦可发送邮件联系。

文档更新时间: 2022-06-28 01:25   作者:AI柠檬