文档 09 / 28

实时翻译子系统 LLD

Low-Level Design · ASR → MT → TTS 全链路 · 接口契约 · 延迟预算

册别:第三册 · 技术与架构 版本:V1.0 日期:2026-08-15 状态:草稿待评审

一、系统概述

实时翻译子系统是 Vocalink 的技术核心。它将用户 A 说的中文语音,在 < 500ms 内变成用户 B 看到的英文文字(+ P1 听到的英文语音)。

核心指标:

指标目标测量方式
端到端延迟 P95< 500ms从音频采集到译文渲染的时间戳差
翻译 BLEU (中英)> 40每周批量评估集测试
ASR 词错率 (CER)< 8%(中文)/ < 5%(英文)内部标注集
翻译可用性99.9%5 分钟粒度健康检查
并发翻译流5000+ 路Kafka consumer 并行度

1.1 全链路数据流

🎙️
音频采集
iOS/Android
16kHz Opus
0ms
📡
WebSocket 上行
WSS + 分帧
20ms/chunk
20-50ms
🗣️
ASR 语音识别
Google Speech
流式
150-200ms
🌐
MT 机器翻译
Google Translate
流式
150-200ms
🗄️
缓存检查
Redis
TTL 24h
2-5ms
📤
Kafka 发布
subtitle-out
topic
5-10ms
📱
客户端渲染
字幕滑入
+ TTS(P1)
50-100ms

1.2 延迟预算分解

采集+编码 50ms
网络上行 50-100ms
ASR 150-200ms
MT 150-200ms
下行+渲染 50-100ms

总预算:450-650ms → 优化目标 P95 < 500ms(中位数 ~350ms)

二、ASR 语音识别模块

2.1 模块职责

项目规格
引擎Google Speech-to-Text API (中文) + Azure Speech (英文)
模式流式识别(Streaming Recognize),非整句阻塞
音频格式Linear16, 16kHz, 单声道, 每 chunk 20ms
语种检测前 3 秒自动检测(Google auto-detect)
中间结果每 200-500ms 返回 is_final=false 的增量结果
最终结果is_final=true(句子结束/停顿 > 800ms)
置信度阈值> 0.6 才进入翻译;< 0.6 标记 [uncertain]
超时静音 3 秒强制 flush final

2.2 接口契约

WebSocket wss://api.vocalink.sg/v1/asr/stream 客户端 → ASR 网关

客户端将采集的 Opus 音频解码为 PCM 后,通过 WebSocket 发送。每帧 20ms(640 bytes @ 16kHz/16bit)。

{ "type": "audio_chunk", "call_id": "call_abc123", "seq": 42, "timestamp_ms": 1715324800000, "audio": "base64_encoded_pcm_chunk", "sample_rate": 16000, "encoding": "linear16", "language_hint": "zh-CN" }
WebSocket ← ASR 网关 → 客户端(识别结果) 服务端推送
{ "type": "asr_result", "call_id": "call_abc123", "seq": 42, "is_final": false, "text": "我今天想去", "confidence": 0.87, "language_detected": "zh-CN", "start_time_ms": 1200, "end_time_ms": 1680 }

2.3 语种自动检测

# 语种检测逻辑(Translate Service 内部) def detect_language(audio_chunk, history=[]): # 前 3 秒使用 Google auto-detect if len(history) < 3: # 3 seconds of audio result = google_speech.stream_recognize( audio=audio_chunk, config={"language_code": "auto"} ) detected = result.detected_language() else: # 3 秒后锁定语种(避免中途切换) detected = history[0].language return detected # "zh-CN" or "en-US"

2.4 ASR 降级策略

场景降级动作用户感知
Google API 超时 (>5s)切换 Azure Speech 重试短暂延迟(1-2 秒)
双引擎都失败标记 [语音识别不可用]对方看到"暂时无法识别语音"
置信度 < 0.4显示 [unclear] + 原文波形字幕显示灰色"听不清楚"
网络丢包 > 20%降低采样到 8kHz + 降帧率音质下降但识别仍工作

三、MT 机器翻译模块

3.1 模块职责

项目规格
引擎Google Translate API(Phase 1 唯一引擎)
模式流式翻译(句子级,非逐词)
语种对zh-CN ↔ en-US(Phase 1 仅 1 对)
触发条件ASR 返回 is_final=true 或文本 > 15 字符
上下文窗口最近 3 轮对话(约 200 token)
术语库中英双语文化术语表(持续迭代)
NER 过滤人名/地名/专有名词不翻译(保留原文)
口语优化训练语料偏口语对话(非书面翻译)

3.2 翻译请求接口

