Skip to content

处理链路与运行架构 ​

以两人交替发言的会议为例,服务需要继续接收第二句话,同时识别第一句话,并等待角色证据。普通转写保留两人的内容;目标转写只返回登记说话人的内容。接入可以共用,音频提交和推理计划必须按模式分开。

普通、多人和目标转写的运行关系

连续音频与分段任务 ​

输入层将 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 -> Finalized

Receiving 期间可以同时存在多个正在识别的段。stop/EOF 让会话停止收音并进入 Draining:封口尾部、提交剩余段、等待已接受任务、发送 terminal。发生不可恢复错误时走失败收敛路径,按协议报告失败;不能发送成功终止事件来掩盖未完成任务。

对象内部标识示例必须保持的约束
会话session_id、generation重连后旧回调与任务不得写入新会话
音频段segment_id、样本区间封口后 PCM 与区间不可变
推理任务job_id、attempt、deadline重试保留原始截止时间
句子结果sentence_id、finalizedFinal 定稿后不再被异步覆盖

这些是内部对象设计,适配层仍然映射到既有接口,不要求调用方升级协议。

并行完成与有序发布 ​

短句可能比前面的长句先完成。worker 并行执行,合并器按协议序号发布,并限制待发布缓冲大小。每个段都有截止时间;前段失败时用协议允许的错误结果推进,不能无限阻塞后续句子,也不能伪造身份编号。

原始角色证据、当前身份关联和已发布字段分开存储。重新分析历史上下文可以改善未定稿结果,但不得重写已发布 Final。页面直接消费定稿角色字段,不能用后来的临时角色表重新计算旧句子的身份。

实现检查 ​

用一段交替发言音频分别运行三种模式,核对接收 PCM、父子段区间、最终模型输入和原始事件。普通模式应保留全部语音,目标模式必须实际携带登记参考,多人模式应检查同一人再次返回时的身份。最后在第二段仍运行时发送 EOF,确认每个已接受任务有完成或失败结果,terminal 不提前到达。

别急,先让缓存热一下。