内容提要
文章介绍使用 Java 17 标准 HttpClient 调用文件转写 API,重点处理上传、排队与超时。示例区分成功、网络失败、HTTP 失败和空文本,强调状态管理而非解析 JSON。建议用任务 ID、对象存储、指数退避和状态机替代简单重试,避免重复转写;仅对网络错误、429 和临时 5xx 重试,长音频切段并保留时间戳,注意隐私权限控制。
延伸解读
示例代码的边界与生产化前提
文章示例仅用 JDK 17 标准库,无 Maven 依赖,便于审查请求边界。但代码将音频字节直接转为字符串拼接 multipart,生产环境应改用字节级构造和成熟 JSON 库。此外,示例未实际调用线上 API,模型名 gpt-6-transcribe 仅为占位,部署前需核对官方模型页的实际 ID、文件限制与价格。
重试策略:避免重复转写的关键
简单重发超时请求可能导致服务端已成功却产生两份转写。文章建议先生成任务 ID,上传到受控对象存储,再由工作线程领取,并记录 QUEUED、RUNNING、DONE、TIMEOUT、FAILED 等状态。重试仅针对网络错误、429 和临时 5xx;无授权、格式不支持或文件缺失应立即失败,避免无效重试。
长音频处理与隐私权限控制
长音频应切段处理,但必须保存段序号与时间戳,合并时不能依赖模型猜测顺序。音频内容和转写文本都可能包含个人信息,因此下载链接、日志和人工校对权限需分开控制。文章还提醒,录音需取得参会人授权,上传内容类型应与真实文件一致,空转写不应简单视为“无发言”。
适用场景与人工校对必要性
该方案适合会议纪要草稿、客服质检前处理等场景,但不适合直接生成法律、医疗或人事结论。成功输出后应送入人工校对,而非直接入档。工程化时建议加入任务 ID、对象存储、指数退避和保留期删除策略,并为 FAILED 状态添加不含音频内容的审计日志。
Q&A
Java 17 用 HttpClient 调用文件转写 API 时,怎么区分成功、超时和失败?
示例中成功时输出以 DONE: 开头;30 秒内没有响应则捕获 HttpTimeoutException 并输出 TIMEOUT:;其他异常输出 FAILED: 并附带错误信息。同时会检查 HTTP 状态码是否为 2xx,以及返回体中是否包含 text 字段。
为什么文件转写不建议简单重试,而要用任务 ID 和状态机?
简单重发可能在服务端已经成功时产生两份转写。更好的模式是先生成任务 ID,上传到受控对象存储,再由工作线程领取,每次状态变化写入 QUEUED、RUNNING、DONE、TIMEOUT 或 FAILED,前端根据状态展示“可重试”而不是假装仍在处理。
文件转写 API 调用中,哪些错误应该重试,哪些应该立即失败?
只对网络错误、429 和临时 5xx 重试;无授权、格式不支持和文件缺失应立刻失败。
长音频转写时需要注意什么?
长音频应切段,但必须保存段序号与时间戳,合并时不能靠模型猜顺序。
文件转写 API 调用中常见的错误有哪些?
常见错误包括:上传内容类型和真实文件不符;录音未取得参会人授权;音频过长却硬塞进同步请求;把空转写当作“无发言”。
文件转写适合哪些场景,不适合哪些场景?
适合会议纪要草稿、客服质检前处理;不适合直接生成法律、医疗或人事结论。
文件转写中如何保护隐私和权限?
音频内容和转写文本都可能包含个人信息,因此下载链接、日志和人工校对权限要分开控制。