POST https://api.vocalink.sg/v1/translate Translate Service 内部调用
{ "call_id": "call_abc123", "seq": 42, "source_lang": "zh-CN", "target_lang": "en-US", "source_text": "我今天想去吃火锅", "context": ["你吃过火锅吗?", "没有,我来自英国"], "glossary": ["火锅→hotpot", "英国→UK"], "priority": "realtime" }
Response ← 翻译结果 JSON
{ "call_id": "call_abc123", "seq": 42, "translated_text": "I want to eat hotpot today", "confidence": 0.92, "latency_ms": 187, "engine": "google_translate", "cached": false, "source_text": "我今天想去吃火锅" }

3.3 缓存策略

# Redis 缓存设计 import hashlib, json def get_cache_key(source_text, src_lang, dst_lang): key = f"{src_lang}:{dst_lang}:" + hashlib.md5(source_text.encode()).hexdigest()[:16] return key def translate_with_cache(text, src, dst): cache_key = get_cache_key(text, src, dst) # L1: Redis 缓存(命中率 ~30%) cached = redis.get(cache_key) if cached: return json.loads(cached), True # L2: 调用 Google Translate result = google_translate.translate(text, src=src, dst=dst) # 写入缓存(TTL 24h) redis.setex(cache_key, 86400, json.dumps(result)) return result, False
缓存层命中率延迟TTL
L1 · 进程内 LRU~10%< 1ms5 分钟
L2 · Redis Cluster~30%2-5ms24 小时
L3 · Google Translate150-200ms
综合命中率~35-40%

3.4 降级策略

场景降级动作用户感知
Google Translate 超时重试 1 次(指数退避 500ms)字幕延迟 1-2 秒
重试仍失败显示原文 + [翻译中…]对方看到原文(不懂)
连续 5 次失败切换备用引擎(DeepL/微软)短暂中断后恢复
全部引擎失败降级为纯语音模式无字幕,仅语音

四、TTS 语音合成模块(P1)

📌 Phase 1 范围:TTS 在 Phase 1 后期(M5-M6)上线,属于 P1 功能。Phase 1 前 4 个月仅提供文字字幕。

4.1 模块职责

项目规格
引擎Azure TTS(Neural Voices)
语音选择zh-CN → "en-US-JennyMultilingualNeural"
en-US → "zh-CN-XiaoxiaoNeural"
延迟目标< 300ms(从文本到音频输出)
音频格式MP3, 24kHz, 输出到客户端播放
触发仅 VIP 用户(免费用户仅文字)
缓存同 MT 缓存键,TTL 7 天

4.2 TTS 接口

POST https://api.vocalink.sg/v1/tts/synthesize Translate Service → Azure
{ "call_id": "call_abc123", "seq": 42, "text": "I want to eat hotpot today", "target_lang": "en-US", "voice": "en-US-JennyMultilingualNeural", "user_tier": "vip", "cached": false }

4.3 TTS 降级

场景降级
Azure 超时跳过 TTS,仅显示文字字幕
VIP 降级为免费即时切换为纯文字模式
网络差降低 TTS 音频码率到 16kHz

五、字幕分发(Subtitle Pipeline)

5.1 Kafka Topic 设计

Topic分区数保留期ProducerConsumer
audio-stream321 小时Call ServiceTranslate Service
asr-results321 小时ASR WorkerTranslate Worker
subtitle-out321 小时Translate ServiceCall Service → 客户端
translate-events167 天Translate ServiceAnalytics + 模型迭代

5.2 字幕推送接口

WebSocket ← Translate Service → 客户端 字幕实时推送
{ "type": "subtitle", "call_id": "call_abc123", "seq": 42, "is_final": true, "source_lang": "zh-CN", "target_lang": "en-US", "source_text": "我今天想去吃火锅", "translated_text": "I want to eat hotpot today", "tts_audio_url": "https://cdn.vocalink.sg/tts/abc123_42.mp3", "latency_ms": 342, "confidence": 0.92 }

5.3 客户端字幕渲染规则

规则实现
中间结果半透明显示(opacity 0.5),底部滑入动画 200ms
最终结果实色显示 + 小号译文在下方
新句子旧句上移 20px 淡出(300ms),新句从底部滑入
超长文本> 2 行截断 + "…" + 点击展开
翻译中灰色斜体 "Translating…"(不超过 1 秒)
翻译失败显示原文 + 红色小字 "Translation unavailable"
TTS 音频收到后自动播放(用户可关闭),不抢通话音频通道

六、质量监控与告警

6.1 监控指标

指标采集方式告警阈值动作
端到端延迟 P95每次通话采样> 600ms 持续 5minPage 值班 + 检查 Google API 状态
ASR 可用性每 30s 健康检查< 99% 持续 2min自动切换 Azure
MT 可用性每 30s 健康检查< 99% 持续 2min重试 + 备用引擎
翻译质量 BLEU每日离线评估< 38 持续 3 天触发模型迭代
Kafka 积压每 10s 采集> 10000 消息自动扩容 Consumer
缓存命中率每 5min 聚合< 25% 持续 1h检查 Redis 健康
错误率每 1min 聚合> 5% 持续 3minPage + 自动降级检查

