首页博客 → 一次请求装不下的录音怎么转录

一次请求装不下的录音怎么转录

发布于 2026-08-20 · 5 分钟阅读

四小时的会议录音、一整天的录音笔文件、带录屏的网课,都塞不进一次请求。任务拆成三步:压缩、按停顿切分、把文本拼回去。下面是可直接用的方案和代码。

先压缩,再考虑切分

切之前先试压缩,往往就够了。一小时语音的 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,或者切成几段。

接缝处会丢意思吗?

按静音切就不会。固定间隔切可能在接缝丢一个词,所以多花一步找停顿是值得的。

各段能同时处理吗?

可以,它们互相独立。唯一的限制是套餐的每秒请求数。

相关阅读