音频变速(不变调)
0.25x - 4x 倍速调节 · 保持音调不变 · WSOLA 算法 · 浏览器本地处理
不变调变速(atempo)
0.25x - 4x 倍速调节 · 保持音调不变 · WSOLA 算法 · 浏览器本地处理
支持 MP3 / WAV / FLAC · 不上传
WSOLA(Waveform Similarity OverLap-Add):工业级时间拉伸算法,将音频分块后在合成点附近搜索相似度最高的源帧位置进行重叠相加。保持音调不变,速度调整范围 0.25-4×。语音 / 音乐皆适用,但极端倍速(< 0.4× 或 > 3×)有金属感。
采样率法:直接重采样改变播放速度,类似播放器倍速按钮。速度变 2× 则音调也升 1 个八度。适合不在意音调的场景,处理极快。
用途:听课加速 / 听书 / 视频解说快放 / 慢动作配音 / 节奏改编。
了解工具定位 · 使用场景 · 对比优势
上传音频文件,在不改变音调的前提下改变播放速度。适合播客剪辑、语言学习、音乐练习等场景。基于 FFmpeg atempo 算法处理,文件仅做本地计算,不上传服务器。
外语学习者在听原速播客或新闻时,常因语速过快抓不住连读和弱读。用本工具将音频降速至 0.7x-0.8x,人声依然保持自然音调,不出现「小黄人」效果。逐句听清发音细节后,再逐步提速回原速,实现从「听不清」到「听得懂」的渐进训练。
短视频创作者录制了口播素材,但语速偏慢导致视频拖沓。用本工具将音频提速至 1.1x-1.2x,同时保持音色不变,避免「加速后变尖」的廉价感。提速后的音频可直接替换原音轨,省去逐段剪辑的麻烦,成片节奏更紧凑。
通勤路上听有声书,原速 1x 太慢、2x 又容易漏信息。用本工具在 1.3x-1.5x 之间微调,找到「听得清且省时间」的最佳倍速。不变调特性确保朗读者的情感起伏和语调变化不被破坏,比普通播放器的「快速变调」体验好得多。
乐手想扒一段快速吉他 solo 或钢琴华彩,原速下音符密集难以分辨。用本工具将音频降速至 0.5x-0.6x,音高保持不变,每个音符的时值和音高都清晰可辨。扒谱完成后,再对比原速检查节奏准确性,大幅提升扒谱效率。
播客制作人录制了 1 小时对话,嘉宾某段语速过快导致听感紧张。用本工具单独将那一段降速至 0.9x,同时保持音色自然,无需重录。处理后的片段与原音频无缝衔接,听众不会察觉速度变化,整体听感更舒适。
| 维度 | 本工具 | Audacity | 传统方法(硬件/人工) |
|---|---|---|---|
| 处理速度 | 秒级(实时预览) | 需等待渲染进度条 | 需手动计算并重新录制,耗时数十分钟 |
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 本地软件处理,文件不离开电脑 | 依赖外部录音棚或后期人员,存在文件外泄风险 |
| 操作步骤 | 拖入文件 → 设置倍速 → 下载 | 导入文件 → 选择效果 → 设置参数 → 预览 → 导出 | 找设备 → 调速录制 → 剪辑拼接 → 转格式 |
| 倍速精度 | 支持 0.5x - 2.0x,步进 0.01 | 支持 0.01x - 100x,参数更细 | 依赖硬件转速,精度低(通常仅 33/45/78 转) |
| 离线可用 | 是(加载完成后断网可用) | 是(完全本地软件) | 是(硬件设备) |
| 文件格式 | 常见音频格式(MP3/WAV/OGG/FLAC) | 支持几乎所有音频格式 | 仅支持模拟信号或特定数字格式 |
| 收费模式 | 免费 | 免费(开源) | 需购买硬件或支付人工费 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 120 | 时长变为 100 秒(加速 20%) | 典型场景:缩短音频时长 |
| 80 | 时长变为 125 秒(减速 20%) | 典型场景:放慢音频细节 |
| 50 | 时长变为 200 秒(减速 50%) | 边界 case:最大减速值,音频拉长一倍 |
| 200 | 时长变为 50 秒(加速 100%) | 边界 case:最大加速值,音频缩短一半 |
| 100 | 时长不变(原始速度) | 边界 case:100% 代表无变化 |
| 0 | 报错:速度值必须大于 0 | 易错 case:0 或负数不被接受 |
| 150.5 | 时长变为约 66.67 秒(加速 50.5%) | 易错 case:支持小数精度,非整数输入 |
2x 或 1.5倍 或 150%1.5atempo 只接受纯浮点数(如 0.5、1.0、2.0),带字母或汉字会被解析为无效输入,导致工具报错或结果异常
0.25 或 3.00.5 或 2.0FFmpeg atempo 滤波器单次调用仅支持 0.5–2.0 倍;超出范围需串联多个 atempo(如 4 倍 = atempo=2.0,atempo=2.0),本工具暂不支持自动串联
上传 .wma 或 .ra 或 .m4a(AAC 编码)上传 .mp3、.wav、.ogg、.flacFFmpeg 虽然支持众多格式,但浏览器端 WASM 版本仅编译了常见解码器;.wma 等格式缺少对应解码器,会直接失败
希望声音变尖(变调)却输入 2.0 倍速明确需求:变速(改变播放速度,音高不变) vs 变调(改变音高,速度不变)atempo 是纯变速(不变调)滤波器;若需要变调效果(如升 Key),应使用 rubberband 或 asetrate 配合 atempo,本工具不提供变调功能
上传 200MB 的 .wav 文件上传前先用其他工具压缩到 50MB 以内,或使用短片段(<5 分钟)测试浏览器 WASM 处理大文件时内存占用 ≈ 原始 PCM 数据大小(CD 音质 1 分钟 ≈ 10MB);200MB 文件解码后可能超过 1GB,导致标签页崩溃
认为 2 倍速后音质和原始文件一样接受轻微音质损失:atempo 使用时间域拉伸算法,高频细节会略有模糊atempo 基于 WSOLA(波形相似重叠相加)算法,在 0.5–2.0 范围内音质可接受,但极端倍速或复杂音乐中可能出现金属声/回声伪影
输入 0.5 以为时长减半(实际时长翻倍)理解:倍数 > 1 = 变快(时长缩短),倍数 < 1 = 变慢(时长延长)atempo 参数是速度倍率,不是时长倍率。2.0 倍速 → 时长减半;0.5 倍速 → 时长翻倍。常见混淆:0.5 倍速实际是慢放
公式推导 · 流程图解 · 依据出处
S_out = S_in × (T_in / T_out)
S_out — 输出音频采样点数(帧数)S_in — 输入音频采样点数(帧数)T_in — 输入音频原始时长(秒)T_out — 输出音频目标时长(秒)一段 30 秒的音频,采样率 44100 Hz,总采样点 S_in = 30 × 44100 = 1,323,000。希望变速到 20 秒(T_out=20),则 S_out = 1,323,000 × (30/20) = 1,984,500。FFmpeg atempo 滤波器通过时域拉伸(WSOLA 算法)在保持音调不变的前提下,将 1,323,000 个采样点重采样为 1,984,500 个,输出时长 20 秒。
适用于 atempo 滤波器基于 WSOLA(波形相似叠加)算法的不变调变速。仅支持 0.5x ~ 2.0x 倍率(对应 T_out/T_in 比值 0.5~2.0),超出范围需级联多个 atempo 实例。不适用于变调变速(如音高偏移)或非实时处理场景。
3 种主流语言 · 复制即用
import subprocess
import os
# 使用 FFmpeg atempo 滤波器实现不变调变速
# 速度因子 0.5~2.0,1.0 为原速
input_file = "input.mp3"
output_file = "output.mp3"
speed = 1.5 # 1.5 倍速
# atempo 滤波器链:单次最大支持 2.0,超过需串联
if speed > 2.0:
# 例如 4 倍速 = 2.0 * 2.0
filters = ",".join([f"atempo=2.0"] * int(speed / 2.0))
if speed % 2.0 != 0:
filters += f",atempo={speed / (2.0 * int(speed / 2.0)):.2f}"
else:
filters = f"atempo={speed}"
cmd = [
"ffmpeg",
"-i", input_file,
"-filter:a", filters,
"-c:a", "libmp3lame", # 保持 mp3 编码
"-q:a", "2", # 高质量
output_file
]
try:
subprocess.run(cmd, check=True, capture_output=True, text=True)
print(f"成功:{input_file} → {output_file}({speed}x 倍速,音调不变)")
except subprocess.CalledProcessError as e:
print(f"FFmpeg 错误:{e.stderr}")package main
import (
"fmt"
"os"
"os/exec"
"strconv"
"strings"
)
// 使用 FFmpeg atempo 实现不变调变速
func main() {
input := "input.wav"
output := "output.wav"
speed := 1.5 // 速度因子
// 构建 atempo 滤波器参数
var filters []string
if speed > 2.0 {
// 超过 2.0 需要串联多个 atempo
count := int(speed / 2.0)
remainder := speed / float64(count*2)
for i := 0; i < count; i++ {
filters = append(filters, "atempo=2.0")
}
if remainder != 1.0 {
filters = append(filters, fmt.Sprintf("atempo=%.2f", remainder))
}
} else {
filters = append(filters, fmt.Sprintf("atempo=%.2f", speed))
}
filterArg := strings.Join(filters, ",")
cmd := exec.Command("ffmpeg",
"-i", input,
"-filter:a", filterArg,
"-c:a", "pcm_s16le", // WAV 无损格式
output,
)
if err := cmd.Run(); err != nil {
fmt.Fprintf(os.Stderr, "FFmpeg 执行失败: %v\n", err)
os.Exit(1)
}
fmt.Printf("变速完成:%s → %s(%.2fx 倍速,音调不变)\n", input, output, speed)
}// 浏览器端使用 Web Audio API 实现不变调变速
// 需要用户交互触发(浏览器安全策略)
async function changeSpeed(audioFile, speed) {
// speed: 0.5~2.0(浏览器原生限制)
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
// 1. 加载音频文件
const arrayBuffer = await audioFile.arrayBuffer();
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
// 2. 创建音源节点
const source = audioContext.createBufferSource();
source.buffer = audioBuffer;
// 3. 创建变速节点(playbackRate 改变速度同时改变音调)
// 要实现不变调,需要配合 detune 补偿,但 detune 只能微调
// 更精确的不变调需使用 AudioWorklet 或第三方库
source.playbackRate.value = speed;
// 4. 连接并播放
source.connect(audioContext.destination);
source.start(0);
console.log(`正在以 ${speed}x 倍速播放(注意:playbackRate 会改变音调)`);
console.log('如需真正不变调,请使用 FFmpeg 服务端处理');
}
// 使用示例(假设用户选择了文件)
// document.getElementById('fileInput').addEventListener('change', (e) => {
// const file = e.target.files[0];
// changeSpeed(file, 1.5);
// });8 个高频疑问