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

How to play Wav sound samples from memory

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

我在网上找了几个星期,发现 PyMedia、PySound、PyGame 等,其中 none 似乎对我有用。每个包都给我错误。

是否还有其他我缺少的库可以帮助我做到这一点?还是我太笨了,无法让其他软件包正常工作。

正是我想要做的是沿着这条线:

    #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 文件时间太长了。

有什么建议吗?干杯!

您应该明确区分这两个问题:

  1. Reading/writing WAV 文件(或其他音频文件)

  2. Playing/recording听起来

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

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

您应该使用 NumPy 来操纵声音,这比处理普通 Python 缓冲区要容易得多。 如果由于某种原因你不能使用 NumPy,你仍然可以做所有这些,但是会多一些工作。

对于 reading/writing 声音文件,我推荐 soundfile 模块(完全披露:我是合著者)。

对于 playing/recording 声音,我推荐 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)

延伸阅读: