如何从内存中播放 Wav 声音样本

Posted

技术标签:

【中文标题】如何从内存中播放 Wav 声音样本【英文标题】:How to play Wav sound samples from memory 【发布时间】:2017-02-21 23:44:26 【问题描述】:

对于我在大学的最后一年的项目,我正在使用 Wav 文件和 Python 并搞乱它们。我希望能够从内存中播放声音样本,而不是在我听到它们之前将声音样本写入 WAV 文件。

我在网上找了好几个星期,发现了 PyMedia、PySound、PyGame 等,但它们似乎都不适合我。每个单独的包都会给我错误。

我还缺少其他可以帮助我做到这一点的库吗?还是我只是愚蠢,无法让其他软件包工作。

我真正想做的就是这样:

    #open file and get parameters
    wavfile = Wave.open("file.wav", "r")
    params = wfile.getparams()
    nframes = params[3]

    #get sound samples in a list
    samples = []
    for i in range(nframes):
        samples.append(wfile.readframes(1))

    playsound(samples)

    changedSamples = makeChangeTo(samples)

    playsound(changedSamples)

我希望能够在循环中使用它,这样我就可以在程序仍在运行时进行编辑和听到编辑,而不必在听到之前将样本写入 wav 文件,因为这也需要长。

有什么建议吗?干杯!

【问题讨论】:

尝试 SSDD 或虚拟 RAM 磁盘?文件,流接口可以隐藏会导致播放/记录间隙的延迟 - 这是预期的带有垃圾收集的解释语言,如 Python 您没有提供任何有关使这些库正常工作时遇到的错误的信息。 pygame 当然可以create a Sound object from '来自 OGG 音频文件或来自未压缩的 WAV'。 【参考方案1】:

您应该清楚地将这两个问题分开:

    读/写 WAV 文件(或其他音频文件)

    播放/录制声音

关于 SO 的两个主题都有几个问题和答案。

这是我个人(当然也有偏见)的建议:

您应该使用 NumPy 来处理声音,它比处理普通的 Python 缓冲区要容易得多。 如果由于某种原因你不能使用 NumPy,你仍然可以做这一切,但工作量会更大。

对于读/写声音文件,我推荐soundfile 模块(完全公开:我是合著者)。

对于播放/录制声音,我推荐sounddevice 模块(完全公开:我是它的主要作者)。

使用这些模块时,您的示例可能会变成这样:

import soundfile as sf
import sounddevice as sd

samples, samplerate = sf.read('file.wav')
sd.play(samples, samplerate)
sd.wait()
changed_samples = make_change_to(samples)
sd.play(changed_samples, samplerate)
sd.wait()

如果您在交互式 Python 提示符下工作,您可能不需要 sd.wait() 调用,您可以等到播放完成。或者,如果你听腻了,你可以使用:

sd.stop()

如果你知道你会在一段时间内使用相同的采样率,你可以将其设置为默认值:

sd.default.samplerate = 48000

之后,您可以在使用play() 时去掉samplerate 参数:

sd.play(samples)

如果你想将改变的声音存储到一个文件中,你可以使用这样的东西:

sf.write('changed_file.wav', changed_samples, samplerate)

进一步阅读:

different options for reading/writing audio files different options for playback/recording a very basic tutorial about handling audio signals

【讨论】:

太棒了,看起来不错,我会试一试,看看会发生什么。谢谢,我很感激!

以上是关于如何从内存中播放 Wav 声音样本的主要内容,如果未能解决你的问题,请参考以下文章

Java中可靠的声音API,用于简单的数字样本播放

如何正确播放已解码的内存PCM与Oboe?

在纯 WinAPI 中从内存缓冲区播放声音

Windows 的声音管理器类

AVAudioPlayer- 从声音缓冲区播放

将 .wav 加载到内存中,然后在 C++ 中播放