哼一句歌,手机里的修音软件能把每个音的高低画成一条曲线;跟唱打分、自动修音、变声特效,背后都先要做同一件事:把声音的起伏一帧一帧量出来——这就是音高提取。AI 要理解一段音频里「谁在什么时刻到了哪个音」,第一步就是这项基础工作。它的核心任务是逐点求出基频、连成曲线,这篇讲清机制:基频是什么、追踪怎么完成、跑调检测怎么靠它实现,以及哪类声音最容易让它犯难;音高与时长分开处理的另一门技术,见变调不变速一篇。
起伏的来源:基频决定音高
先弄清声音里的「高低」从哪来。声带、琴弦振动时有一个基本频率,每秒振多少次,听感上就是这个音的高低——唱 do 与唱 mi,差别就在基频数值。基频之外,声音里还叠着大量倍频与共振成分,它们决定音色,不改变高低判断的主线。音高提取的任务因此很明确:在时间轴上逐点求出基频数值,连成一条随时间起伏的曲线。这条曲线是音频的「旋律地图」,修音、转谱、跟唱打分读的都是它。想看懂声音的频率结构怎么被呈现,频谱图一篇有直观的展开。
追踪怎么做:一帧一帧找周期
具体怎么求?音频先切成几十毫秒一帧,逐帧判断。时域的办法是找周期:人声的浊音波形有明显的重复单元,算法在波形里量出相邻两个重复单元的间隔,间隔的倒数就是基频。频域的办法是把一帧做频谱分析,在频谱里找间隔均匀的谱峰序列。两条路各有软肋:波形法怕噪声干扰,频域法怕倍频「骗人」——两倍频处的峰更亮时,算法可能把音高报高八度。所以实用的实现往往两路并用、互相校验,再加一道平滑:人声的音高不会一帧一跳变,前后帧结果连起来看,突变过大的按异常帧处理。跑完整段音频,就得到一条完整的音高曲线。
跑调检测:对着标准线比偏差
唱歌打分是音高提取最出圈的应用,机制并不神秘。先拿到歌曲的标准音高线——原唱逐帧的基频曲线或者曲谱的音符序列,再把演唱者的曲线叠上去逐段比较:偏离多少个半音、偏了多久、是滑音还是硬伤,都能量化成分数。跑调的判断因此有了客观依据:该到的音没到、到了但晃得厉害,曲线上一目了然。自动修音走的是同一条路,只是方向相反:提取出你的音高,量出与标准音的偏差,再把偏差搬回去,机制见自动修音一篇。提取的准头决定修音的上限,提取错半个音,修出来就差半个音。
难点在哪:重叠、气声与突变
音高提取的失手区也有规律。一是多声重叠:人声叠着伴奏,乐器也在发同频段的音,算法要先把人声从混合里择出来才能谈准确,这属于源分离的活。二是气声与假声:气声几乎没有清晰的周期,波形找不出重复单元,基频报告常常空缺或抖动。三是快速滑音:从一个音滑向另一个音的瞬间,帧内频率一直在变,任何一帧的单一数值都概括不了。工程上的应对是分场景调参:语音场景容忍抖动、按有声无声标注;唱歌场景对滑音段做细分处理。想亲手看看曲线长什么样,可以让豆包找一个在线音高分析工具的入口,把「为什么假声测不准」丢给 DeepSeek 展开解释,再拿一段自己的哼唱对照本文的难点清单听一遍。
| 失手场景 | 波形上的表现 | 为什么会失手 | 工程上的应对 |
|---|---|---|---|
| 多声重叠 | 人声与乐器在同一频段混在一起 | 要先择出人声才谈得上准确 | 走源分离这道工序 |
| 气声与假声 | 找不出重复单元,基频空缺或抖动 | 几乎没有清晰的周期 | 标为无声帧,语音场景容忍抖动 |
| 快速滑音 | 任何一帧的单一数值都概括不了 | 帧内频率一直在变 | 唱歌场景对滑音段做细分处理 |
音高提取速查
- 任务:逐帧求出基频,连成随时间起伏的音高曲线
- 两路:时域找波形周期,频域找谱峰间隔,互为校验
- 平滑:人声不会一帧一跳,突变过大的帧按异常处理
- 跑调检测:演唱曲线对照标准线,量偏差定分数
- 失手区:多声重叠、气声假声、快速滑音
音高提取快问快答
- 音高提取和变调是一回事吗?:两者是先后关系。提取是「量出」曲线,变调是「改动」信号,量准了才改得准;两件事怎么各管一段,见变调不变速一篇的拆解。
- 为什么清唱比带伴奏测得准?:混合信号里乐器与人声在同一频段纠缠,提取前通常要先做人声分离,分离质量直接决定曲线质量,清唱没有这道干扰。
- 提取结果里为什么有的帧没有数值?:那些帧被判定为无周期成分——气声、摩擦音、静音段都算,标注为无声帧,属于正常结果,不代表工具坏了。


