【问题标题】:Python, speech_recognition tool does not recognize .wav filePython,speech_recognition 工具无法识别 .wav 文件
【发布时间】:2020-10-16 19:14:05
【问题描述】:

我生成了一个 .wav 音频文件,其中包含一些语音和一些其他干扰语音在背景中。 此代码适用于我的测试 .wav 文件:

    import speech_recognition as sr

    r = sr.Recognizer()
    with sr.WavFile(wav_path) as source:
        audio = r.record(source)

    text = r.recognize_google(audio)

如果我使用我的 .wav 文件,我会收到以下错误:

ValueError:音频文件无法读取为 PCM WAV、AIFF/AIFF-C 或 Native FLAC;检查文件是否损坏或其他格式

如果我用声音文件保存这个 .wav 文件,情况会稍微好转:

    import soundfile as sf        

    wav, samplerate = sf.read(wav_path)
    sf.write(saved_wav_path, original_wav, fs)

然后将新的 saved_wav_path 加载回第一个代码块,这次我得到:

如果不是 isinstance(actual_result, dict) 或 len(actual_result.get("alternative", [])) == 0: raise UnknownValueError()

音频文件保存为

    wavfile.write(wav_path, fs, data)

其中 wav_path = 'data.wav'。有什么想法吗?

解决方案:

按以下方式保存音频数据会生成正确的 .wav 文件:

    import wavio
    wavio.write(wav_path, data, fs ,sampwidth=2)

【问题讨论】:

  • 您确定您的文件确实是 WAV 文件,而不是您刚刚添加了 .wav 扩展名的其他类型的文件吗?而且它是一个简单的 PCM s16 或 u8 WAV 文件,而不是 MP3 压缩的 WAV 文件?
  • WAV 文件不是 WAV 文件。它是一种容器格式,可以采用不同类型的音频流。检查音频流的类型和属性是否适合您的工具。
  • 音频文件是用 wavfile.write("data.wav", fs, data) 保存的,所以,正如你们所说,它可能以错误的格式保存。您知道替代解决方案吗?
  • "音频文件是用 wavfile.write("data.wav", fs, data)..." 将此信息添加到问题中。看起来您的other question 中有这些信息;它也应该在这里。事实上,这个问题实际上是这个问题的重复,不是吗?
  • 您对此有任何解决方案r.recognize_google(audio) ???我也遇到了同样的错误。

标签: python google-api speech-recognition


【解决方案1】:

speech_recognition 包中的代码看,它似乎使用Python 标准库中的wave 来读取WAV 文件。 Python 的 wave 库不处理浮点 WAV 文件,因此您必须确保将 speech_recognition 用于以整数格式保存的文件。

SciPy 的函数scipy.io.wavfile.write 将创建一个整数文件,如果你向它传递一个整数数组。所以如果data是一个浮点numpy数组,你可以试试这个:

from scipy.io import wavfile

# Convert `data` to 32 bit integers:
y = (np.iinfo(np.int32).max * (data/np.abs(data).max())).astype(np.int32)

wavfile.write(wav_path, fs, y)

然后尝试使用speech_recognition 读取该文件。

或者,您可以使用wavio(我创建的一个小型库)将您的数据保存到 WAV 文件中。它还使用 Python 的 wave 库来创建其输出,因此 speech_recognition 应该能够读取它创建的文件。

【讨论】:

  • 您的第一个解决方案给出了我的问题中列出的第二个错误:因此音频变量已成功创建,但没有可理解的语音。使用 wavio 解决了问题,我将使用解决方案更新我最初的问题。谢谢!
【解决方案2】:

我无法从其文档中弄清楚 wavio 的 sampwidth 应该是多少;但是,我添加了以下行 sounddevice.default.dtype='int32', 'int32',它允许 sounddevice、scipy.io.wavfile.write / soundfile 和 speech_recognizer 最终一起工作。 sounddevice 的默认 dtype 是 float32 的输入和输出。我尝试只更改输出,但它没有用。奇怪的是,大胆仍然认为输出文件在 float32 中。我并不是说这是一个更好的解决方案,但它确实适用于 soundfile 和 scipy。

我还注意到另一个奇怪的地方。当 sounddevice.default.dtype 保留为默认值 [float32, float32] 时,我大胆地打开了生成的文件。我大胆地把它导出了,这个导出的 wav 可以与语音识别器一起使用。 Audacity 说它的输出是 float32 和相同的采样率,所以我不完全理解。我是一个菜鸟,但在十六进制编辑器中查看了这两个文件,前 64 个十六进制值看起来相同,然后它们不同......所以看起来标题是相同的。这两个看起来与我使用 int32 输出制作的文件非常不同,所以似乎还有另一个因素在起作用......

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 2022-01-19
    • 1970-01-01
    • 2021-12-10
    • 2012-07-26
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2014-09-15
    相关资源
    最近更新 更多