Python Can';使用libreplaygain.so和numpy不会得到合理的结果
我一次又一次地尝试使用python中的Python Can';使用libreplaygain.so和numpy不会得到合理的结果,python,numpy,ctypes,Python,Numpy,Ctypes,我一次又一次地尝试使用python中的libreplaygain。因此,(ReplayGain是一种计算音频响度的算法。)从音频文件传递数据。这是Librelaygain的照片。我对ctypes和C一般都不太了解,所以我希望这可能是我愚蠢的问题,对其他人来说是显而易见的!以下是我正在使用的脚本: import numpy as np from scipy.io import wavfile import ctypes replaygain = ctypes.CDLL('libreplaygain
libreplaygain。因此,
(ReplayGain
是一种计算音频响度的算法。)从音频文件传递数据。这是Librelaygain的照片。我对ctypes
和C一般都不太了解,所以我希望这可能是我愚蠢的问题,对其他人来说是显而易见的!以下是我正在使用的脚本:
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
将numpy导入为np
从scipy.io导入wavfile
导入ctypes
replaygain=ctypes.CDLL('libreplaygain.so')
def计算回放(样本,帧速率=44100):
"""
灵感来自https://github.com/vontrapp/replaygain
"""
回放增益初始分析(帧速率)
块大小=10000
通道计数=样本。形状[1]
i=0
samples=samples.astype(np.float64)
而i*块大小<样本形状[0]:
通道左=样本[i*块大小:(i+1)*块大小,0]
通道右=样本[i*块大小:(i+1)*块大小,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.增益分析样本(样本左、样本右、通道左。形状[0],通道计数)
i+=1
返回replaygain.gain\u get\u chapter()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
帧速率,samples=wavfile.read('directions.wav')
samples=samples.astype(np.float64)/2**15
增益=计算重放增益(采样,帧速率=帧速率)
打印“建议增益:%f dB”%gain
增益=计算重放增益(np.random.random((441000,2))*2-1,帧速率=44100)
打印“建议增益:%f dB”%gain
脚本运行,但我无法获得与命令行工具replaygain
相同的值。事实上,我总是得到80.0
。若要尝试,您可以用任何声音文件替换“directions.wav”。。。并将结果与命令的结果进行比较replaygain
gain\u get\u chapter()
返回一个双精度
,但“默认情况下,假定函数返回C int类型。”您应该执行以下操作
replaygain.gain_get_chapter.restype = ctypes.c_double
您还应该检查gain_init_analysis
和gain_analysis_samples
的返回值;如果这两个都不是1,那么还有其他问题。(这些实际上是int,因此您不必在那里做任何其他事情。)gain\u get\u chapter()
返回一个double
,但“默认情况下,假定函数返回C int类型。”
replaygain.gain_get_chapter.restype = ctypes.c_double
您还应该检查
gain_init_analysis
和gain_analysis_samples
的返回值;如果这两个都不是1,那么还有其他问题。(这些实际上是INT,因此您不必在那里做任何其他事情。)Oho!现在使用gain\u get\u chapter.restype=ctypes.c\u double
结果就不同了!它会随着不同的文件而改变:)不幸的是,它仍然与命令行工具给我的不同。但这绝对是一个进步!谢谢其他功能的结果是否为1?作为基本的健全性检查,结果是否与命令行工具给出的结果相关(例如,声音较大的文件的增益较低)?另外,您是否确定命令行工具使用的块大小相同,并且2**15
是正常化的正确数量?其他函数的结果为1。本质上这就是问题所在:我不知道程序需要什么数据。通常,声音被处理为无符号16位整数或区间[-1.0,1]中的浮点值,因此我在这里使用它返回0.000。我尝试过不进行规范化(scipy在[-215,215[]中返回值),得到65.57。命令行工具给出-3.53。我将尝试读取C代码(Brrrrr:(好的,这些值似乎与命令行工具的关联性很差。我认为这只是一个规范化问题。感谢您的解决方案!Oho!现在使用gain\u get\u chapter.restype=ctypes.c\u double
结果不同!它随不同的文件而变化:)不幸的是,它仍然不同于命令行工具提供给我的。但这绝对是一个改进!谢谢!其他函数的结果是1吗?作为基本的健全性检查,结果是否与命令行工具提供的结果相关(例如,文件声音越大,增益越低)?另外,您是否确定命令行工具使用相同的块大小,并且2**15
是正确的规格化量?其他函数的结果是1。本质上这就是问题所在:我不知道程序需要什么数据。通常声音被处理为无符号16位整数或间隔[-1.0,1]内的浮点[这就是我在这里使用的,它返回0.000。我尝试过不进行规范化(scipy返回[-215215,215[]中的值),得到65.57。命令行工具给出-3.53。我将尝试读取C代码(Brrrrr:(好的,这些值似乎与命令行工具的关联性很差。我认为这只是一个规范化问题。感谢您的解决方案!