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

Phy*_*hys 7 python speech-recognition google-api

我生成了一个 .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)
Run Code Online (Sandbox Code Playgroud)

如果我使用我的 .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)
Run Code Online (Sandbox Code Playgroud)

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

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

音频文件被保存为

    wavfile.write(wav_path, fs, data)
Run Code Online (Sandbox Code Playgroud)

其中 wav_path = 'data.wav'。有任何想法吗?

解决方案:

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

    import wavio
    wavio.write(wav_path, data, fs ,sampwidth=2)
Run Code Online (Sandbox Code Playgroud)

War*_*ser 6

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

scipy.io.wavfile.write如果您传递一个整数数组,SciPy 的函数将创建一个整数文件。所以如果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)
Run Code Online (Sandbox Code Playgroud)

然后尝试使用speech_recognition.

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