一次请求装不下的录音怎么转录
四小时的会议录音、一整天的录音笔文件、带录屏的网课,都塞不进一次请求。任务拆成三步:压缩、按停顿切分、把文本拼回去。下面是可直接用的方案和代码。
先压缩,再考虑切分
切之前先试压缩,往往就够了。一小时语音的 opus 大约 11 MB,两小时的录音整个就能塞进上限:
ffmpeg -i conference.wav -vn -ac 1 -ar 16000 -c:a libopus -b:a 24k conference.ogg
只有压完还是太大,或者想并行处理提速时,切分才有意义。
切在哪里不会切坏
按固定间隔切很省事,但迟早会把一个词切成两半,接缝处出现乱码。按静音切更稳妥。先找停顿:
ffmpeg -i long.ogg -af silencedetect=noise=-35dB:d=1 -f null - 2>&1 | grep silence_end
然后在最接近目标长度的停顿处下刀:
ffmpeg -i long.ogg -ss 0 -to 912.4 -c copy part001.ogg
实用折中是 10–15 分钟一段:方便并行发送,即使某处切得不好,损失也很小。
并行处理各段
各段互不依赖,可以同时发送,用文件名保证顺序:
import concurrent.futures as cf, pathlib
from openai import OpenAI
client = OpenAI(base_url="https://voicesscribe.com/v1", api_key="your key")
def one(path):
with path.open("rb") as f:
return path.name, client.audio.transcriptions.create(model="whisper-1", file=f).text
parts = sorted(pathlib.Path(".").glob("part*.ogg"))
with cf.ThreadPoolExecutor(max_workers=4) as pool:
result = dict(pool.map(one, parts))
full = "\n".join(result[p.name] for p in parts)
pathlib.Path("conference.txt").write_text(full, encoding="utf-8")
并发数按套餐的每秒请求上限来定,超了会收到 429,还得重做一遍。
连续的时间戳
如果要的不是纯文本而是可跳转的定位,请求分段格式并给每段加上偏移量:
offset = 0.0
for path in parts:
with path.open("rb") as f:
r = client.audio.transcriptions.create(
model="whisper-1", file=f, response_format="verbose_json")
for seg in r.segments:
print(round(seg["start"] + offset, 1), seg["text"].strip())
offset += r.duration
这样时间戳仍然对齐原始录音,可以直接驱动播放器。
用你自己的录音试一试。 注册只需一分钟,免费额度足够判断识别质量。
免费获取 API 密钥常见问题
文件大小上限是多少?
单次请求 25 MB。opus 下大约是两小时语音,所以多数情况下压缩就够,不必切分。
413 错误是什么意思?
文件超过允许大小。压成 opus 或低码率 mp3,或者切成几段。
接缝处会丢意思吗?
按静音切就不会。固定间隔切可能在接缝丢一个词,所以多花一步找停顿是值得的。
各段能同时处理吗?
可以,它们互相独立。唯一的限制是套餐的每秒请求数。
相关阅读
- 转录前的音频准备:ffmpeg 常用命令 — 可直接复制的 ffmpeg 命令:从视频抽音轨、混成单声道、裁掉静音、按停顿切分,以及把立体声两个声道分开。
- 如何为音频存档搭建批量转录流水线 — 转录上万条录音而不丢失任何一条:任务队列、并发控制、重试策略、崩溃后续跑,以及如何把账单控制在预期之内。
- 转录 API 的报错分别代表什么 — 逐个解释转录接口的状态码:401、400、413、429、502 各自的原因和修法,以及哪些失败值得自动重试。