音频裁剪拼接

从音频里剪出一段导出 WAV,也能把多个片段(同一个文件的不同区间、或者几个不同文件)按顺序接成一个文件。波形上拖两头选区,先试听再导出。

可以一次选多个文件,也可以把文件直接拖到这个面板里。音频只在这台浏览器里解码,不会上传;能读什么格式取决于浏览器自带的解码器。

选择一个音频文件开始

使用说明

这一页有两条路。单段导出处理波形上当前选中的那一段:在波形上按住拖出一段,或者直接改起止秒数,两边是双向联动的,改哪一边另一边都会跟着走。多段拼接则按列表顺序把若干段首尾接成一个文件,每一段可以来自同一个文件的不同区间,也可以来自不同的文件。判断标准很简单:成品只需要一段就用单段导出;要把几段接起来(铃声串烧、录音拼接、把多段素材合成一条)就用多段拼接。

WAV 是未压缩的线性 PCM,16 位意味着每个采样点固定占 2 字节,所以体积只由时长、采样率、声道数决定,和你剪的内容一点关系都没有。按这个口径算,44100 Hz 立体声 16 位每秒钟是 172.3 KB,每分钟是 10.09 MB,一秒的字节数就是采样率乘声道数再乘 2。页面上的「预计体积」用的就是这个式子,导出后的「实际导出」和它基本一致——每段先四舍五入到整数采样点,几段拼起来会差几十字节。想变小只能降采样率、降声道数,或者导出后再用有损编码压一道,例如 ffmpeg 转成 192k 的 mp3。

拼接最容易被忽略的一步是统一规格。两段音频采样率不一样时直接接起来,第二段会以错误的速率播放:48000 Hz 的采样点按 44100 Hz 播放,时长会变成原来的 1.088 倍,音高同时降低约 8.8%。所以导出前每一段都会先重采样到你选的输出采样率,声道数也统一到目标声道——单声道要立体声就复制一份,立体声要单声道就把两路取平均。接缝处还有一个物理问题:前一段的最后一个采样通常不在零点,后一段又从另一个数值开始,这个突变听起来就是「啪」的一声。给每一段几十毫秒的淡入淡出把两端压到零,阶跃就没了,这也是默认打开「每个片段各自淡入淡出」的原因。

峰值归一化是把整段音频乘同一个系数,把最响的点拉到接近满量程(这里是 -0.09 dBFS),增益上限 +18 dB,超过这个倍数就不再放大,因为那时放大的只是底噪。它对拼接多个来源的素材尤其有用:只做一次整体缩放,段与段之间的相对音量保持不变;如果每段各自归一化,安静的录音会被拉到和音乐一样响,成品忽大忽小。反过来,素材里若有一个突发的巨响,归一化会按那个瞬间定标,其余部分反而更小,这种情况手动调整更合适。

内存是这类工具的天花板。浏览器解码音频必须先把整个文件读进内存,再一次性解成 32 位浮点,一小时的 44100 Hz 立体声大约 1.18 GB,很多标签页在这一步就崩了。手上有长录音时,建议先用音频剪切剪出需要的那几分钟再拿进来拼;只处理一段、不需要拼接的场合,那一页的操作更直接。要从视频里取声音用视频提取音频,想看清音频里都有哪些频率用音频频谱图,剪好的音频配字幕可以用字幕格式转换对齐时间轴。

常见问题

裁剪和拼接是两条不同的路吗?

是同一页上的两条路,结果都是一个 WAV。单段导出只处理波形上当前选中的那一段,等价于普通剪切;多段拼接按列表顺序把若干段首尾接成一个文件,每一段可以来自同一个文件的不同区间,也可以来自完全不同的文件。切到拼接模式后,先在波形上选好一段点「加入片段」,要换文件就先在下拉框里切换再选区间,全部加完再导出。

拼接出来的音频,接缝处为什么会「啪」一声?

因为接缝两侧的波形通常不连续:前一段的最后一个采样还没回到零点,后一段又从另一个数值开始,这个突变在听感上就是爆音。给几十毫秒的淡入淡出,把两端的音量压到零,阶跃就消失了。默认就是「每个片段各自淡入淡出」;如果关掉它,只在整段输出的最外两端做淡化,中间的接缝仍然会响。

不同采样率的文件能拼在一起吗?

能,但必须先统一。这一页会按你选的输出采样率把每一段重采样一次再拼。采样率不一致时直接接起来,第二段会以错误的速率播放:48000 Hz 的采样点按 44100 Hz 播放,时长会变成原来的 1.088 倍,音高也一并降低。同理,单声道和立体声混拼也要先统一声道数,否则会一边有声一边没有。

导出的 WAV 为什么这么大?

WAV 是不压缩的线性 PCM:16 位意味着每个采样点固定占 2 字节,体积只等于 时长 × 采样率 × 声道数 × 2,和内容复不复杂没有关系。44100 Hz 立体声 16 位每秒钟就是 172.3 KB、每分钟 10.09 MB(按 1 MB 等于 1024 × 1024 字节)。要小只能降采样率、降声道数,或者导出后再压一道:ffmpeg -i 输出.wav -b:a 192k 输出.mp3。

峰值归一化什么时候该开?

素材整体偏小、希望成品尽量接近满量程时开。它只做一次整体缩放,把所有采样乘同一个系数(这里是 0.99,即 -0.09 dBFS,增益上限 +18 dB),所以段与段之间的相对音量不变——这对拼接多个来源的素材很重要。如果每段各自归一化,安静的录音会被拉到和音乐一样响,成品听起来忽大忽小。素材里若有一个突发的巨响,归一化会按那个瞬间定标,其余部分反而更小,这时手动调整更合适。

能剪出很短的一段吗,比如手机铃声那种长度?

能。选区下限是 0.05 秒,也可以直接在起止秒数里填小数,分辨率取决于采样率:48000 Hz 下一个采样点约 0.021 毫秒,填写值会被四舍五入到最近的采样点,所以导出的实际时长和你输入的秒数最多差半个采样点。做铃声的常见做法是拖出副歌、两边各加 30 到 100 毫秒淡入淡出,导出后再转成 m4r 或 mp3。

几个小时的录音能处理吗?

能读进来但非常吃内存。浏览器解码音频必须先把整个文件读进内存,再一次性解成 32 位浮点:一小时的 44100 Hz 立体声约 1.18 GB,多数标签页到这一步就崩了。听到「内存」两个字别以为把文件缩小就行,压缩格式解码后会变回没压缩的大小。长录音建议先用别的工具截出需要的几分钟再拿进来处理。

剪出来的片段听感为什么和原文件不一样?

三个常见原因。一是重采样:输出采样率低于源文件时,超过新采样率一半的频率没法被正确表示,会衰减并折叠回来变成杂音,比如 8000 Hz 输出只能干净表示 4000 Hz 以下,高频会发闷;这一页的重采样是相邻两个采样点的线性插值,没有带通滤波,所以降采样比专业软件更容易听出差别。二是声道:立体声选单声道会把左右平均成一路,声场没了。三是归一化:整体音量被改过。想尽量少改动,就把采样率和声道都选「跟随源」,并关掉峰值归一化。要注意「跟随源」跟的是浏览器解码后的采样率,不是文件里写的那个:decodeAudioData 会先把音频解码成当前 AudioContext 的采样率(多数设备是 48000 Hz),所以一份 44100 Hz 的文件在这里进来时已经被重采样过一次,「跟随源」拿到的是 48000 Hz。要完全避开这一次重采样,只能让浏览器的音频采样率和文件一致,网页里做不到。