Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';使用libreplaygain.so和numpy不会得到合理的结果_Python_Numpy_Ctypes - Fatal编程技术网

Python Can';使用libreplaygain.so和numpy不会得到合理的结果

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

我一次又一次地尝试使用python中的
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:(好的,这些值似乎与命令行工具的关联性很差。我认为这只是一个规范化问题。感谢您的解决方案!