Python分析基频和能量

基频提取

提取基频的方法,参考这个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)

Leave a Reply

Your email address will not be published. Required fields are marked *