私はPythonから(オーディオのラウドネスを計算するためのアルゴリズムです。)を何度も何度も使用しlibreplaygain.so
てReplayGain
、オーディオファイルからデータを渡してきました。これが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>
。