Python,speech_recognition工具无法识别.wav文件

时间:2018-09-10 01:30:49

标签: python google-api speech-recognition

我已经生成了一个.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或本机FLAC。检查文件是否损坏或其他格式

如果我将这个.wav文件保存为声音文件,情况会稍微改善:

    import soundfile as sf        

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

,然后将新的save_wav_path加载回第一段代码,这次我得到:

  

如果不是isinstance(actual_result,dict)或len(actual_result.get(“ alternative”,[]))== 0:引发UnknownValueError()

音频文件另存为

    wavfile.write(wav_path, fs, data)

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

解决方案:

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

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

2 个答案:

答案 0 :(得分:2)

通过简要查看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应该能够读取其创建的文件。

答案 1 :(得分:0)

我无法从其文档中确定wavio的采样宽度。但是,我添加了以下行sounddevice.default.dtype='int32', 'int32',它允许sounddevice,scipy.io.wavfile.write / soundfile和speech_recognizer最终一起工作。声音设备的默认dtype输入和输出均为float32。我尝试只更改输出,但是没有用。奇怪的是,Audacity仍然认为输出文件在float32中。我并不是说这是一个更好的解决方案,但它确实适用于声音文件和scipy。

我还注意到了另一个奇怪之处。当sounddevice.default.dtype保留为默认值[float32,float32]时,我以大胆的态度打开了生成的文件。从大胆的角度出发,我将其导出,并且此导出的wav可与语音识别器一起使用。 Audacity表示其出口为float32,且采样率相同,因此我不完全了解。我是菜鸟,但是在十六进制编辑器中查看了这两个文件,并且对于前64个十六进制值,它们看起来相同,然后又有所不同……因此,似乎标头是相同的。这两个看上去与我使用int32输出制作的文件非常不同,因此似乎还有另一个因素在起作用...