6.2 告警分级

级别响应时间通知方式示例
P3 低4 小时内Slack #vocalink-alertsBLEU 轻微下降
P2 中1 小时内Slack + SMS缓存命中率下降
P1 高15 分钟内电话 + SMS + Slack翻译 API 大面积超时
P0 紧急立即电话 + 全员 + 升级 CEO翻译全链路中断

6.3 可观测性架构

工具用途数据来源
Prometheus指标采集 + 告警规则所有微服务 /metrics 端点
Grafana可视化看板Prometheus 数据源
Jaeger分布式链路追踪每次翻译请求 trace_id
Sentry异常捕获 + 堆栈客户端 + 服务端 SDK
CloudWatchAWS 基础设施监控EKS / RDS / Kafka

七、降级与容灾策略

7.1 降级金字塔

✅ Level 0
全功能
ASR+MT+TTS
延迟 < 500ms
⚠️ Level 1
无 TTS
文字字幕正常
VIP 降级为文字
⚠️ Level 2
无翻译
纯语音通话
显示原文
🚫 Level 3
文字模式
语音不可用
切文字消息
❌ Level 4
服务中断
显示维护页
预估恢复时间

7.2 自动降级触发条件

def check_degradation(metrics): # Level 判定(从高到低检查) if metrics.asr_latency_p95 > 1000 or metrics.mt_latency_p95 > 1000: return "level_2" # 无翻译 if metrics.tts_latency_p95 > 800: return "level_1" # 无 TTS if metrics.kafka_lag > 50000: return "level_2" # 降级为纯语音 if metrics.audio_rtt > 500: return "level_3" # 文字模式 return "level_0" # 全功能 # 降级通过 Config Service 实时推送 config_service.set_flag("translate.degradation_level", level)

7.3 容灾方案

故障RTO方案
Google API 区域故障< 2 分钟自动切换 Azure Speech/Translate
Kafka 集群故障< 5 分钟降级为直接 gRPC 调用(绕开 Kafka)
Translate Service 全挂< 1 分钟Config Service 推送 level_2 降级
AWS ap-southeast-1 故障< 15 分钟DNS 切换到 GCP asia-southeast1
Redis 全挂即时L1 缓存失效,全部走 L3 API(慢但可用)

八、翻译引擎演进路线

阶段ASRMTTTSBLEU成本/千次
Phase 1 (M1-M6)Google(zh)+Azure(en)Google TranslateAzure TTS> 40~$0.50
Phase 1.5 (M5-M6)同上 + 微调同上 + 术语库Azure + 缓存优化> 42~$0.40
Phase 2 (M7+)混合:高频自研混合:长尾 API自研 TTS(P2.5)> 42~$0.20
Phase 3 (Y2)自研为主自研(PyTorch+ONNX)自研 Neural TTS> 45~$0.05

8.1 自研翻译模型计划

# Phase 3 自研模型训练 pipeline class TranslationModel: def __init__(self, src_lang, dst_lang): self.model = load_pretrained("mbart-large-50") self.tokenizer = load_tokenizer(src_lang, dst_lang) def finetune(self, dataset): # 使用 Vocalink 真实对话语料(脱敏) for epoch in range(10): loss = self.model.train_step(dataset) if loss < 0.01: break def export_onnx(self, path): # 导出 ONNX 用于生产推理(快 + 跨平台) onnx.export(self.model, path, opset=17) def benchmark(self, test_set): bleu = compute_bleu(self.translate(test_set), test_set.references) latency = measure_latency(self.translate, p95_target=300) return {"bleu": bleu, "p95_latency_ms": latency}

💡 自研 ROI 分析:

指标Phase 1 (API)Phase 3 (自研)节省
千次翻译成本$0.50$0.0590%
月翻译量 (P3)1 亿次1 亿次
月成本$5 万$0.5 万$4.5 万/月
年节省$54 万/年
自研投入~$30 万(2 名 NLP 工程师 × 6 个月)6 个月回本

附录

附录 A:术语表

术语含义
ASRAutomatic Speech Recognition,自动语音识别
MTMachine Translation,机器翻译
TTSText-to-Speech,语音合成
BLEUBilingual Evaluation Understudy,翻译质量评分(0-100)
CERCharacter Error Rate,字符错误率
is_finalASR 标志位,表示当前句子是否识别完毕
Streaming流式处理,边输入边输出(非整句阻塞)
SFUSelective Forwarding Unit,选择性转发单元(WebRTC)
NERNamed Entity Recognition,命名实体识别

附录 B:相关文档

文档关联内容
08 系统架构 HLDTranslate Service 在整体架构中的位置
10 API 接口规范所有微服务间接口契约
12 第三方服务集成方案Google/Azure API 接入细节
05 产品特性与差异化说明书翻译质量目标与差异化

附录 C:修订记录

版本日期修改内容作者
V1.02026-08-15初始版本算法团队