音频变速

不变调变速(atempo)

426 次访问
TIME STRETCH · WSOLA ALGORITHM

音频变速(不变调)

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,同时保持音色自然,无需重录。处理后的片段与原音频无缝衔接,听众不会察觉速度变化,整体听感更舒适。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具Audacity传统方法(硬件/人工)
处理速度秒级(实时预览)需等待渲染进度条需手动计算并重新录制,耗时数十分钟
数据隐私纯浏览器处理,文件不上传服务器本地软件处理,文件不离开电脑依赖外部录音棚或后期人员,存在文件外泄风险
操作步骤拖入文件 → 设置倍速 → 下载导入文件 → 选择效果 → 设置参数 → 预览 → 导出找设备 → 调速录制 → 剪辑拼接 → 转格式
倍速精度支持 0.5x - 2.0x,步进 0.01支持 0.01x - 100x,参数更细依赖硬件转速,精度低(通常仅 33/45/78 转)
离线可用是(加载完成后断网可用)是(完全本地软件)是(硬件设备)
文件格式常见音频格式(MP3/WAV/OGG/FLAC)支持几乎所有音频格式仅支持模拟信号或特定数字格式
收费模式免费免费(开源)需购买硬件或支付人工费

使用指南

上手步骤 · 输入输出 · 避坑提示

使用步骤

  1. 上传 MP3、WAV、M4A 或 OGG 音频文件,单文件 ≤ 200MB
  2. 在「速度」输入框填写目标倍率(0.5–2.0,如 1.5 表示加快 50%)
  3. 点击「开始处理」按钮,工具使用 atempo 算法保持音调不变
  4. 处理完成后点击「下载」按钮保存变速后的音频文件

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
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:支持小数精度,非整数输入

常见错误对照7 个常踩的坑 · 错误 → 修复

1. 把变速倍数写成分数或带单位

错误
2x 或 1.5倍 或 150%
修复
1.5

atempo 只接受纯浮点数(如 0.5、1.0、2.0),带字母或汉字会被解析为无效输入,导致工具报错或结果异常

2. 变速倍数超出 0.5–2.0 范围

错误
0.25 或 3.0
修复
0.5 或 2.0

FFmpeg atempo 滤波器单次调用仅支持 0.5–2.0 倍;超出范围需串联多个 atempo(如 4 倍 = atempo=2.0,atempo=2.0),本工具暂不支持自动串联

3. 上传了不支持的文件格式

错误
上传 .wma 或 .ra 或 .m4a(AAC 编码)
修复
上传 .mp3、.wav、.ogg、.flac

FFmpeg 虽然支持众多格式,但浏览器端 WASM 版本仅编译了常见解码器;.wma 等格式缺少对应解码器,会直接失败

4. 把变速和变调混为一谈

错误
希望声音变尖(变调)却输入 2.0 倍速
修复
明确需求:变速(改变播放速度,音高不变) vs 变调(改变音高,速度不变)

atempo 是纯变速(不变调)滤波器;若需要变调效果(如升 Key),应使用 rubberband 或 asetrate 配合 atempo,本工具不提供变调功能

5. 文件过大导致浏览器崩溃

错误
上传 200MB 的 .wav 文件
修复
上传前先用其他工具压缩到 50MB 以内,或使用短片段(<5 分钟)测试

浏览器 WASM 处理大文件时内存占用 ≈ 原始 PCM 数据大小(CD 音质 1 分钟 ≈ 10MB);200MB 文件解码后可能超过 1GB,导致标签页崩溃

6. 期望变速后无损音质

错误
认为 2 倍速后音质和原始文件一样
修复
接受轻微音质损失:atempo 使用时间域拉伸算法,高频细节会略有模糊

atempo 基于 WSOLA(波形相似重叠相加)算法,在 0.5–2.0 范围内音质可接受,但极端倍速或复杂音乐中可能出现金属声/回声伪影

7. 把变速倍数理解成时长比例

错误
输入 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 实例。不适用于变调变速(如音高偏移)或非实时处理场景。

原理图

