我已经生成了一个.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)
答案 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输出制作的文件非常不同,因此似乎还有另一个因素在起作用...