首页 → 博客 → 转录前的音频准备:ffmpeg 常用命令
转录前的音频准备:ffmpeg 常用命令
转录一半的问题在发请求之前就能解决——在准备文件的阶段。下面这组 ffmpeg 命令几乎覆盖所有情况:拿到的是视频而不是音频、立体声而不是单声道、结尾一小时的静音,以及塞不进上限的大文件。
从视频抽出音轨
会议、网课和录屏通常是 mp4,视频轨对识别毫无用处:
ffmpeg -i meeting.mp4 -vn -ac 1 -ar 16000 -c:a libopus -b:a 24k meeting.ogg
九十分钟的录像会从大约 1.5 GB 降到 15 MB 左右,几秒钟就传完。
按声道拆开说话人
如果电话系统把坐席和客户分别录在立体声的左右声道,这就是不用任何说话人分离算法就能拿到准确归属的机会:
ffmpeg -i call.wav -map_channel 0.0.0 agent.ogg -map_channel 0.0.1 customer.ogg
两个文件分别转录,再按时间戳交叉合并,就得到归属明确的对话。
裁掉头尾和静音
录音笔的文件常常在开口前十分钟就开始录了。按时间裁剪:
ffmpeg -i raw.ogg -ss 00:09:30 -to 01:12:00 -c copy trimmed.ogg
删掉中间的长停顿:
ffmpeg -i raw.ogg -af silenceremove=stop_periods=-1:stop_duration=2:stop_threshold=-40dB clean.ogg
要清楚代价:删掉停顿后,结果里的时间戳就不再对应原始录音。如果之后还要跳回视频,就别动这些停顿。
切分长录音
固定十五分钟一段:
ffmpeg -i long.ogg -f segment -segment_time 900 -c copy part%03d.ogg
简单,但迟早会把一个词切成两半。想按停顿切,先找静音:
ffmpeg -i long.ogg -af silencedetect=noise=-35dB:d=1 -f null - 2>&1 | grep silence_end
把这些时间点当作切点,句子就不会被截断,合并后的文本读起来仍然连贯。
用你自己的录音试一试。 注册只需一分钟,免费额度足够判断识别质量。
免费获取 API 密钥常见问题
一定要混成单声道吗?
不是必须,但文件体积减半而结果不变。只有说话人分在左右声道时才值得保留立体声。
为什么偏偏是 16 kHz?
模型就按这个采样率工作,更高的都会在内部降下来。发 48 kHz 只是为将被丢弃的数据付流量。
压成 opus 会不会掉准确率?
24 kbps 单声道下文本基本一致,这个编解码器本来就是为语音做的。明显损失出现在 16 kbps 以下。
切开的几段怎么合并?
按文件名里的编号排序后顺序拼接。需要连续时间戳的话,给每段的时间加上该段起点的偏移量。
相关阅读
- 语音识别该选哪种音频格式 — mp3、wav、ogg、opus、m4a 与 webm 在语音识别中的取舍:码率影响多大,为什么单声道 16 kHz 就够,如何不超体积上限。
- 一次请求装不下的录音怎么转录 — 几小时的录音如何处理:先压缩,再按停顿切分,并行处理各段,最后合并成带连续时间戳的完整文本。
- 谁说了什么:转录文本中的说话人分离 — 为什么单个混音文件不会带说话人标签,以及四个实际可行的替代方案——从分轨录音到声道拆分,附时间轴合并代码。