实时转写只有过程没有结果,completed 事件始终拿不到

在北京极客 中级 13天前 270 浏览 8 点赞 约 2 分钟

在尝试用 OpenAI 的 Realtime API 做实时语音转写时,遇到一个很棘手的问题:中间过程的 delta 碎片能正常收到,但永远等不到那个标志转写完成的 conversation.item.input_audio_transcription.completed 事件。换句话说,只有流式输出,没有最终结果,业务逻辑没法往下走。

实时转写只有过程没有结果,completed 事件始终拿不到

最让人困惑的是,想拿到 final event,通常得依赖服务器端的端点检测(VAD)来判断说话是否结束,但这个模型对 VAD 的支持程度非常有限。

具体复现过程和报错如下:

关闭端点检测能否获取最终转写结果?

首先,在配置 session 时,如果把 turn_detection 设为 null,也就是关闭端点检测,代码运行本身没有问题,但输出结果只有 conversation.item.input_audio_transcription.delta 这类碎片,始终不会出现 completed 事件。

实时转写只有过程没有结果,completed 事件始终拿不到

我当时用的监听代码是这样的:

ws.on("message", (data) => {
 const event = JSON.parse(data);

 if (event.type === "conversation.item.input_audio_transcription.delta") {
   process.stdout.write(event.delta);
 }

 if (event.type === "conversation.item.input_audio_transcription.completed") {
   console.log("\nFinal transcript:", event.transcript);
 }
});
实时转写只有过程没有结果,completed 事件始终拿不到

开启 server_vad 为什么会触发报错?

为了强行触发 final event,我按照官方 VAD 文档去开启 server_vad,配置参数如下:

{
 "type": "session.update",
 "session": {
 "type": "transcription",
 "audio": {
 "input": {
 "format": { "type": "audio/pcm", "rate": 24000 },
 "transcription": { "model": "gpt-live-transcribe" },
 "turn_detection": {
 "type": "server_vad",
 "threshold": 0.8,
 "prefix_padding_ms": 500,
 "silence_duration_ms": 700
 }
 }
 }
}

结果直接被服务器怼回来一个报错,提示这个模型根本不支持端点检测:

{
 "message": "Turn detection is not supported for this transcription model.",
 "type": "invalid_request_error",
 "code": "invalid_value",
 "param": "session.audio.input.turn_detection"
}

更麻烦的是,这个问题并不是 gpt-live-transcribe 独有的。换成 gpt-realtime-whisper 之后,同样的情况复现了。

开发者是否陷入了无法触发完成事件的死循环?

现在的局面很尴尬:关掉 turn_detection,没有 final event;开启 turn_detection,直接报 invalid_request_error。这导致开发者陷入一个死循环——没有 completed 事件,根本没法知道一段话什么时候结束,后续的业务逻辑也就无从处理。

我的判断是,目前这些转写模型在 Realtime API 里的 VAD 逻辑可能还没跑通,或者文档描述和实际 API 实现之间存在脱节。如果你也在用这两个模型,并且需要拿到最终的转写结果,建议暂时不要依赖 server_vad,可能得自己在客户端做简单的静音检测,然后手动触发某种机制。但这显然增加了开发成本,不应该是 API 应该有的样子。

gpt-live-transcribegpt-realtime-whisperOpenAI APIRealtime API

全部回复 (3)

想当场把话说完?进全球 AI 聊天室,登录就能开口。

内
内卷王调参侠 中级 13天前

这语气确实让人有点“求人办事”的味道,但如果真想把实时转写的流程拿到完整结果,其实也有更具体的解决方案。比如,在配置 session.update 时,如果直接关闭端点检测(turn_detection: null),确实只能得到碎片化的转写数据,但可以尝试调整监听逻辑,比如在处理每个 delta 时,手动判断是否达到合理的“语音停止”阈值(比如连续 1000 毫秒无数据或音量低于阈值),然后强行触发假转写完成事件,再通过后端补全。不过,这样做的前提是服务端确实支持这种“补全”的机制,否则最终结果仍然无法稳定获取。

0 回复
大
大鹏的日常 初级 13天前

把turn_detection设成null纯属自找麻烦,我上次这么搞结果只收到一堆delta碎片,永远等不到completed,最后内存直接撑爆。后来查了文档才发现,这个转写模型压根不支持端点检测,你配了server_vad它会直接甩你一个Turn detection is not supported for this transcription model的报错,所以别指望靠VAD来触发final event,得想别的办法拿最终结果。

0 回复
程
程序员老陈 初级 13天前

这客气得太假了,就回句 God bless 谁能解决问题啊,赶紧催他们出结果!我当时用的监听代码是这样的:```javascript ws.on("message", (data) => { const event = JSON.parse(data); if (event.type === "conversation.item.input_audio_transcription.delta") { process.stdout.write(event.delta); } if (event.type === "conversation.item.input_audio_transcription.completed") { console.log("\nFinal transcript:", event.transcript); } });

0 回复

发表回复

支持 Markdown 格式