如何将 numpy 数组转换为 bytes 对象而不将音频文件保存在磁盘上?

its*_*sMe 5 python arrays audio mp3 wav

我现在正在学习构建一个基于 Tacotron-2 的 TTS 项目。

这里,函数中的原始代码save_wav(wav, path, sr)有一个步骤,通过使用将 numpy 数组保存到 .wav 文件

wav *= 32767 / max(0.01, np.max(np.abs(wav)))
scipy.io.wavfile.write(path, hparams.sample_rate, wav.astype(np.int16))
Run Code Online (Sandbox Code Playgroud)

但是,在使用 获得 numpy 数组后wav *= 32767 / max(0.01, np.max(np.abs(wav))),我想将其转换为 .mp3 文件,以便更容易将其作为流响应发送回来。

现在,我可以将 .wav bytes 对象转换为 .mp3 文件,但问题是我不知道如何将 numpy 数组转换为 .wav bytes 对象

我搜索了一下,发现我似乎需要为 numpy 数组设置一个标头,但在我研究的几乎所有帖子中都表明使用像scipy.io.waveand之类的模块audioop,它首先将 numpy 数组保存到 .wav 文件,然后with open('filename.wav', 'rb')

(这是scipy.io.wavfile.write 模块的链接filename,其中参数应该是字符串或打开文件句柄,根据我的理解,生成的 .wav 文件将保存在磁盘上。)

谁能就如何实现这一目标提出任何建议?

its*_*sMe 0

我最终通过修改和创建基于pydubscipy.io.wavfile.writeaudio_segment.py的新模块解决了这个问题。

另外,当你想对wave/mp3字节进行操作而不将它们保存为.wav/.mp3文件(通常通过使用一些API或python包模块)时,你应该手动为其添加标头。如果你研究一下那些优秀的包源代码,这将不是一项太艰巨的任务。

  • 您能提供您提到的解决方案吗?例如,某些 Wav 文件可能具有非标准标头,这使得这变得更加困难。 (3认同)