消息
等 session.ready 后再推裸 PCM。控制消息只有 finalize / stop / ping。
客户端 → 服务端
| 消息 | 载荷 | 说明 |
|---|---|---|
session.finalize | — | 把正在说的这一段立刻收尾,并推出 final。 |
session.stop | — | 正常结束这条流。 |
session.ping | — | 保活。服务端回 session.pong。 |
音频帧是裸 pcm_s16le、16 kHz、单声道,单帧不超过 64 KB。没有帧头、没有序号、不用记账偏移——按顺序发字节,剩下的服务端处理。
服务端 → 客户端
所有服务端消息都是带 type 的 JSON 文本帧。sessionId 只在 session.ready 上,不会出现在每条转写或译文里。segmentId 是不透明 id,不要解析前缀。
| 消息 | 载荷 | 说明 |
|---|---|---|
session.ready | sessionId, audio, limits, store, region | 流已经开始。可以发音频了。 |
transcript.partial | text, language?, pending?, tail?, paragraphs?, tailTranslation? | 预览快照。逐句模式的 paragraphs 为 {speaker?, pieces: [{text, confirmed}], translation?},tail/tailTranslation 为未完句;pending 为平铺兼容字段。每次替换快照,按段展示译文,不叠加汇总的 translation.partial;仅 transcript.final 可作为最终结果保存。 |
transcript.final | segmentId, text, startMs?, endMs?, speaker?, language? | 已落定的段落,时间在有效音频时钟上。 |
translation.partial | text, sourceText | 还不稳定的译文预览。 |
translation.final | segmentId, text, sourceText, sourceLanguage, targetLanguage, enhanced? | 已落定的译文。开了 aiEnhance 时,同一个 segmentId 会再推一次,并带 enhanced: true。 |
digest.update | sections[] | 滚动纪要:{ title, points[], confirmed }。每次推送替换上一份。 |
usage.update | effectiveSamples, discardedSamples, effectiveSeconds, discardedSeconds, priceCentsPerHour, accruedCents, collectedCents, uncollectedCents, balanceCents | 每 15 秒一次,结束时再来一次。 |
session.error | code, message, retryable, scope | 可恢复或致命的错误。 |
session.ended | reason, enhancement, storage, billing | 服务端结束了这条流。存储和精修各自有状态。 |
session.pong | — | 对 session.ping 的回复。 |