在语音任务中,f0(pitch) 提取是必不可少的重要一环。常见的 pitch 提取算法, 包括 praat/Sptk 等praat/pyworld/sptk f0提取算法的python脚本。 在提取过程中,重要的两个参数是 f0_min 和 f0_max,上下限设置错误会导致基频提取发生 “倍频” or “半频” 错误。
半频/倍频错误是指在提取f0的过程中,因为周期计算错误,导致提取值为真实值一半或两倍。
这两个参数因人而异,例如男女说话人的基频范围可能差别较大,同一说话人在不同语句中基频也会有较大起伏,在一些特殊场景例如歌唱中,也会有较高的基频值。 因此,凭经验确定这两个参数并不靠谱,最近听大师介绍了一个基于数据统计的方法,感觉很有效,记录整理如下。
基于统计方法确定F0提取上下限参数
核心思想,对于足够大的采样样本来说,f0正确的分布应该满足正态分布or有偏正态分布。
对待提取数据,准备一个不太小的数据集(500条以上),这里以bzn-tts数据为例。
- 对每个发音人,说话的数据,使用30-1000的参数预提取。
- 画出 f0 对应统计直方图,看图决定上下限。如下图所示。
- 上限设置比较简单,可以比图片显示的最大值高100Hz左右即可。如果看到曲线分布包络右端,不平滑,可以适当需要调高。特别是在歌声数据下可能要格外注意。
- 下限设置,以不出现低频部分额外的一个分布尖峰为准,比如下图中70Hz那里存在明显尖峰,那么下限设置在70,可以消除掉这个尖峰。 (说明某些音频基频为120Hz,但发生半频错误被提成了60Hz)
- 用新找到的基频上下限重新提取,重复2~4,直至基频左右两端都光滑为止。

Note: 实测该方法针对单说话人无背噪音频数据,效果比较理想。多说话人场景可能不适用。