机器学习 - 解决Python舍入错误的任何建议?

时间:2018-04-05 18:37:10

标签: python rounding librosa

我正在使用Python来隔离音乐中的元素。训练模型,我将音频分成帧,每个帧都有一个标签 - 1或0.不幸的是,由于舍入错误,我的标签总是短或1或2帧。

将我的音频转换为帧,我的值为(13,3709)

    s = [] 
    for y in audio:
        mfcc = librosa.feature.mfcc(y= y, sr = 16000, n_mfcc=13, n_fft=2048, hop_length = 1024)
        s.append(mfcc)

将我的文本文件(对于我正在使用的mp3)从毫秒转换为帧数,我得到一个3708的向量值。

    output = []              
    for block in textCorpus:
        block_start = int(float(block[0]) * 16000 / 1024)   # Converted to frame number
        block_end = int(float(block[1]) * 16000 / 1024)     # Converted to frame number
        singing = block[2]
        block_range = np.arange(block_start, block_end, 1)  # Step size is 1 (per frame number)
# extraneous code 

我尝试在Decimalmath.floor变量中使用math.ceilblock_startblock_stop,但我似乎无法匹配我的音频帧长。

2 个答案:

答案 0 :(得分:1)

使用标准库中的Fraction包: https://docs.python.org/2/library/fractions.html

对于精确有理数运算很有用。

答案 1 :(得分:0)

如果您按顺序获取块,也许您可​​以放弃乘法和除法,只需通过简单的添加来解决它们:

def labelToFrames(textCorpus):
    output    = []  
    offset    = 0
    increment = 0.064           # or 1024/16000      
    for block in textCorpus:
        block_start = block[0]   
        block_end   = block[1]    
        singing     = block[2]
        while offset < block_end:
            ms_start = '{0:.3f}'.format(offset) 
            offset   = min(block_end,offset + increment)          
            ms_end   = '{0:.3f}'.format(offset)   
            add_to_output = [ms_start, ms_end, singing]
            output.append(add_to_output)
    return output