用FFmpeg改变音频音调
改变音频音调是音频后期创作中常用的表现手法:
- 人声修音:在歌曲演唱中微调音调(通常±3个半音内)使演唱者的音准更准确,是后期修音的核心技术之一。
- 变调不变速:用于语音配音的角色变换——如将正常语速的旁白变为'小黄人'效果(升调)或'怪兽'效果(降调),同时保持原语速不变。
- 乐器调音:将录制的乐器音轨与标准音高对齐(如A4=440Hz),在乐队合奏中确保所有乐器音高统一。
- 创意效果:极端变调可用于营造特殊氛围——降调产生沉重压抑感,升调产生轻快俏皮感,在配乐和音效设计中广泛应用。
🎵 FFmpeg变调原理详解
1. asetrate 滤镜:通过改变采样率变调
音频的音调(pitch)由声音信号的频率决定。采样率(sample rate)表示每秒采集的样本数。当使用 asetrate 强制改变输出的采样率时,原有的音频数据被以不同的速度"播放",从而改变频率,使音调升高或降低。
例如原音频采样率为 44100 Hz(CD音质),执行 asetrate=44100*1.5=66150 后,FFmpeg 将输出标记为采样率 66150 Hz,但音频样本本身没有变化。播放器会以 66150 Hz 的速度还原音频,相当于每秒播放更多的样本,频率整体提升 1.5 倍,因此音调升高了半音约 7 个(一个八度对应频率翻倍,即 2 倍 = 1200 音分)。副作用是播放速度也变为原来的 1.5 倍,时长缩短。
同理 asetrate=44100*0.8=35280 将采样率降低,播放器以更慢速度回放,频率降低,音调下降,速度变慢,时长拉长。
2. 变调不变速:asetrate + atempo 组合
变调后要恢复原速,需要使用 atempo 滤镜调整播放速度。由于 asetrate 将速度改变了 N 倍,只需用 atempo=1/N 恢复。例如 asetrate=44100*1.2, atempo=1/1.2:先升调 1.2 倍(速度变为 1.2x),再用 atempo 将速度降回 1x,最终实现只升调不变速的效果。注意 atempo 的取值范围为 0.5~2.0,因此 asetrate 倍率也尽量控制在该范围内。
3. rubberband 滤镜:高质量变调
rubberband 基于 Rubber Band Library(相位声码器技术),通过频域分析将音频分解为音调(pitch)和速度(tempo)两个独立维度,可分别调节而不互相影响。相比 asetrate 方案,rubberband 变调后音质损失更小,尤其适合处理人声和音乐旋律。
rubberband 的参数:pitch 以半音(semitone)为单位(正数升高,负数降低),tempo 以倍率调节速度。例如 rubberband=pitch=3 升高 3 个半音(即小三度),rubberband=pitch=2.0:tempo=1.5 既升调又变速。
两种方法适用场景:日常简单变调用 asetrate+atempo 即可;追求高音质或精确半音控制应使用 rubberband。
{{v.name}}
升高音调,同时速度变快,代码如下
$ ffmpeg -i input.mp3 -af "asetrate=44100*1.5" output_higher_pitch.mp3
升高音调,保持原速,代码如下
$ ffmpeg -i input.mp3 -af "asetrate=44100*1.2, atempo=1/1.2" output_higher_pitch_constant_speed.mp3
降低音调,同时速度变慢,代码如下
$ ffmpeg -i input.mp3 -af "asetrate=44100*0.8" output_lower_pitch.mp3
降低音调,保持原速,代码如下
$ ffmpeg -i input.mp3 -af "asetrate=44100*0.9, atempo=1/0.9" output_lower_pitch_constant_speed.mp3
rubberband 滤镜可以更高质量地实现变调不变速。rubberband 升高 3 个半音,代码如下
$ ffmpeg -i input.mp3 -af "rubberband=pitch=3" output_higher_pitch_rubberband.mp3
rubberband 降低 4 个半音,代码如下
$ ffmpeg -i input.mp3 -af "rubberband=pitch=-4" output_lower_pitch_rubberband.mp3
rubberband 同时改变音调和速度,代码如下
$ ffmpeg -i input.mp3 -af "rubberband=pitch=2.0:tempo=1.5" output_pitch_and_tempo.mp3