音频分割
等长切割 / 按静音段切割 / 自定义时间点 · 批量导出
等长分割/静音分割
等长切割 / 按静音段切割 / 自定义时间点 · 批量导出
适合有声书 / 播客 / 会议录音拆分
等长切割:适合有声书章节统一时长、会议录音按 30 分钟切片、播客上传分集。
静音切割:自动识别说话间隔,适合分割对话 / 多段演讲。阈值越严格段越少,建议 -35 ~ -45 dB。
自定义时间点:精确控制分割点。先在波形工具查看后填入具体秒数。
了解工具定位 · 使用场景 · 对比优势
将音频文件按固定时长或静音片段切分成多段。适合播客剪辑、会议录音整理、长语音分割等场景。上传文件后选择等长分割(设置每段时长)或静音分割(设定静音阈值与最短静音时长),即可批量输出分段音频。文件在浏览器或后端处理,不存储原始音频。
播客制作人录制了一期 2 小时的访谈,中间有多次停顿、喝水、翻稿子的静音段。手动裁剪需要逐帧听,耗时 40 分钟。使用静音分割功能,设定 1 秒静音阈值,工具自动识别所有无声间隙并切分,直接得到 10 段有效对话片段,后续再拼接或标注章节即可发布,节省 80% 的粗剪时间。
在线教育讲师录制了一节 90 分钟的数学课,包含概念讲解、例题演示、习题练习三个环节。用等长分割功能,按 30 分钟一段切为 3 段,每段对应一个知识点,方便上传到课程平台作为独立章节,学生可以按需跳转学习,不必拖动长视频找位置。
独立音乐人录制了一首 8 分钟的编曲 demo,包含前奏、主歌、副歌、桥段、尾奏。用静音分割(设定 0.5 秒静音阈值)自动识别段落间的自然空白,快速切出 5 个音频块,方便单独导出每个段落进行混音调整或发给乐队成员参考,避免手动标记时间轴。
商务人士参加了一场 1 小时 20 分钟的电话会议,录音中有 3 次长时间静音(对方静音思考、网络卡顿)。使用静音分割功能,设定 2 秒静音阈值,自动移除超过 2 秒的无声片段,输出一份紧凑的 55 分钟会议记录音频,方便回听关键决策点,不必在静音段中快进。
| 维度 | 本工具 | Audacity | 传统方法(手动剪辑) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 本地软件处理,不联网 | 依赖本地存储,无网络传输 |
| 处理速度 | 中等文件(50MB 内)秒级完成 | 中等文件秒级完成,大文件需等待 | 数分钟至数小时,取决于文件长度和操作熟练度 |
| 离线可用 | 需网络加载,加载后可离线使用 | 完全离线可用 | 完全离线可用 |
| 大小限制 | 受浏览器内存限制,通常 200MB 内 | 无严格限制,取决于本地硬件 | 无严格限制,取决于本地硬件 |
| 收费 | 免费 | 免费开源 | 免费(需已有剪辑软件) |
| 注册 | 无需注册 | 无需注册 | 无需注册 |
| 操作门槛 | 上传即分割,无需学习 | 需学习软件界面和操作流程 | 需掌握剪辑软件基本操作 |
| 分割方式 | 等长分割 + 静音检测分割 | 等长分割 + 静音检测 + 手动标记 | 手动标记时间点后逐段分割 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 30秒 | 输出 2 个音频片段,每段 30 秒(最后一段不足 30 秒则保留剩余时长) | 典型场景:将长音频等长切分为固定时长片段 |
| 静音检测阈值:-50dB,静音时长:2秒 | 在静音处切割,输出 N 个片段(数量取决于音频中的静音段落数) | 典型场景:去除播客或录音中的空白停顿 |
| 等长分割:1秒 | 输出大量 1 秒片段(若原始音频为 60 秒,则输出 60 个片段) | 边界 case:极短切割时长,适合语音或音效素材库 |
| 静音检测阈值:-90dB,静音时长:0.5秒 | 几乎不切割(极低阈值+极短静音时长,仅极安静处才触发) | 边界 case:阈值过低导致静音检测失效 |
| 等长分割:600秒(10分钟) | 输出 1 个完整片段(若原始音频不足 10 分钟) | 边界 case:切割时长超过音频总长,不切分 |
| 静音检测阈值:-20dB,静音时长:10秒 | 仅在有长段安静处切割(如录音中的大段空白) | 易错 case:阈值过高+时长过长,可能错过短停顿 |
| 等长分割:0秒 | 提示错误:切割时长必须大于 0 | 易错 case:新手误输入 0 或负数 |
静音检测阈值设为 -50 dBFS,结果一个 3 分钟的播客被切成了 60 段先设为 -30 dBFS,观察分割结果;若片段太少再逐步降低到 -40 dBFS阈值绝对值越小(如 -50 dBFS),检测越灵敏,连呼吸声、背景底噪都会被当作静音起点,导致过度分割。
静音时长设为 0.1 秒,结果每个单词之间的短暂停顿都被切断对话类音频至少设为 0.8-1.5 秒;音乐类设为 2-5 秒自然语言中单词间停顿仅 0.05-0.3 秒;设太短会把完整句子拆成碎片。
输入 '2' 但没选单位,以为默认是分钟,实际默认是秒,结果只切出 2 秒片段明确选择 '分钟' 或输入 '120'(秒)不同工具对单位的默认值不同(秒/分钟/毫秒),不指定单位会导致预期片段长度差 60 倍。
一个 10 分 10 秒的音频,设每段 5 分钟,最后一段只有 10 秒,直接丢弃检查工具是否有 '保留最后不完整片段' 选项,若无则手动调整总时长或分段数等长分割按固定时长切分,总时长不能被整除时,最后一段必然短于设定值。有些工具会丢弃它。
上传 10 个 MP3,分割后得到 30 个 WAV 文件,体积从 50MB 膨胀到 500MB使用前确认输出格式选项,若支持则选择 '保持原格式' 或 'MP3'FFmpeg 默认输出格式可能是无压缩 PCM(WAV),文件体积是 MP3 的 5-10 倍。
音频是 A-B-C 三段,静音分割后输出顺序是 B-A-C分割前检查音频文件元数据是否有 '非连续录制标记';若无则直接按时间戳排序某些录音设备会在静音处插入时间戳标记,FFmpeg 静音检测可能按标记而非实际时间顺序输出。
设每段 1.5 秒,结果工具报错 'invalid duration' 或自动取整为 1 秒将 1.5 秒改为 1500 毫秒(如果工具支持毫秒级输入)或 1 秒 500 毫秒部分工具只接受整数秒或毫秒;浮点秒数会被直接截断或报错,导致精度丢失。
公式推导 · 流程图解 · 依据出处
N = ceil(T / L) 或 N = ceil(T / L) + 1(含首尾静音段)
N — 分割后片段总数(整数)T — 音频总时长(秒)L — 每段目标时长(秒)一段 125 秒的播客录音,每段分割为 30 秒。T=125,L=30。N = ceil(125 / 30) = ceil(4.1667) = 5。实际输出 5 段,前 4 段各 30 秒,最后一段 5 秒。若启用静音检测,实际分割点会微调至最近的静音位置,片段时长可能略偏离 L。
适用于等长分割模式(固定时长切分)。静音分割模式使用 RMS 能量阈值算法,不适用此公式。公式基于数学取整运算,无特定论文来源。
3 种主流语言 · 复制即用
import subprocess
import os
# 等长分割:每段 30 秒,输出到 output 目录
input_file = "input.mp3"
segment_duration = 30 # 秒
output_dir = "segments"
os.makedirs(output_dir, exist_ok=True)
# ffmpeg -i input.mp3 -f segment -segment_time 30 -c copy output_dir/out_%03d.mp3
cmd = [
"ffmpeg", "-i", input_file,
"-f", "segment",
"-segment_time", str(segment_duration),
"-c", "copy",
os.path.join(output_dir, "out_%03d.mp3")
]
subprocess.run(cmd, check=True)
print(f"已分割为 {segment_duration} 秒等长片段,保存在 {output_dir}/")
package main
import (
"fmt"
"os"
"os/exec"
"strconv"
)
func main() {
input := "input.mp3"
segmentDuration := 30 // 秒
outputDir := "segments"
os.MkdirAll(outputDir, 0755)
// ffmpeg -i input.mp3 -f segment -segment_time 30 -c copy segments/out_%03d.mp3
cmd := exec.Command("ffmpeg",
"-i", input,
"-f", "segment",
"-segment_time", strconv.Itoa(segmentDuration),
"-c", "copy",
outputDir+"/out_%03d.mp3",
)
if err := cmd.Run(); err != nil {
fmt.Fprintf(os.Stderr, "分割失败: %v\n", err)
os.Exit(1)
}
fmt.Printf("已分割为 %d 秒等长片段,保存在 %s/\n", segmentDuration, outputDir)
}
const { execSync } = require('child_process');
const path = require('path');
const fs = require('fs');
const input = 'input.mp3';
const segmentDuration = 30; // 秒
const outputDir = 'segments';
fs.mkdirSync(outputDir, { recursive: true });
// ffmpeg -i input.mp3 -f segment -segment_time 30 -c copy segments/out_%03d.mp3
try {
execSync(
`ffmpeg -i "${input}" -f segment -segment_time ${segmentDuration} -c copy "${path.join(outputDir, 'out_%03d.mp3')}"`,
{ stdio: 'inherit' }
);
console.log(`已分割为 ${segmentDuration} 秒等长片段,保存在 ${outputDir}/`);
} catch (err) {
console.error('分割失败:', err.message);
process.exit(1);
}
10 个高频疑问