Appearance
处理链路与运行架构
以两人交替发言的会议为例,服务需要继续接收第二句话,同时识别第一句话,并等待角色证据。普通转写保留两人的内容;目标转写只返回登记说话人的内容。接入可以共用,音频提交和推理计划必须按模式分开。
连续音频与分段任务
输入层将 PCM 固定为约定的采样率、声道和样本格式,按序号接收。内部时间范围使用半开样本区间 [start_sample, end_sample),时长为 (end_sample - start_sample) / sample_rate。网络到达时间用于观测传输,不用于计算原音区间;重采样后的样本编号不能和原始采样率混算。
TEN-VAD 负责主要语音边界。角色模块需要覆盖发言前后的上下文,因此数据拓扑不应简单画成“VAD 切完之后才开始所有角色分析”:连续音频旁路和封口段的分析可以并存,但只能有一个主分段器决定提交区间。代码中先调用某个模块,也不意味着它拥有分段决策权。
三种模式的推理计划
| 模式 | 分段与模型输入 | 结果合并 |
|---|---|---|
| 普通转写 | TEN-VAD 段进入普通 ASR,不启用目标身份门控 | 文字与时间区间 |
| 多人转写 | TEN-VAD 父段结合角色时间线形成子段;按实际策略识别子段 | 子段文字与会话身份关联 |
| 目标转写 | TEN-VAD 段结合 Speaker VAD 证据,登记参考与混合语音进入 TS-ASR | 目标文字及稳定协议字段 |
多人模式中,角色证据影响子段构造,不能假定普通 ASR 与角色分析始终互不依赖。已经确认的子段可以独立完成;一个歧义子段不能抹掉其他已确认结果。目标模式中,Nemotron 匿名槽位不等于机主,不能根据槽位切掉混合语音后再假定目标内容完整。
普通与目标识别使用同一热词解析器,但保留各自解码入口。共享对象是词库、召回和合并能力;请求 PCM、登记参考、提示词和返回文字都属于当前请求。具体机制见共享热词召回。
进程与资源边界
网关负责 WebSocket、会话、段任务和协议。角色 worker、声纹 worker、普通解码和目标解码各自承担计算,不因入口增加连接就复制全部模型进程。目标解码优先使用一个进程的动态序列调度,提高已有权重的复用率;角色 worker 数和声纹批次容量单独配置。
依赖初始化按顺序执行:校验配置与工件,加载受保护资源,启动模型进程,再启动可接受流量的网关。健康接口要区分进程存活、模型可用与代表性音频预热完成。加载成功不代表首个波形请求没有初始化成本。
会话、音频段与任务的生命周期
text
会话:Created -> Receiving -> Draining -> Closed
音频段:Collecting -> Sealed -> Queued -> Running -> FinalizedReceiving 期间可以同时存在多个正在识别的段。stop/EOF 让会话停止收音并进入 Draining:封口尾部、提交剩余段、等待已接受任务、发送 terminal。发生不可恢复错误时走失败收敛路径,按协议报告失败;不能发送成功终止事件来掩盖未完成任务。
| 对象 | 内部标识示例 | 必须保持的约束 |
|---|---|---|
| 会话 | session_id、generation | 重连后旧回调与任务不得写入新会话 |
| 音频段 | segment_id、样本区间 | 封口后 PCM 与区间不可变 |
| 推理任务 | job_id、attempt、deadline | 重试保留原始截止时间 |
| 句子结果 | sentence_id、finalized | Final 定稿后不再被异步覆盖 |
这些是内部对象设计,适配层仍然映射到既有接口,不要求调用方升级协议。
并行完成与有序发布
短句可能比前面的长句先完成。worker 并行执行,合并器按协议序号发布,并限制待发布缓冲大小。每个段都有截止时间;前段失败时用协议允许的错误结果推进,不能无限阻塞后续句子,也不能伪造身份编号。
原始角色证据、当前身份关联和已发布字段分开存储。重新分析历史上下文可以改善未定稿结果,但不得重写已发布 Final。页面直接消费定稿角色字段,不能用后来的临时角色表重新计算旧句子的身份。
实现检查
用一段交替发言音频分别运行三种模式,核对接收 PCM、父子段区间、最终模型输入和原始事件。普通模式应保留全部语音,目标模式必须实际携带登记参考,多人模式应检查同一人再次返回时的身份。最后在第二段仍运行时发送 EOF,确认每个已接受任务有完成或失败结果,terminal 不提前到达。
