转写长录音,切段时把每段的起点也存下来
假设第3段从第6秒开始,转写器确实返回了片段内的 1.25–2.50s,回填到整条音轨就是 7.25–8.50s。长录音拆开转写时,切段文件和这份起点表应该一起留下,后面整理字幕才有地方查。
附件脚本先用 FFmpeg 生成 16kHz、单声道、16-bit PCM 音轨,再按采样点切出带重叠的 WAV 文件,原输入文件不改动。它适用于可以合成单声道的录音;独立声道各自承载不同内容时,需另行处理。每段起止位置、文件名和重叠长度保存在 manifest.json。
先拿包内的13秒合成音跑一遍。需要 Python 3.9+,以及已加入 PATH 的 FFmpeg,Python部分只用标准库:
ffmpeg -version
python chunk_audio.py synthetic-13s.wav my-chunks --seconds 4 --overlap 1 命令首行输出 chunks=4 sample_rate=16000 frames=208000。my-chunks 必须是尚不存在的新目录。这里每段4秒、相邻重叠1秒,实际得到:
| 段 | 从哪一秒开始 | 到哪一秒结束 |
|---|---|---|
| 1 | 0 | 4 |
| 2 | 3 | 7 |
| 3 | 6 | 10 |
| 4 | 9 | 13 |
到第4段已经覆盖末尾,就停止,不再多切一个12–13秒的小尾巴。下面的时间轴由实际 manifest.json 绘制,样例是程序合成的音调,没有人声或转写结果:
换成自己的录音时,把输入名换掉,给输出另起一个新目录名即可。不写参数时,默认每段300秒、重叠1秒。分段长度只是本工具的默认值;上传前仍需按实际服务的限制检查文件大小,不能只凭分钟数判断。清单中的 file_bytes 是实际文件字节数。OpenAI 当前文件转写 API 指南给出的上限为25MB,其他服务和入口需分别核对。
时间怎么回填
start_sample 和 end_sample 是转换后的标准 WAV 中的采样位置,起点包含、终点不包含;除以16000就是对应秒数。某个服务若确实返回了片段内的局部时间戳,再做这个加法:
音轨中的时间 = 片段的start_seconds + 片段内时间
第3段起点6.00s + 局部1.25–2.50s = 7.25–8.50s 这组局部时间是手工算例,不是模型输出。只有纯文本、没有时间戳的转写结果,就只能先回查片段范围,不能按字数给每句话猜时间。不同转写模型和返回格式对时间戳的支持也不同,换模型时要重新确认。
这里的0秒从 FFmpeg 解码得到的标准 WAV 首采样开始计,适合在同一条音轨里回查;原容器时间戳、视频起点或录制时的钟表时间没有保留。若后面删静音、变速或剪掉开头,这份偏移也需要重新建立。
重叠处别直接拼起来
例子里的第3–4秒同时在前两段中。转写后两段可能都包含同一句话,直接相接就会重复;两个相同短语也可能本来就各说了一遍,不能见到相同字串就删。本工具只切音频,不自动合并转写。
它也没有按静音或句子找切点,固定边界可能落在一句话中间。重叠只是保留一部分上下文,识别是否完整还要听回原音频、核对实际结果。包内 prompt.txt 给了保留段号和局部时间、听不清时标记不确定、暂不合并各段结果的完整要求。
下载切段脚本、合成音、四段实际输出、完整提示词与验证记录(ZIP,16个文件)
已有输出目录、坏音频或不合法的重叠参数会报错并非零退出。只有输出中的 manifest.json 已完整生成,才把这次处理当作完成。
包里有完整脚本、合成音、已经切好的四段、清单和验证记录。解压后可运行 python verify.py。本地用 Python 3.12.14、FFmpeg 7.1.5 实际跑过14项检查,覆盖采样点边界、重叠、末段、坏输入、非法参数和覆盖保护;最终 ZIP 已解压到新目录复跑。验证的是音频处理和时间计算,没有调用转写模型,也没有评测识别准确率。
参考:OpenAI《Speech to text》及 FFmpeg 音频处理文档,2026-10-24查阅。