【问题标题】:Change the volume of a wav file in python在python中更改wav文件的音量
【发布时间】:2012-10-31 01:04:15
【问题描述】:

我有一个 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()

谢谢你们!

【问题讨论】:

  • 你为什么用* 5 / 10而不是/ 2
  • 如果我不得不猜测,我会说* 5 部分正在剪辑和溢出。
  • 您是否以正确的字节序读取文件? WAV files are little-endian. 使用另一个字节序会使样本减半并增加很多噪音。
  • 天哪……!!很抱歉发布... 回复太容易了。通过这样做: s = numpy.fromstring(s, numpy.int16) * 5 / 10 # 半幅度信号饱和,因为我在除以之前乘以整数。一个解决方案: s = numpy.fromstring(s, numpy.int16) / 10 * 5 # 半幅 注意,这不起作用,因为除法结果为零:s = numpy.fromstring(s, numpy.int16) * (5 / 10) # 半振幅我把它放在这里以防它帮助别人。
  • Jan,因为它们应该是 vars:5 是所需的音量,10 是原始音量。

标签: python audio wav volume wave


【解决方案1】:

我写了library to simplify this type of thing

你可以这样做:

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")

【讨论】:

  • 你能把 Astley 先生衰减 36dB 吗?
  • @msw 肯定是song = song - 36
【解决方案2】:

正如您在问题的 cmets 中看到的那样,有几种解决方案,其中一些更有效。

Jan Dvorak 立即发现了这个问题(“* 5 部分被剪裁和溢出”),直接的解决方案是:

s = numpy.fromstring(s, numpy.int16) / 10 * 5

在这种情况下,这个解决方案对我来说是完美的,刚刚好。

谢谢大家!

【讨论】:

    【解决方案3】:

    这可以通过 Python 标准库中的 audioop 模块来完成。 这样,就不需要像 pydubnumpy 这样的依赖项了。

    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))
    

    【讨论】:

    • 这基本上是 pydub 在后台所做的
    【解决方案4】:

    使声音更响亮的代码加上过滤低频和高频

    from pydub import AudioSegment
    
    audio_file = "first.mp3"
    
    song = AudioSegment.from_mp3(audio_file)
    
    new = song.low_pass_filter(1000)
    
    new1 = new.high_pass_filter(1000)
    
    # increae volume by 6 dB
    song_6_db_quieter = new1 + 6
    
    # save the output
    song_6_db_quieter.export("C://Users//User//Desktop//second.mp3", "mp3")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      相关资源
      最近更新 更多