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

问题描述:

对于我在大学的最后一年项目,我正在使用Wav文件和Python,并与他们搞混了。我希望能够从内存中播放声音样本,而不是在我听到它们之前将声音样本写入WAV文件。如何从内存播放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文件即可运行,因为这需要很长时间。

有什么建议吗?干杯!

+0

尝试SSDD或虚拟磁盘RAM?文件,流接口可以隐藏潜在的延迟,这将导致播放/记录的差距 - 这是预期的解释性语言与垃圾收集,如Python – f5r5e5d

+0

你还没有给出任何有关你得到任何这些库工作的错误信息。 pygame当然可以[从OGG音频文件或未压缩的WAV'创建一个Sound对象](https://www.pygame.org/docs/ref/mixer.html#pygame.mixer.Sound)。 –

你应该清楚地分离这两个关注点:

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

  2. 播放/录制声音

有几个问题并在这里回答这两个主题。

这是我个人的(当然有偏)推荐:

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

延伸阅读:

+0

真棒,看起来不错我会给它一个去看看会发生什么。 谢谢我感谢他! – ConorSpn

+0

@ConorSpn太好了!如果这有帮助,你应该考虑增加投票和/或接受我的答案。如果没有,请让我知道,所以我可以尝试改进我的答案! – Matthias