如何从内存中播放 Wav 声音样本
How to play Wav sound samples from memory
在我大学的最后一年项目中,我正在使用 Wav 文件和 Python 并摆弄它们。我希望能够从内存中播放声音样本,而不是在我听到之前将声音样本写入 WAV 文件。
我在网上找了几个星期,发现 PyMedia、PySound、PyGame 等,其中 none 似乎对我有用。每个包都给我错误。
是否还有其他我缺少的库可以帮助我做到这一点?还是我太笨了,无法让其他软件包正常工作。
正是我想要做的是沿着这条线:
#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 文件时间太长了。
有什么建议吗?干杯!
您应该明确区分这两个问题:
Reading/writing WAV 文件(或其他音频文件)
Playing/recording听起来
SO 上有几个关于这两个主题的问题和答案。
这是我个人(当然也有偏见)的建议:
您应该使用 NumPy 来操纵声音,这比处理普通 Python 缓冲区要容易得多。
如果由于某种原因你不能使用 NumPy,你仍然可以做所有这些,但是会多一些工作。
对于 reading/writing 声音文件,我推荐 soundfile 模块(完全披露:我是合著者)。
对于 playing/recording 声音,我推荐 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)
延伸阅读:
在我大学的最后一年项目中,我正在使用 Wav 文件和 Python 并摆弄它们。我希望能够从内存中播放声音样本,而不是在我听到之前将声音样本写入 WAV 文件。
我在网上找了几个星期,发现 PyMedia、PySound、PyGame 等,其中 none 似乎对我有用。每个包都给我错误。
是否还有其他我缺少的库可以帮助我做到这一点?还是我太笨了,无法让其他软件包正常工作。
正是我想要做的是沿着这条线:
#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 文件时间太长了。
有什么建议吗?干杯!
您应该明确区分这两个问题:
Reading/writing WAV 文件(或其他音频文件)
Playing/recording听起来
SO 上有几个关于这两个主题的问题和答案。
这是我个人(当然也有偏见)的建议:
您应该使用 NumPy 来操纵声音,这比处理普通 Python 缓冲区要容易得多。 如果由于某种原因你不能使用 NumPy,你仍然可以做所有这些,但是会多一些工作。
对于 reading/writing 声音文件,我推荐 soundfile 模块(完全披露:我是合著者)。
对于 playing/recording 声音,我推荐 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)
延伸阅读: