Java 17 HttpClient调用文件转写API的超时与失败回退
发布时间:2026/10/9 21:16:14 锦皓数字建站

会议录音的第一处工程坑不是“模型听不懂”而是上传、排队和超时。一个网页一直转圈会让用户误以为资料丢了。下面的 Java 17 示例用标准HttpClient调用文件转写 REST 接口明确区分成功、网络失败、HTTP 失败和空文本。没有可靠 Java SDK 时标准 HTTP 客户端反而更容易审查依赖与请求边界。官方 File transcription 文档列出音频转写能力和接口细节。模型名会随账号和产品更新示例用gpt-6-transcribe仅作占位部署前请在官方模型页核对实际可用 ID、文件限制与价格。是否有效无效授权音频构造multipart请求30秒内响应?检查HTTP与文本标记TIMEOUT并可重试保存待人工校对的草稿标记FAILED与原因准备与完整代码保存为Transcribe.java设置export OPENAI_API_KEY...执行javac Transcribe.java java Transcribe meeting.mp3。只使用 JDK 17无 Maven 依赖。示例未在本次任务中实际调用线上 API本机有 JDK 但本次未生成独立源文件执行编译请在你的 Java 17 环境先编译再接入。importjava.net.URI;importjava.net.http.*;importjava.nio.file.*;importjava.time.Duration;importjava.util.UUID;publicclassTranscribe{staticfinalStringAPIhttps://api.openai.com/v1/audio/transcriptions;staticStringesc(Strings){returns.replace(\\,\\\\).replace(\,\\\);}staticStringbody(Pathfile,Stringboundary)throwsException{Stringhead--boundary\r\nContent-Disposition: form-data; name\model\\r\n\r\ngpt-6-transcribe\r\n--boundary\r\nContent-Disposition: form-data; name\file\; filename\esc(file.getFileName().toString())\\r\nContent-Type: audio/mpeg\r\n\r\n;returnheadnewString(Files.readAllBytes(file))\r\n--boundary--\r\n;}publicstaticvoidmain(String[]args)throwsException{if(args.length!1)thrownewIllegalArgumentException(用法: java Transcribe meeting.mp3);StringkeySystem.getenv(OPENAI_API_KEY);if(keynull||key.isBlank())thrownewIllegalStateException(请设置OPENAI_API_KEY);PathaudioPath.of(args[0]);if(!Files.isRegularFile(audio))thrownewIllegalArgumentException(音频不存在);Stringboundary----JavaUUID.randomUUID();HttpRequestreqHttpRequest.newBuilder(URI.create(API)).timeout(Duration.ofSeconds(30)).header(Authorization,Bearer key).header(Content-Type,multipart/form-data; boundaryboundary).POST(HttpRequest.BodyPublishers.ofString(body(audio,boundary))).build();try{HttpResponseStringresHttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build().send(req,HttpResponse.BodyHandlers.ofString());if(res.statusCode()/100!2)thrownewRuntimeException(HTTP res.statusCode());if(!res.body().contains(text))thrownewRuntimeException(返回中没有文本字段);System.out.println(DONE: 请将文本送入人工校对而非直接入档);}catch(java.net.http.HttpTimeoutExceptione){System.out.println(TIMEOUT: 放入异步重试队列);}catch(Exceptione){System.out.println(FAILED: e.getMessage());}}}示例强调状态而非解析完整 JSON生产项目应引入成熟 JSON 库并使用字节级 multipart 构造避免把任意二进制强转字符串。预期成功输出以DONE:开头30 秒内没有响应输出TIMEOUT:。常见错误包括上传内容类型和真实文件不符录音未取得参会人授权音频过长却硬塞进同步请求把空转写当作“无发言”。它适合会议纪要草稿、客服质检前处理不适合直接生成法律、医疗或人事结论。工程化时加任务 ID、对象存储、指数退避和保留期删除策略。5分钟练习为FAILED状态加一个不含音频内容的审计日志。队列比“再试一次”更重要把请求超时简单重发可能在服务端其实已经成功时得到两份转写。更好的模式是先生成任务 ID上传到受控对象存储再由工作线程领取每一次状态变化都写入QUEUED、RUNNING、DONE、TIMEOUT或FAILED。前端根据状态展示“可重试”而不是假装仍在处理。重试只能针对网络错误、429 和临时 5xx无授权、格式不支持和文件缺失应立刻失败。长音频还应切段但必须保存段序号与时间戳合并时不能靠模型猜顺序。音频内容和转写文本都可能包含个人信息因此下载链接、日志和人工校对权限要分开控制。官方文档File transcription。你的转写任务应在多少秒后交给人工或异步队列关注「蜗牛聊AI」一起看懂技术变化背后的真正机会。本文首发于 java4u.cn转载请注明出处。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。