原始音频FFmpeg atempo不变调变速变速音频速度系数:0.5~2.0(1.0 = 原速)
用户输入 本地处理 输出结果

开发者集成

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 个高频疑问

音频变速后声音变得很不自然,像机器人,是怎么回事?
这是『变调』了。本工具默认用 atempo 算法,只改变速度不改变音调,但如果一次变速倍数过大(比如 2 倍以上),算法为了保持音调完整会牺牲部分波形平滑度,听起来就有『电子味』。建议分步变速:先 1.5 倍,再 1.33 倍,最终 2 倍。另外输入文件本身采样率低(如 8kHz 电话录音)或码率低(<64kbps),变速后失真会更明显。
为什么我上传的 MP3 文件提示格式不支持?
工具底层用 FFmpeg 处理,理论上支持 MP3、WAV、FLAC、AAC、OGG、M4A 等常见音频格式。如果报错,最常见原因是文件扩展名与实际编码不匹配(比如把 .wav 后缀的 AIFF 文件当成 WAV 上传)。另一个可能是文件损坏或采样率低于 8000Hz。可以先用 Audacity 或格式工厂把文件转成标准 44100Hz 采样率的 WAV 再上传。
变速后文件变大了很多,能压缩吗?
变速本身不改变采样率和位深度,但输出格式固定为 WAV(无损),所以文件体积会变大。如果原文件是 128kbps MP3 压缩到 1MB,变速后输出 WAV 可能到 10MB。需要小体积的话,可以在本地用格式工厂或 FFmpeg 手动转回 MP3:ffmpeg -i output.wav -b:a 128k output.mp3。本工具目前不提供压缩选项。
在线变速和用 Audacity 本地变速有什么区别?
核心算法一样,精度无差别。区别三点:1) 本工具纯浏览器端处理(WASM+FFmpeg),文件不上传服务器,隐私性更好;Audacity 需要下载安装,文件在本地处理。2) 本工具不支持多轨编辑或淡入淡出等后期效果,只做纯粹变速。3) 文件大小限制取决于浏览器内存——超过 200MB 的文件可能卡死,建议用 Audacity 处理大文件。
我想把 1 小时播客加速到 1.5 倍听,工具能处理吗?
可以,但注意浏览器内存限制。1 小时 128kbps MP3 约 55MB,加载后占用内存约 200-300MB,普通电脑没问题。手机浏览器(尤其是 iOS Safari)内存更小,可能崩溃。建议分段处理:用剪映或 Audacity 把播客剪成 20 分钟一段,分别变速后再合并。另外 1.5 倍是 atempo 的舒适区,音质损失极小。
为什么变速后音频时长和计算出来的不一样?
atempo 算法在变速时会做帧对齐,导致实际时长有 ±0.1% 的微小误差(比如 10 分钟文件 1.5 倍速后应为 6 分 40 秒,实际可能是 6 分 39.8 秒)。这是浮点运算的舍入误差,人耳听不出。如果必须精确到毫秒(如配音对轨),建议用 Audacity 的『时长拉伸』模式,允许指定精确目标时长。
这个工具能变速视频里的音频吗?
工具只接受纯音频文件(MP3/WAV/FLAC 等),不支持视频上传。如果需要给视频变速不变调,建议用剪映或格式工厂的视频变速功能。如果手头只有视频,可以先用格式工厂把音频抽出来(提取音频),再上传到这里变速,最后用剪辑软件把变速后的音频替换回视频。
我试了 0.5 倍减速,结果文件播放时断断续续的,怎么办?
0.5 倍减速是 atempo 的极端倍数,算法需要插入大量采样点来『拉长』音频,对输入文件的码率和采样率要求很高。建议:1) 确保原文件采样率 ≥ 44100Hz;2) 先降到 0.7 倍,再降到 0.5 倍(分两步);3) 如果原文件是低码率(<96kbps)的在线录音,先转成 WAV 再减速。如果还是卡顿,可能是浏览器性能不够,换 Chrome 或 Edge 试试。
选择 打开 +新窗口 esc关闭