2015-02-07 116 views
1

我覆蓋了一堆音頻片段,並且希望能夠將(1,1,1,0.5,0 ...)形式的值的元組傳遞給我的函數,每個數字是一個段的音量應該縮放的比率。 0應該是絕對安靜的,而1應該是未修改的原始音量,0.5正好是一半。就我所知,這是the behavior of the GainNode "gain" property重新創建Web Audio API GainNode行爲

我嘗試這些至今:

def adjust_volume(audio_segment, ratio): 
    decibel = pydub.utils.ratio_to_db(audio_segment.rms) 
    return audio_segment - decibel * (1 - ratio) 

SILENCE_THRESHOLD = -120.00 
def adjust_volume(audio_segment, ratio): 
    difference = SILENCE_THRESHOLD - audio_segment.dBFS 
    return audio_segment + (difference - (difference * ratio)) 

不幸的是這兩個工作不完美的,這意味着它們不完全複製的網頁瀏覽器(Mozilla Firefox瀏覽器)的行爲。使用第一個可以用我的音頻播放器(foobar2000)聽到聲音,即使我傳入一個只包含0的元組,而第二個設備用正確的靜音閾值設置沉默整個片段,例如使用0.3創建一個音頻級別比我在瀏覽器中使用相同的值時可以觀察到的級別要低。

應該指出,我的技術音頻知識是非常有限的。這些僅僅是由不同的音頻設備,音頻實現細節等造成的技術不準確?如果是這樣的話,有人會建議我採用最「正確」的方式來做這個縮放嗎?

回答

1

我的第一個問題是什麼0.5準確地說。聲音的響度是對數的(每次你將信號的幅度,高度加倍時,聽起來聲音相當大)

那就是說,0.5是否簡單地將幅度減半?如果是這樣,這將是大約6分貝更安靜(我想!我總是混淆幅度和功率計算哈哈)。或者0.5是無聲和最大響度之間的一半?

無論如何,如果你想在pydub中保持沉默,減少120dB的音量就應該這樣做。人們可以聽到的最大動態範圍是140dB,但CD音頻(16位)大約是90dB。

pydub提供輔助功能爲兩卷之間的衰落以及剛剛應用增益:

from pydub import AudioSegment 
from pydub.utils import ratio_to_db, db_to_float 

sound = AudioSegment.from_file('/your/file.wav') 

# this is roughly -6.0 
half_amplitude_in_db = ratio_to_db(0.5) 

# these are all roughly the same result 
half_amplitude1 = sound.apply_gain(half_amplitude_in_db) 
half_amplitude2 = sound.apply_gain(-6.0) 
half_amplitude3 = sound - 6.0 

# Assuming 16-bit sound, that’s ~90dB dynamic range. 
# so -45dB is half way to silent. 
# Note: that is A LOT quieter 
half_way_to_silent = sound - 45.0 

希望這有助於。

注:在看規格,我認爲你需要做的是:

web_API_gain_value = 0.5 

gain_in_db = ratio_to_db(web_API_gain_value) 

sound_after_gain = sound.apply_gain(gain_in_db) 
+0

謝謝你,是沒有的伎倆!我完全可以通過使用您提供的說明覆制相關網站的行爲 - 我完全錯誤地使用了ratio_to_db函數,因爲我完全不知道它實際做了什麼。正如我所說我沒有太多的音頻處理背景等,但你的解釋清除了一些東西給我。我仍然對16位評論感到困惑。你的意思是「約90dB」 - 它只能存儲該幅度,即最大響度?如果我真的有16位文件,不會減少120db是「太多」了嗎? – cryzed 2015-02-08 01:36:29