将WAV文件字节转换为语音识别兼容格式

时间:2020-04-23 02:03:21

标签: python audio speech-recognition wav pydub

在Python自动化管道上,我已经用头部砸了三天,该管道采用.WAV电子邮件附件的二进制字节数组(例如b'RIFFm \ xc1 \ x00 \ x00WAVEfmt [...]')电话系统会自动进行推送,通过诸如speech_recognition之类的文本语音转换API或将来的某些离线Sphinx / Kaldi实现进行推送,然后将笔录发回。理想情况下,所有这些操作都将在内存中处理,而无需在磁盘上创建文件,因为这似乎是多余的,但我正在尝试找出Python方式将我从音频数据移至可以发送的笔录的任何内容,我不介意一点文件清理。

我遇到的问题是我手动下载用于测试的.WAV文件附件,以及通过电子邮件API处理的二进制数据在wave依赖项和{{ 1}}提供wave.open('ipsum.wav')并与Error: unknown format: 49库一起工作,以speech_recognition未知格式错误转换为wave结束。

使用在线文件转换工具将我拥有的本地文件手动转换为.wavs似乎以ValueError: Audio file could not be read as PCM WAV, AIFF/AIFF-C, or Native FLAC; check if file is corrupted or in another format愿意使用的方式解决了该问题,并且我设法获得了有效的笔录(成绩单对于文件来说太短了,但这是一个单独的分块问题)。因此,问题似乎在于speech_recognition对电话系统发送给我的文件的格式/编码/压缩方式不满意,解决方案位于复制该Web转换工具如何编码这些测试文件的位置。

我一直在纠结wave的{​​{1}}函数,试图强迫它转换为pydub喜欢的东西(.export()设法播放了这些文件)但似乎让我转了一圈,然后回到了上面讨论的错误回溯的起点。理想的解决方案可能在于某种工具,该工具可以处理内存中电子邮件附件的字节数组,但是同样,我愿意接受任何Pythonic建议。

我可能会从Google的某个地方更改我使用的文本到语音框架,但是到目前为止,我的代码已用于基本实现:

wave

如果您有任何好的资源或课程可以教我如何以Python的方式进行音频文件转换(我一直在非常实用的资源(假定您的音频处理工作正常)和极其繁琐的讨论之间陷入了巨大的鸿沟),我也很高兴听到他们的声音。

1 个答案:

答案 0 :(得分:3)

标准库wave模块仅支持this code证明的PCM编码:

if wFormatTag == WAVE_FORMAT_PCM:
    try:
        ...
    else:
raise Error('unknown format: %r' % (wFormatTag,))

您要处理的是8,000 Hz GSM 06.10,或更常见的是GSM。您可以在wiki上阅读有关不同编码方案的更多信息。

来自soxi的证据:

soxi msg0000\ \(2\).WAV 

Input File     : 'msg0000 (2).WAV'
Channels       : 1
Sample Rate    : 8000
Precision      : 16-bit
Duration       : 00:00:07.96 = 63680 samples ~ 597 CDDA sectors
File Size      : 13.0k
Bit Rate       : 13.1k
Sample Encoding: GSM

解决方案

使用任何支持GSM编码的库。 soundfile是一个不错的选择;许多流行的音频模块在下面使用它。

import soundfile as sf

sf.read('msg0000 (2).WAV') 

输出:

(array([0.00024414, 0.        , 0.        , ..., 0.00048828, 0.00048828,
        0.00024414]),
 8000)