1 python audio wav playback wave
在我大学最后一年的项目中,我正在使用 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)
Run Code Online (Sandbox Code Playgroud)
我希望能够将其放在循环中,这样我就可以在程序仍在运行时编辑和收听编辑内容,而不必在能够听到它之前将样本写入 wav 文件,因为这需要太长时间。
有什么建议 ?干杯!
您应该清楚地区分这两个问题:
读/写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()
Run Code Online (Sandbox Code Playgroud)
如果您在交互式 Python 提示符下工作,您可能不需要调用sd.wait(),只需等待播放完成即可。或者,如果您厌倦了听它,您可以使用:
sd.stop()
Run Code Online (Sandbox Code Playgroud)
如果您知道将在一段时间内使用相同的采样率,则可以将其设置为默认值:
sd.default.samplerate = 48000
Run Code Online (Sandbox Code Playgroud)
之后,您可以samplerate在使用时删除参数play():
sd.play(samples)
Run Code Online (Sandbox Code Playgroud)
如果要将更改后的声音存储到文件中,可以使用如下命令:
sf.write('changed_file.wav', changed_samples, samplerate)
Run Code Online (Sandbox Code Playgroud)
进一步阅读:
| 归档时间: |
|
| 查看次数: |
4739 次 |
| 最近记录: |