Ric*_*Bou 11 python audio volume wav wave
我有一个2秒16位单通道8khz wav文件,我需要改变它的音量.
这应该是非常简单的,因为改变音量与改变信号的幅度是一样的,我只需要对它进行衰减,即将它乘以0到1之间的数字.但它不起作用:新的声音较低,但非常充满噪音.我究竟做错了什么?
这是我的代码:
import wave, numpy, struct
# Open
w = wave.open("input.wav","rb")
p = w.getparams()
f = p[3] # number of frames
s = w.readframes(f)
w.close()
# Edit
s = numpy.fromstring(s, numpy.int16) * 5 / 10 # half amplitude
s = struct.pack('h'*len(s), *s)
# Save
w = wave.open("output.wav","wb")
w.setparams(p)
w.writeframes(s)
w.close()
Run Code Online (Sandbox Code Playgroud)
感谢你们!
Jia*_*aro 13
我写了一个库来简化这类事情
你可以这样做:
from pydub import AudioSegment
song = AudioSegment.from_wav("never_gonna_give_you_up.wav")
# reduce volume by 10 dB
song_10_db_quieter = song - 10
# but let's make him *very* quiet
song = song - 36
# save the output
song.export("quieter.wav", "wav")
Run Code Online (Sandbox Code Playgroud)
正如您在问题注释中所看到的,有几种解决方案,其中一些效率更高。
Jan Dvorak立即检测到该问题(“ * 5部分出现剪切和溢出”),直接的解决方案是:
s = numpy.fromstring(s, numpy.int16) / 10 * 5
Run Code Online (Sandbox Code Playgroud)
在这种情况下,这个解决方案对我来说是完美的,足够好了。
谢谢大家!
小智 5
audioop
这可以通过Python标准库中的模块来完成。这样,就不需要像pydub
或 之类的依赖项numpy
。
import wave, audioop
factor = 0.5
with wave.open('input.wav', 'rb') as wav:
p = wav.getparams()
with wave.open('output.wav', 'wb') as audio:
audio.setparams(p)
frames = wav.readframes(p.nframes)
audio.writeframesraw( audioop.mul(frames, p.sampwidth, factor))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12209 次 |
最近记录: |