基频提取
提取基频的方法,参考这个slides总结的不错:
基频统计
用librosa.pyin提取C2-C5之间的基频,提取速度一般,删除基频为nan的值,通过hierarchical softmax loss预测基频。
在AISHELL-3的4000多条音频上,
pitch_max: 523.2511306011972
pitch_min: 65.40639132514966
pitch_norm_max: 11.53798396622049
pitch_norm_min: -7.709014711370838
在Emilia的40000条中英文音频上,
pitch_max: 523.2511306011972
pitch_min: 65.40639132514966
pitch_norm_max: 16.46252316152281
pitch_norm_min: -5.629888363117817
能量统计
参数sample_rate=24000、hop_length=320,通过线性谱按frame计算能量,计算速度很快。
在AISHELL-3的训练集4000条上,
energy_max: 201.66761779785156
energy_min: 0.0
energy_norm_max: 8.350774765014648
energy_norm_min: -2.187436580657959
在Emilia的40000条中英文音频上,
energy_max: 374.07879638671875
energy_min: 0.0015885174507275224
energy_norm_max: 14.399930953979492
energy_norm_min: -2.2199208736419678
在Emilia的64万条中英文音频上,
energy_max: 426.4949645996094
energy_min: 0.0
energy_norm_max: 18.694534301757812
energy_norm_min: -3.551600456237793
librosa
这是功能强大的音频和音乐分析库,缺点是暂时不支持GPU加速。
numba版本问题
librosa依赖numba版本,比如pyin计算pitch,会莫名其妙奔溃,升级numba到最新版,问题解决。
pyin提取基频
这个任务每个进程会占用100% CPU、0.5%内存,是CPU敏感任务。
from joblib import Parallel, delayed
def get_pitch(data):
librosa.pyin(...)
pitchs = Parallel(n_jobs=n_workers)(delayed(get_pitch)(x) for x in xs)