首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建并使用WAV文件作为对象Python

创建并使用WAV文件作为对象Python
EN

Stack Overflow用户
提问于 2020-04-08 07:31:24
回答 1查看 787关注 0票数 1

我正在用Python创建一个个人助理。我正在使用Snowboy录制音频,它工作得很好。Snowboy有一个saveMessage()方法,用于创建wav文件并将其写入磁盘。该wav文件稍后被Speech_Recognition读取并用作AudioFile对象。我发现这是非常低效的程序必须写入和读取wav文件到磁盘。我更希望将wav文件作为对象传递,而不是将其保存到磁盘上。

下面是我想重写的雪人saveMessage()模块。

代码语言:javascript
复制
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语句:

代码语言:javascript
复制
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显然不是一个类似文件的对象。这是我尝试过的:

代码语言:javascript
复制
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。

如果我能提供任何额外的信息或澄清任何事情,请尽管问。

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-09 01:27:20

像这样的东西应该是有效的:

代码语言:javascript
复制
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即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61091051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档