事情本身不复杂,线索都在日志里。用 ffmpeg 6.1 把会议录音按 30 秒切成片段再送转写,命令是 -f segment -segment_time 30 -c copy,播放时每段开头有一声咔哒,转写结果每段前两个字基本都是错的,原文件本身干净。
第一反应是「segment 时间点没有对齐到帧边界,首尾各多出半帧」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。-c copy 只能在关键帧处切分,切点落在音频帧中间产生不连续。还有一种是MP3 每帧自带编码器延迟,直接拼接会露出填充样本。
不容易想到的是,没有重置时间戳,播放器按原时间轴解码出现跳变。
先看切片处的帧边界与时间戳
ffprobe -v error -select_streams a:0 -show_entries frame=pts_time -of csv=p=0 input.mp3 | head -5
随后改成重编码并重置时间戳再切
ffmpeg -y -i input.mp3 -f segment -segment_time 30 -reset_timestamps 1 -c:a libmp3lame -ar 16000 -ac 1 out_%03d.mp3
或者先按静音点切再对齐
ffmpeg -i input.wav -af silencedetect=noise=-35dB:d=0.4 -f null - 2>&1 | grep silence_start | head
末了逐个片段确认时长与首尾电平
ffprobe -v error -show_entries format=duration -of csv=p=0 out_000.mp3
改完先别撤,确认这几项。每个片段开头没有爆音,时长在 29.8 到 30.2 秒之间,转写首字不再丢失,拼回整段与原文一致。
这里还有个坑。-c copy 看着快,但切点不受控,音频类切片基本都要重编码,代价是 CPU 时间,换来的是干净的边界。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
