2013-02-07 37 views
0

我一直在反覆嘗試使用libreplaygain.soReplayGain是一種用於計算音頻響度的算法),它從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>的結果進行比較。

回答

4

gain_get_chapter()返回double,但the ctypes docs say「默認情況下函數被假定爲返回C int類型。」你應該這樣做

replaygain.gain_get_chapter.restype = ctypes.c_double 

您也應該檢查的gain_init_analysisgain_analyze_samples的返回值;如果這些都不是1,那麼其他事情就會出錯。 (那些實際上是整數,所以你不應該在那裏做任何事情。)

+0

Oho!現在用'gain_get_chapter.restype = ctypes.c_double'結果是不同的!而且它會隨着不同的文件而改變:)不幸的是它和命令行工具給我的不同。但這絕對是一個改進!謝謝! – sebpiq

+0

其他功能的結果是1嗎?作爲一項基本的完整性檢查,完全根據命令行工具提供的結果(例如,較大的文件獲得較低的增益)?另外,你確定命令行工具是否使用相同的塊大小,並且'2 ** 15'是正確的數量? – Dougal

+0

其他函數的結果是1.基本上這是問題:我不知道程序期望的數據。通常聲音處理爲無符號的16位整數或浮點數[-1.0,1 [這就是我在這裏使用的返回0.000。我已經嘗試沒有正常化(scipy返回值[-2 ** 15,2 ** 15 [),我得到65.57。命令行工具提供-3.53。我會嘗試讀取C代碼(Brrrrr :( – sebpiq