[英]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文件之前就可以将其收听,因为这花了太长时间。
有什么建议么 ? 干杯!
您应该明确区分这两个问题:
读取/写入WAV文件(或其他音频文件)
播放/录制声音
关于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.