跳转到内容

SoX — 命令行音频处理瑞士军刀

待复核

SoX(Sound eXchange)是一个专门处理音频的命令行工具:能转格式、改采样率、剪片段、混音、录音、合成声音,还能生成频谱图。

日常类比:它像厨房里那把多功能小刀,不负责做一桌大菜的摆盘,但切、削、开瓶、修边这些小动作都很快,特别适合批量重复做。

最小例子:

Terminal window
sox input.wav output.flac

这行命令把一个 WAV 文件转成 FLAC。真正的思路是:读入音频 → 可选地合并多路输入 → 串起一串效果 → 写出新文件。

如果你已经知道 ffmpeg,可以把 SoX 先理解成“只盯着声音的 ffmpeg”:视频容器、字幕、封装不是它的主场,音频波形、滤波、重采样、分析才是它的主场。

不理解 SoX,下面这些事会很难做顺:

  • 音频批处理会被迫手点 GUI:几十个文件转格式、统一音量、抽片段,很快变成重复劳动。
  • 数据集清洗会缺一把小刀:语音样本常要统一采样率、声道、位深,SoX 可以直接写进脚本。
  • 调试声音问题会只靠耳朵:soxistatstatsspectrogram 能把“听起来怪”变成可检查的数据。
  • 录音和播放链路会混在一起:playrecsox -d 其实是一套工具的不同入口,新手容易分不清。
  1. 流水线模型:SoX 的心智模型是“输入 → 合并器 → 效果链 → 输出”。类比洗照片,先拿到底片,再决定要不要拼接、调色、裁切,最后冲印出来。

  2. 文件参数要站在文件前面,效果参数要站在效果后面:比如 -r 16k 放在输入文件前是告诉 SoX 怎么读,rate 16k 放在输出文件后是一个处理步骤。类比寄快递,地址写在包裹上,拆包工具放在工作台上。

  3. 它先解码成内部波形再处理:MP3、Vorbis 这类有损格式会先被解开,再重新编码。类比把压缩饼干泡开再压回去,能吃,但反复做会变差。

案例 1:把音频转成语音模型常用的单声道 16k

Section titled “案例 1:把音频转成语音模型常用的单声道 16k”
Terminal window
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:把背景音乐和人声混成一个文件”
Terminal window
sox -m music.mp3 voice.wav mixed.flac

这是 SoX 手册里的混音示例,适合播客片头、旁白配乐、简单游戏音效合成。

逐部分解释:

  • -m 选择 mix 合并方式,不是一个接一个拼接,而是同一时间叠在一起。
  • music.mp3voice.wav 是两路输入,采样率不同的时候通常要先统一。
  • mixed.flac 用无损格式保存中间结果,后面还要剪辑时比直接输出 MP3 更稳。
  • 混音可能把音量叠到超过上限,正式脚本里常配合 gainnorm-v 调每路音量。

案例 3:录一段磁带或长流,并按静音自动切歌

Section titled “案例 3:录一段磁带或长流,并按静音自动切歌”
Terminal window
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 是多个效果链的分隔符,意思是当前段结束后开新文件,再重新跑切分逻辑。
  1. raw 音频没有头信息.raw 这类文件不告诉你采样率、编码、声道数,所以必须显式写 -r-e-b-c

  2. 有损格式反复处理会变糊:SoX 会先解码再处理再编码,MP3 输入又输出 MP3 等于又压缩一次。

  3. 混音和增益会削波:两个声音叠起来可能超过可表示范围,出现 clipping 警告时要留 headroom。

  4. SOX_OPTS 会偷偷改变脚本行为:全局环境变量适合个人终端,不适合可复现脚本;脚本里最好显式写参数。

适用

  • 批量音频转换:WAV、FLAC、OGG、AIFF 等格式之间互转。
  • 语音数据预处理:统一采样率、位深、声道,剪掉静音,做简单降噪。
  • 命令行录音和播放:用 recplaysox -d 快速验证设备链路。
  • 声音分析:生成频谱图、查看时长、采样率、声道、峰值和统计信息。

不适用

  • 复杂视频转码:用 ffmpeg 更自然,SoX 不负责完整视频工作流。
  • 精细手工剪辑:要拖拽、多轨可视化、手动包络线时,用 Audacity 这类 GUI 更舒服。
  • 专业母带制作全流程:SoX 可以当脚本工具,但不能替代 DAW、监听环境和人工判断。
  • 依赖特定编码器的格式:MP3、AMR、Opus 等能力常取决于编译时启用了哪些外部库。
  • 1990s:SoX 从早期声音格式转换工具一路演化,核心目标一直是“用命令行处理声音文件”。
  • 2000 年:项目在 SourceForge 注册,后来长期作为跨平台音频工具发布。
  • 2014 年:手册里的 SoX 1 文档已经把它定位成适合快速编辑和批处理的命令行音频工具。
  • 2015 年:14.4.2 版本加入 Ogg Opus 读取、RF64 WAV 读取、rate 加速、LADSPA 多声道插件等维护更新。
  • 现在:GitHub 上的 chirlu/sox 是活跃镜像之一,约千星、三千多次提交;许多系统仍把 SoX 当基础音频工具打包。
  • SoX 的核心不是“转格式命令”,而是一条可组合的音频处理流水线。
  • 音频文件要同时看四个维度:采样率、位深、编码、声道;只看扩展名不够。
  • 越早保留无损中间文件,后面的剪辑、混音、重采样越不容易累计损伤。
  • 命令行工具的优势在可重复:一次听起来麻烦的命令,写进脚本后可以稳定处理成百上千个文件。
  • ffmpeg —— SoX 专注音频波形,ffmpeg 覆盖音视频容器、编解码和流处理。
  • gstreamer —— GStreamer 更像可嵌入应用的媒体管线,SoX 更像一次性命令行工具。
  • flac —— SoX 常把 FLAC 当无损中间格式,避免反复有损压缩。
  • opus —— SoX 新版本支持读取 Ogg Opus,适合和语音/低码率音频场景放在一起学。
  • whisper —— 语音识别前常要统一采样率、声道和片段长度,SoX 可以做预处理。
  • scipy —— SciPy 能在 Python 里做信号处理,SoX 则把常见音频操作封装成 CLI。
  • audacity —— Audacity — 开源音频剪辑里的瑞士军刀