SoX — 命令行音频处理瑞士军刀
待复核SoX(Sound eXchange)是一个专门处理音频的命令行工具:能转格式、改采样率、剪片段、混音、录音、合成声音,还能生成频谱图。
日常类比:它像厨房里那把多功能小刀,不负责做一桌大菜的摆盘,但切、削、开瓶、修边这些小动作都很快,特别适合批量重复做。
最小例子:
sox input.wav output.flac这行命令把一个 WAV 文件转成 FLAC。真正的思路是:读入音频 → 可选地合并多路输入 → 串起一串效果 → 写出新文件。
如果你已经知道 ffmpeg,可以把 SoX 先理解成“只盯着声音的 ffmpeg”:视频容器、字幕、封装不是它的主场,音频波形、滤波、重采样、分析才是它的主场。
不理解 SoX,下面这些事会很难做顺:
- 音频批处理会被迫手点 GUI:几十个文件转格式、统一音量、抽片段,很快变成重复劳动。
- 数据集清洗会缺一把小刀:语音样本常要统一采样率、声道、位深,SoX 可以直接写进脚本。
- 调试声音问题会只靠耳朵:
soxi、stat、stats、spectrogram能把“听起来怪”变成可检查的数据。 - 录音和播放链路会混在一起:
play、rec、sox -d其实是一套工具的不同入口,新手容易分不清。
-
流水线模型:SoX 的心智模型是“输入 → 合并器 → 效果链 → 输出”。类比洗照片,先拿到底片,再决定要不要拼接、调色、裁切,最后冲印出来。
-
文件参数要站在文件前面,效果参数要站在效果后面:比如
-r 16k放在输入文件前是告诉 SoX 怎么读,rate 16k放在输出文件后是一个处理步骤。类比寄快递,地址写在包裹上,拆包工具放在工作台上。 -
它先解码成内部波形再处理:MP3、Vorbis 这类有损格式会先被解开,再重新编码。类比把压缩饼干泡开再压回去,能吃,但反复做会变差。
案例 1:把音频转成语音模型常用的单声道 16k
Section titled “案例 1:把音频转成语音模型常用的单声道 16k”sox recital.au -b 16 recital.wav channels 1 rate 16k fade 3 norm这个例子来自 SoX 手册里的格式转换示例,适合理解“转格式 + 效果链”。
逐部分解释:
recital.au是输入文件,recital.wav是输出文件。-b 16指定输出位深为 16 bit,常见语音处理够用。channels 1把多声道压成单声道,语音识别数据集经常这么统一。rate 16k把采样率改成 16000 Hz,很多语音模型把它当默认输入。fade 3 norm先做 3 秒淡入,再做归一化,避免开头突兀和整体太小声。
案例 2:把背景音乐和人声混成一个文件
Section titled “案例 2:把背景音乐和人声混成一个文件”sox -m music.mp3 voice.wav mixed.flac这是 SoX 手册里的混音示例,适合播客片头、旁白配乐、简单游戏音效合成。
逐部分解释:
-m选择 mix 合并方式,不是一个接一个拼接,而是同一时间叠在一起。music.mp3和voice.wav是两路输入,采样率不同的时候通常要先统一。mixed.flac用无损格式保存中间结果,后面还要剪辑时比直接输出 MP3 更稳。- 混音可能把音量叠到超过上限,正式脚本里常配合
gain、norm或-v调每路音量。
案例 3:录一段磁带或长流,并按静音自动切歌
Section titled “案例 3:录一段磁带或长流,并按静音自动切歌”rec -r 44100 -b 16 -e signed-integer -p \ silence 1 0.50 0.1% 1 10:00 0.1% | \ sox -p song.ogg silence 1 0.50 0.1% 1 2.0 0.1% : \ newfile : restart这个例子也来自 SoX 手册,典型场景是从磁带、黑胶或广播流里录音,然后按静音处分割文件。
逐部分解释:
rec ... -p从默认录音设备读音频,并把结果送进管道,不先落地成大文件。- 第一段
silence让 SoX 等到真的有声音才开始,并在长时间无声后停止。 sox -p song.ogg从管道继续读,输出文件名会在多文件模式下自动加编号。: newfile : restart是多个效果链的分隔符,意思是当前段结束后开新文件,再重新跑切分逻辑。
-
raw 音频没有头信息:
.raw这类文件不告诉你采样率、编码、声道数,所以必须显式写-r、-e、-b、-c。 -
有损格式反复处理会变糊:SoX 会先解码再处理再编码,MP3 输入又输出 MP3 等于又压缩一次。
-
混音和增益会削波:两个声音叠起来可能超过可表示范围,出现 clipping 警告时要留 headroom。
-
SOX_OPTS会偷偷改变脚本行为:全局环境变量适合个人终端,不适合可复现脚本;脚本里最好显式写参数。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 批量音频转换:WAV、FLAC、OGG、AIFF 等格式之间互转。
- 语音数据预处理:统一采样率、位深、声道,剪掉静音,做简单降噪。
- 命令行录音和播放:用
rec、play、sox -d快速验证设备链路。 - 声音分析:生成频谱图、查看时长、采样率、声道、峰值和统计信息。
不适用:
- 复杂视频转码:用 ffmpeg 更自然,SoX 不负责完整视频工作流。
- 精细手工剪辑:要拖拽、多轨可视化、手动包络线时,用 Audacity 这类 GUI 更舒服。
- 专业母带制作全流程:SoX 可以当脚本工具,但不能替代 DAW、监听环境和人工判断。
- 依赖特定编码器的格式:MP3、AMR、Opus 等能力常取决于编译时启用了哪些外部库。
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 1990s:SoX 从早期声音格式转换工具一路演化,核心目标一直是“用命令行处理声音文件”。
- 2000 年:项目在 SourceForge 注册,后来长期作为跨平台音频工具发布。
- 2014 年:手册里的 SoX 1 文档已经把它定位成适合快速编辑和批处理的命令行音频工具。
- 2015 年:14.4.2 版本加入 Ogg Opus 读取、RF64 WAV 读取、rate 加速、LADSPA 多声道插件等维护更新。
- 现在:GitHub 上的
chirlu/sox是活跃镜像之一,约千星、三千多次提交;许多系统仍把 SoX 当基础音频工具打包。
- SoX 的核心不是“转格式命令”,而是一条可组合的音频处理流水线。
- 音频文件要同时看四个维度:采样率、位深、编码、声道;只看扩展名不够。
- 越早保留无损中间文件,后面的剪辑、混音、重采样越不容易累计损伤。
- 命令行工具的优势在可重复:一次听起来麻烦的命令,写进脚本后可以稳定处理成百上千个文件。
- 官方仓库:chirlu/sox
- 官方项目页:SoX - Sound eXchange
- 手册入口:sox(1)
- 文件格式手册:soxformat(7)
- 信息查看命令:soxi(1)
- ffmpeg —— 更完整的音视频转码、封装和流媒体工具链。
- ffmpeg —— SoX 专注音频波形,ffmpeg 覆盖音视频容器、编解码和流处理。
- gstreamer —— GStreamer 更像可嵌入应用的媒体管线,SoX 更像一次性命令行工具。
- flac —— SoX 常把 FLAC 当无损中间格式,避免反复有损压缩。
- opus —— SoX 新版本支持读取 Ogg Opus,适合和语音/低码率音频场景放在一起学。
- whisper —— 语音识别前常要统一采样率、声道和片段长度,SoX 可以做预处理。
- scipy —— SciPy 能在 Python 里做信号处理,SoX 则把常见音频操作封装成 CLI。
- audacity —— Audacity — 开源音频剪辑里的瑞士军刀