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

时间:2017-02-21 23:44:27

标签: 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)

我希望能够在循环中进行此操作,以便在程序仍在运行时编辑和听到编辑,而无需将样本写入wav文件,然后才能听到它长。

有什么建议吗?干杯!

1 个答案:

答案 0 :(得分:2)

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

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

  2. 播放/录制声音

  3. 这里有关于这两个主题的几个问题和答案。

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

    你应该使用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
    

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

    sd.play(samples)
    

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

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

    进一步阅读: