我正在用Python创建一个个人助理。我正在使用Snowboy录制音频,它工作得很好。Snowboy有一个saveMessage()方法,用于创建wav文件并将其写入磁盘。该wav文件稍后被Speech_Recognition读取并用作AudioFile对象。我发现这是非常低效的程序必须写入和读取wav文件到磁盘。我更希望将wav文件作为对象传递,而不是将其保存到磁盘上。
下面是我想重写的雪人saveMessage()模块。
def saveMessage(self):
"""
Save the message stored in self.recordedData to a timestamped file.
"""
filename = 'output' + str(int(time.time())) + '.wav'
data = b''.join(self.recordedData)
#use wave to save data
wf = wave.open(filename, 'wb')
wf.setnchannels(1)
wf.setsampwidth(self.audio.get_sample_size(
self.audio.get_format_from_width(
self.detector.BitsPerSample() / 8)))
wf.setframerate(self.detector.SampleRate())
wf.writeframes(data)
wf.close()
logger.debug("finished saving: " + filename)
return filename #INSTEAD OF RETURNING filename I WANT THIS TO RETURN THE wav file object请注意,AudioFile类要求必须将wave文件的路径或“类似文件”的对象传入其中。我不确定什么是“类文件”对象,所以我将为wav文件参数提供AudioFile assert语句:
assert isinstance(filename_or_fileobject, (type(""), type(u""))) or hasattr(filename_or_fileobject, "read"), "Given audio file must be a filename string or a file-like object"我曾尝试使用BytesIO的一个实例来保存wav数据,BytesIO显然不是一个类似文件的对象。这是我尝试过的:
def saveMessage(self):
filename = 'output' + str(int(time.time())) + '.wav'
data = b''.join(self.recordedData)
#use wave to save data
with io.BytesIO() as wav_file:
wav_writer = wave.open(wav_file, "wb")
try:
wav_writer.setnchannels(1)
wav_writer.setsampwidth(self.audio.get_sample_size(
self.audio.get_format_from_width(
self.detector.BitsPerSample() / 8)))
wav_writer.setframerate(self.detector.SampleRate())
wav_writer.writeframes(data)
wav_data = wav_file.getvalue()
finally:
wav_writer.close()
logger.debug("finished saving: " + filename)
return wav_data我得到的错误是:AssertionError: Given audio file must be a filename string or a file-like object
我在运行Raspbian Buster Lite内核版本4.19.36的Raspberry PI 3B+上使用Python3.7。
如果我能提供任何额外的信息或澄清任何事情,请尽管问。
非常感谢!
发布于 2020-04-09 01:27:20
像这样的东西应该是有效的:
from speech_recognition import AudioData
def saveMessage(self):
filename = 'output' + str(int(time.time())) + '.wav'
data = b''.join(self.recordedData)
ad = AudioData(data, 16000, 2)
result = recognizer.recognize_google(ad)注意,speech_recognition.listen可以在内部调用snowboy,所以您可能不必使用外部snowboy,只需使用带有参数snowboy_configuration的listen即可。
https://stackoverflow.com/questions/61091051
复制相似问题