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

1 python audio wav playback wave

在我大学最后一年的项目中,我正在使用 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)
Run Code Online (Sandbox Code Playgroud)

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

有什么建议 ?干杯!

Mat*_*ias 5

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

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

  2. 播放/录制声音

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()
Run Code Online (Sandbox Code Playgroud)

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

sd.stop()
Run Code Online (Sandbox Code Playgroud)

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

sd.default.samplerate = 48000
Run Code Online (Sandbox Code Playgroud)

之后,您可以samplerate在使用时删除参数play()

sd.play(samples)
Run Code Online (Sandbox Code Playgroud)

如果要将更改后的声音存储到文件中,可以使用如下命令:

sf.write('changed_file.wav', changed_samples, samplerate)
Run Code Online (Sandbox Code Playgroud)

进一步阅读: