Skip to content

feat(realtime): bind versioned ASR/TTS profiles to turns - #247

Draft
jinyu918 wants to merge 11 commits into
1024XEngineer:devfrom
jinyu918:feat/language-speech-bindings-phase-3
Draft

feat(realtime): bind versioned ASR/TTS profiles to turns#247
jinyu918 wants to merge 11 commits into
1024XEngineer:devfrom
jinyu918:feat/language-speech-bindings-phase-3

Conversation

@jinyu918

Copy link
Copy Markdown
Contributor

背景

为支持按语言对选择固定的 ASR/TTS Profile,实时服务需要将 Provider 选择从进程级默认配置下沉为会话级 binding,并在 Turn 开始时冻结该选择。

本 PR 实现方案中的阶段 3 运行时边界:默认语言对的 binding 准备、按语言配置版本获取 Turn 快照,以及 ASR/TTS/Voice 对该快照的使用。

本次改动

  • 新增 BindingCoordinator,以会话和语言配置版本为维度管理 TurnSpeechBinding

    • 通过既有 RouteResolver 解析语言对路由。
    • 通过 ProviderRegistry 按 Profile ID 获取已构造的 ASR/TTS Adapter。
    • 同一版本共享进行中的准备结果;更高版本会阻止迟到的旧结果覆盖当前 binding。
    • AcquireForTurn 只接受与当前 Turn 语言配置版本完全一致的 binding,不会回退到旧 Profile。
    • 会话关闭会取消待处理准备;已获取的 Turn lease 仍可完成当前处理链路。
  • 在注入 speech binding coordinator 时,runtime.Manager.Start 会在打开音频输入前:

    • 读取活动语言配置并规范化双向语言对;
    • 准备默认 binding;
    • binding 无法准备时失败关闭,不创建活跃 Pipeline。
  • 扩展 TurnContext,在 Turn 打开时获取不可变的 ASR/TTS binding,并在 ASR、翻译、TTS 和播放完成后释放 lease。

  • 将 Pipeline 切换为使用 Turn binding:

    • ASR 使用 binding 中固定的 Adapter/Profile。
    • TTS 使用 binding 中固定的 Adapter、Voice 和 Profile 元数据。
    • Provider 延迟与失败日志使用实际绑定的 Provider/Model。
  • 扩展内部 FinalTurnEvent,可选携带 asr_profile_idtts_profile_id

    • Profile ID 纳入事件校验和幂等 payload hash。
    • 公开 VoiceTurn 与 OpenAPI schema 不暴露内部 Profile ID。

行为保证

  • 同一语言配置版本的 Turn 使用同一组 ASR/TTS Profile。
  • 当前 Turn 在后续配置变更后仍持有原有 Provider、Model 和 Voice。
  • binding 尚未就绪、准备失败或版本不匹配时,新的 Turn 不会静默使用旧 binding。
  • 语言配置的迟到准备结果不会回退已安装的更新版本。

不在本 PR 范围

  • 服务入口从 PostgreSQL speech catalog 构造并注入 BindingCoordinator
  • language.config.changed Outbox/Valkey 事件,以及语言切换后的异步 binding 准备与 CAS 提升。
  • Provider 真实预热、统一 PCM/Opus 媒体出口改造。
  • FinalTurn Profile ID 的数据库持久化、历史 fallback playback 和指标接入。

验证

  • cd services/realtime-audio && go test ./...
  • cd packages/contracts && go test ./...
  • git diff --check 80e4f86..HEAD

覆盖了版本冲突与迟到结果、pending preparation、会话关闭、启动失败关闭、Turn 使用绑定的 ASR/TTS/Voice、FinalTurn Profile ID 以及公开 schema 隔离。

前置 PR

相关issue

@jinyu918 jinyu918 self-assigned this Aug 13, 2026
@jinyu918 jinyu918 added the enhancement New feature or request label Aug 13, 2026
@github-actions

Copy link
Copy Markdown

Go coverage

Scope Current Baseline Delta
packages/contracts 87.8% 87.2% +0.6%
services/api 60.6% 60.8% -0.2%
services/realtime-audio 78.3% 78.6% -0.2%
Total 69.3% 69.2% +0.1%

Base branch: dev · Commit: 01347f1 · Test workflow run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant