我一直在反覆嘗試使用libreplaygain.so
(ReplayGain
是一種用於計算音頻響度的算法),它從python傳遞數據,從音頻文件中傳遞數據。這裏是libreplaygain的the header file。我對和C一般都不太瞭解,所以我希望這可能是一個愚蠢的問題,對其他人來說非常明顯!下面是我使用的腳本:無法用libreplaygain.so和numpy得到明智的結果
import numpy as np
from scipy.io import wavfile
import ctypes
replaygain = ctypes.CDLL('libreplaygain.so')
def calculate_replaygain(samples, frame_rate=44100):
"""
inspired from https://github.com/vontrapp/replaygain
"""
replaygain.gain_init_analysis(frame_rate)
block_size = 10000
channel_count = samples.shape[1]
i = 0
samples = samples.astype(np.float64)
while i * block_size < samples.shape[0]:
channel_left = samples[i*block_size:(i+1)*block_size,0]
channel_right = samples[i*block_size:(i+1)*block_size,1]
samples_p_left = channel_left.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
samples_p_right = channel_right.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
replaygain.gain_analyze_samples(samples_p_left, samples_p_right, channel_left.shape[0], channel_count)
i += 1
return replaygain.gain_get_chapter()
if __name__ == '__main__':
frame_rate, samples = wavfile.read('directions.wav')
samples = samples.astype(np.float64)/2**15
gain = calculate_replaygain(samples, frame_rate=frame_rate)
print "Recommended gain: %f dB" % gain
gain = calculate_replaygain(np.random.random((441000, 2)) * 2 - 1, frame_rate=44100)
print "Recommended gain: %f dB" % gain
運行該腳本,但我不能得到相同的值與命令行工具replaygain
。事實上,我總是得到80.0
。嘗試使用任何聲音文件替換'directions.wav'...並將結果與命令replaygain <soundfile.wav>
的結果進行比較。
Oho!現在用'gain_get_chapter.restype = ctypes.c_double'結果是不同的!而且它會隨着不同的文件而改變:)不幸的是它和命令行工具給我的不同。但這絕對是一個改進!謝謝! – sebpiq
其他功能的結果是1嗎?作爲一項基本的完整性檢查,完全根據命令行工具提供的結果(例如,較大的文件獲得較低的增益)?另外,你確定命令行工具是否使用相同的塊大小,並且'2 ** 15'是正確的數量? – Dougal
其他函數的結果是1.基本上這是問題:我不知道程序期望的數據。通常聲音處理爲無符號的16位整數或浮點數[-1.0,1 [這就是我在這裏使用的返回0.000。我已經嘗試沒有正常化(scipy返回值[-2 ** 15,2 ** 15 [),我得到65.57。命令行工具提供-3.53。我會嘗試讀取C代碼(Brrrrr :( – sebpiq