0

私はPythonから(オーディオのラウドネスを計算するためのアルゴリズムです。)を何度も何度も使用しlibreplaygain.soReplayGain、オーディオファイルからデータを渡してきました。これがlibreplaygainのヘッダーファイルです。私は一般的にCについてもあまり理解していないctypesので、それが私が愚かであるという問題であり、他の誰かにとって非常に明白である可能性があることを願っています!これが私が使用しているスクリプトです:

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

1 に答える 1

4

gain_get_chapter()を返しますdouble、ctypesのドキュメントには、「デフォルトでは、関数はCint型を返すと想定されています」と書かれています。あなたは次のようなことをする必要があります

replaygain.gain_get_chapter.restype = ctypes.c_double

gain_init_analysisgain_analyze_samples;の戻り値も確認する必要があります。それらが両方とも1でない場合は、他の問題が発生しています。(これらは実際にはintであるため、他に何もする必要はありません。)

于 2013-02-07T20:25:47.603 に答える