创建并使用 WAV 文件作为对象 Python
Create and use WAV file as an object Python
我正在 Python 创建个人助理。我正在使用 Snowboy 录制音频,效果很好。 Snowboy 有一个 saveMessage() 方法,可以创建一个 wav 文件并将其写入磁盘。此 wav 文件稍后被 Speech_Recognition 读取并用作 AudioFile 对象。我发现程序必须将 wav 文件写入和读取到磁盘,效率非常低。我宁愿将 wav 文件作为对象传递,而无需将其保存到磁盘。
这里是我要重载的snowboy 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 class 要求必须将波形文件的路径或 "file-like" 对象传递给它。我不确定 "file-like" 对象是什么,所以我将为 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
我在 Raspberry PI 3B+ 运行 Raspbian Buster Lite 内核版本 4.19.36 上使用 python 3.7。
如果我可以提供任何其他信息或澄清任何内容,请询问。
非常感谢!
像这样的东西应该可以工作:
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。
我正在 Python 创建个人助理。我正在使用 Snowboy 录制音频,效果很好。 Snowboy 有一个 saveMessage() 方法,可以创建一个 wav 文件并将其写入磁盘。此 wav 文件稍后被 Speech_Recognition 读取并用作 AudioFile 对象。我发现程序必须将 wav 文件写入和读取到磁盘,效率非常低。我宁愿将 wav 文件作为对象传递,而无需将其保存到磁盘。
这里是我要重载的snowboy 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 class 要求必须将波形文件的路径或 "file-like" 对象传递给它。我不确定 "file-like" 对象是什么,所以我将为 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
我在 Raspberry PI 3B+ 运行 Raspbian Buster Lite 内核版本 4.19.36 上使用 python 3.7。
如果我可以提供任何其他信息或澄清任何内容,请询问。
非常感谢!
像这样的东西应该可以工作:
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。