如何从内存中播放 Wav 声音样本
Posted
技术标签:
【中文标题】如何从内存中播放 Wav 声音样本【英文标题】:How to play Wav sound samples from memory 【发布时间】:2017-02-21 23:44:26 【问题描述】:对于我在大学的最后一年的项目,我正在使用 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 文件,因为这也需要长。
有什么建议吗?干杯!
【问题讨论】:
尝试 SSDD 或虚拟 RAM 磁盘?文件,流接口可以隐藏会导致播放/记录间隙的延迟 - 这是预期的带有垃圾收集的解释语言,如 Python 您没有提供任何有关使这些库正常工作时遇到的错误的信息。 pygame 当然可以create a Sound object from '来自 OGG 音频文件或来自未压缩的 WAV'。 【参考方案1】:您应该清楚地将这两个问题分开:
读/写 WAV 文件(或其他音频文件)
播放/录制声音
关于 SO 的两个主题都有几个问题和答案。
这是我个人(当然也有偏见)的建议:
您应该使用 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)
进一步阅读:
different options for reading/writing audio files different options for playback/recording a very basic tutorial about handling audio signals【讨论】:
太棒了,看起来不错,我会试一试,看看会发生什么。谢谢,我很感激!以上是关于如何从内存中播放 Wav 声音样本的主要内容,如果未能解决你的问题,请参考以下文章