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

2024-03-29 11:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在我大学的最后一年的项目中,我正在处理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文件,然后才能听到它,因为这需要太长时间。在

有什么建议吗?干杯!在


Tags: 文件in声音编辑getparamsopenfile
1条回答
网友
1楼 · 发布于 2024-03-29 11:38:45

您应该明确区分这两个关注点:

  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()调用,可以等到播放完成。或者,如果你听腻了,可以使用:

^{pr2}$

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

sd.default.samplerate = 48000

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

sd.play(samples)

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

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

进一步阅读:

相关问题 更多 >