繁体   English   中英

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

[英]How to play Wav sound samples from memory

在大学的最后一个项目中,我正在使用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. 读取/写入WAV文件(或其他音频文件)

  2. 播放/录制声音

关于SO的两个主题,都有一些问题和答案。

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

您应该使用NumPy来处理声音,这比处理普通的Python缓冲区要容易得多。 如果由于某种原因您不能使用NumPy,您仍然可以执行所有操作,但这将需要更多的工作。

对于读取/写入声音文件,我建议使用声音文件模块(完整说明:我是合著者)。

对于播放/录制声音,我建议使用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)

进一步阅读:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM