簡體   English   中英

改變python中一個wav文件的音量

[英]Change the volume of a wav file in python

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

感謝你們!

我寫了一個庫來簡化這種類型的事情

你可以這樣做:

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

正如您在問題的評論中看到的那樣,有幾種解決方案,其中一些更有效。

Jan Dvorak 立即發現了這個問題(“* 5 部分正在裁剪和溢出”),直接的解決方案是:

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

在這種情況下,這個解決方案對我來說是完美的,剛剛好。

謝謝大家!

這可以通過 Python 標准庫中的audioop模塊來完成。 這樣,不需要像pydubnumpy這樣的依賴pydub

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

使聲音更大的代碼加上過濾低頻和高頻

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

使用librosa也可以輕松完成簡單的放大:

import librosa
import soundfile as sf

data, sr = librosa.load("input.wav")
factor = 0.5
data *= factor
sf.write("output.wav", data, sr)

降噪是一個更復雜的問題。 更簡單的方法包括低通和高通濾波,但它通常在很大程度上取決於信號和噪聲的特性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM