Benchmark¶
Benchmark 页面用于说明 OpenTalking 如何记录端到端体验指标,以及如何引用外部模型服务的推理基线。OpenTalking 是编排层,因此这里区分两类数据:
| 类型 | OpenTalking 是否直接负责 | 示例 |
|---|---|---|
| 端到端体验指标 | 是 | 首帧延迟、TTS 首包、事件流、WebRTC 播放、音画同步。 |
| 模型推理基线 | 否,来自所选 backend | OmniRT FlashTalk、Wav2Lip、QuickTalk 本地 adapter 的渲染吞吐。 |
内容先沿用 main 分支 docs/zh/benchmark 中的 benchmark 口径,后续有新的测试结果时再继续补充。
运行完整 E2E Benchmark¶
完整链路 benchmark 直接使用:
这个脚本会按照 benchmark 配置读取输入素材、启动相关服务并采集结果。
进入 OpenTalking:
准备脚本权限:
chmod +x scripts/run_opentalking_e2e_benchmark.sh
chmod +x scripts/start_unified.sh
chmod +x scripts/quickstart/start_omnirt_quicktalk.sh
确认 benchmark 默认输入存在:
如果要替换测试头像或音频,直接替换上面两个文件,或修改 configs/benchmark/opentalking-e2e.yaml 中的输入路径即可。一般部署验证时,使用仓库自带 benchmark 输入即可。
设置低显存环境变量:
export CUDA_VISIBLE_DEVICES=0
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True,max_split_size_mb:128
export OPENTALKING_BENCHMARK_PYTHON="$PWD/.venv/bin/python"
export OPENTALKING_QUICKTALK_HUBERT_DEVICE=cpu
export OPENTALKING_QUICKTALK_RESOLUTION=160
export OPENTALKING_PREWARM_AVATARS=0
export OMNIRT_QUICKTALK_RUNTIME=1
export OMNIRT_QUICKTALK_DEVICE=cuda:0
export OMNIRT_QUICKTALK_HUBERT_DEVICE=cpu
export OMNIRT_QUICKTALK_BATCH_SIZE=1
export OMNIRT_QUICKTALK_WORKER_CACHE_MAX=1
运行 benchmark:
bash scripts/run_opentalking_e2e_benchmark.sh \
--tester xxx \
--model quicktalk \
--backend omnirt \
--gpu-index 0 \
--timeout 300
查找结果:
find /root/test/opentalking -name "result.json" -o -name "result.csv" -o -name "report.md" -o -name "*.tar.gz"
说明¶
run_opentalking_e2e_benchmark.sh 是完整链路入口。它比单独跑模型 benchmark 更适合最终部署验证,因为它覆盖了 OpenTalking、OmniRT、QuickTalk runtime、输入处理、服务启动、请求链路和结果统计。
WSL2 显存统计修复¶
WSL2 下,下面这个命令可能拿不到进程级显存:
因此 benchmark 中可能出现:
推荐口径:当 PID 级查询为空时,fallback 到整卡显存:
计算方式:
说明:
- 这不是单进程显存;
- 这是 benchmark 运行期间整卡显存相对 baseline 的增量;
- benchmark 期间不要同时运行其他 CUDA 程序。
指标定义¶
| 指标 | 含义 | 归属 |
|---|---|---|
session_create_ms |
创建会话到 API 返回的耗时。 | OpenTalking |
asr_partial_latency_ms |
用户说话到首个 partial transcript 的延迟。 | OpenTalking + STT provider |
llm_first_token_ms |
文本请求到首个 LLM token 的延迟。 | OpenTalking + LLM endpoint |
tts_first_pcm_ms |
句子提交到首段 PCM/音频字节返回的延迟。 | OpenTalking + TTS provider |
avatar_first_frame_ms |
音频提交到首帧 avatar 视频可用的延迟。 | OpenTalking + synthesis backend |
render_fps |
合成 backend 的视频帧生成吞吐。 | synthesis backend |
webrtc_first_frame_ms |
浏览器收到首个可播放视频帧的时间。 | OpenTalking + WebRTC |
av_drift_ms |
音频与视频播放时间线的偏移。 | OpenTalking |
queue_depth |
Worker 或外部模型服务队列深度。 | OpenTalking / backend |
steady_chunk_ms |
稳态 chunk 推理耗时。 | synthesis backend |
口径约束¶
- 首响类指标必须说明起点和终点,例如“用户结束说话到浏览器首帧”或“API 收到文本到 TTS 首包”。
render_fps只描述合成 backend,不等同于用户体感端到端 FPS。- 多卡、NPU、远端模型服务需要额外记录网络拓扑和队列状态。
已测试组合¶
| 路径 | 硬件 / 状态 | 数据 | 说明 |
|---|---|---|---|
| Wav2Lip quickstart | NVIDIA 3090 路径 | singer 示例约 28 帧 / 0.83-0.85s,约 33 FPS |
来自 README 的 quickstart 配置记录;用于轻量模型体验参考。 |
| QuickTalk local adapter | RTX 3090 | 720x900 / 25fps,约 35 FPS,显存约 3.8 GiB |
来自 README 的消费级显卡参考;用于 QuickTalk 本地 adapter 体验参考。 |
| FlashTalk via OmniRT | Ascend 910B2 x8,热态 full-audio | 937 帧 / 37.377s,约 25 FPS |
外部 OmniRT/模型服务推理基线,不代表 OpenTalking 本仓直接推理。 |
| FlashTalk steady chunk | Ascend 910B2 x8,热态 chunk | 29-frame chunk 约 30 FPS 等效 |
外部推理稳态数据,应与端到端首响分开记录。 |
FPS¶
FPS 需要区分两种口径:
render_fps:模型或 synthesis backend 生成帧的吞吐。- 播放 FPS:浏览器或 WebRTC 实际播放帧率。
模型推理 FPS 高,不一定等于端到端体验好。真实体验还会受 TTS、队列、网络、WebRTC 和浏览器解码影响。
首帧时间¶
首帧时间建议拆成几个阶段记录:
session_create_ms:会话创建耗时。tts_first_pcm_ms:TTS 首段音频返回耗时。avatar_first_frame_ms:音频进入模型后首帧可用耗时。webrtc_first_frame_ms:浏览器收到首个可播放视频帧耗时。
如果只记录一个“首帧时间”,后续很难判断瓶颈在 TTS、模型、队列还是播放链路。
启动时间¶
启动时间需要标注冷启动或热态:
- 冷启动:包含进程启动、模型加载、权重加载、Avatar 预处理和缓存构建。
- 热态:模型和缓存已经准备好,只测单次会话或单次 chunk。
- steady chunk:忽略首轮初始化,只测连续生成时的稳定吞吐。
QuickTalk 和 Wav2Lip 的首次 Avatar 初始化可能较慢,后续命中缓存会明显变快。
端到端延迟¶
端到端延迟建议从用户输入到浏览器可见输出来记录。不同输入形态有不同起点:
- 文本输入:用户提交文本。
- 语音输入:用户结束说话或 STT 产生稳定文本。
- 离线音频:音频文件提交到 API。
建议同时记录 TTS、模型和 WebRTC 阶段,否则只看总耗时无法定位问题。
资源占用¶
记录资源占用时建议包含:
- GPU / NPU 型号、数量和驱动版本。
- 显存峰值和稳定显存。
- CPU 核数和线程限制。
- 内存峰值。
- 模型权重版本。
- 是否启用量化、缓存和预热。
多模型部署时,还需要记录每个模型服务绑定的设备。
测试方法¶
QuickTalk 本地 adapter¶
仓库提供 apps/cli/quicktalk_bench.py,用于直接测 QuickTalk 本地 adapter 的加载、首帧、渲染和 mux 时间。
source .venv/bin/activate
python apps/cli/quicktalk_bench.py \
--asset-root /path/to/quicktalk/assets \
--template-video /path/to/template.mp4 \
--audio /path/to/input.wav \
--output outputs/benchmarks/quicktalk-output.mp4 \
--device cuda:0
输出 JSON 包含:
init_secondsaudio_feature_secondsfirst_frame_secondsrender_secondsrender_fpsmux_seconds
OpenTalking 端到端链路¶
端到端测试应先固定模型、TTS provider 和输入音频,再记录浏览器、API 与 Worker 日志。
建议记录:
- OpenTalking commit、配置文件、
.env中非密钥配置。 - 硬件与驱动版本。
- 选中的
avatar_id、model、backend。 - 输入音频时长、采样率和文本内容。
- 首 token、TTS 首包、avatar 首帧、浏览器首帧和音画同步结果。
外部模型服务¶
OmniRT、FlashHead direct WebSocket 或其它模型服务的推理数据应使用对应服务的 benchmark 工具生成。OpenTalking 文档只引用结果,并记录 OpenTalking 侧的调用、队列和播放表现。
结果模板¶
### <模型> / <backend> / <硬件> / <日期>
- OpenTalking commit:
- backend commit 或服务版本:
- 硬件:
- 模型与权重:
- avatar:
- 输入音频:
- 冷启动或热态:
- `session_create_ms`:
- `llm_first_token_ms`:
- `tts_first_pcm_ms`:
- `avatar_first_frame_ms`:
- `webrtc_first_frame_ms`:
- `render_fps`:
- `av_drift_ms`:
- 备注:
Benchmark 结果参考¶
可重点关注这些指标:
| 指标 | RTX 3050 Laptop 参考值 | 含义 |
|---|---|---|
| 输出分辨率 | 540×900 / 25fps | 最终输出规格 |
| 冷启动 | 6.0 s | 服务与模型初始化耗时 |
| 预热 | 20.8 s | 首次加载和推理准备耗时 |
| TTFA | 1661 ms | 首音频延迟 |
| TTFV | 2833 ms | 首视频帧延迟 |
| 首轮总延迟 | 4109 ms | 用户输入到首轮响应完成 |
| 稳态 FPS | 19.1 | 稳态视频生成帧率 |
| RTF | 1.17 | 大于 1 表示略慢于实时 |
| 显存占用 | 1.4 GiB | WSL2 fallback 后的显存统计 |
结论:RTX 3050 Laptop 可以跑通 QuickTalk 链路,但实时性能有限。它适合做部署验证和功能演示;如果目标是稳定 25fps+,建议使用 RTX 3060 / 4060 或更高规格 GPU。
测试结果¶
| 测试日期 | 模型 | 技术路线 | backend | 硬件 | OS | 驱动环境 | commit (opentalking + omnirt) | 输入类型 | 输出分辨率 | 输出FPS | chunk size | 冷启动时间/s | 预热时间/s | TTFA/ms | TTFV/ms | 首轮总延迟/ms | 稳态FPS | idle显存/GB | 推理峰值显存/GB |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026/5/20 | wav2lip | mouth inpainting | omnirt | RTX 3090 | Linux x86_64 glibc2.31 | driver 570.133.07 | a3047eab + 64c92ed1 | audio+image | 498×832 | 30 | 933ms | 4.096 | 12.043 | 1374.507 | 1625.962 | 3002.526 | 37.269 | 7.928 | 7.928 |
| 2026/5/20 | quicktalk | mouth inpainting | omnirt | RTX 3090 | Linux x86_64 glibc2.31 | driver 570.133.07 | a3047eab + 64c92ed1 | audio+image | 540×900 | 25 | 1120ms | 5.702 | 17.856 | 1551.773 | 1800.524 | 3356.019 | 29.23 | 1.662 | 1.662 |
| 2026/5/20 | musetalk | mouth inpainting | omnirt | RTX 3090 | Linux x86_64 glibc2.31 | driver 570.133.07 | a3047eab + 64c92ed1 | audio+image | 512×512 | 25 | 1000ms | 21.927 | 10.233 | 1464.464 | 1769.484 | 3235.518 | 28.868 | 5.078 | 5.078 |
| 2026/5/22 | wav2lip | mouth inpainting | omnirt | RTX 4090 | Linux x86_64 glibc2.39 | driver 570.211.01 | f16f7868 + 9a35e675 | audio+image | 498×832 | 30 | 933ms | 4.23 | 27.321 | 1730.871 | 1955.629 | 3689.764 | 31.542 | 8.133 | 8.133 |
| 2026/5/22 | quicktalk | mouth inpainting | omnirt | RTX 4090 | Linux x86_64 glibc2.39 | driver 570.211.01 | f16f7868 + 9a35e675 | audio+image | 540×900 | 25 | 1120ms | 4.319 | 15.871 | 1493.164 | 1064.825 | 2561.146 | 46.921 | 1.838 | 1.838 |
| 2026/5/22 | musetalk | mouth inpainting | omnirt | RTX 4090 | Linux x86_64 glibc2.39 | driver 570.211.01 | f16f7868 + 9a35e675 | audio+image | 512×512 | 25 | 1000ms | 18.309 | 13.866 | 1506.636 | 2095.522 | 3605.564 | 24.767 | 5.203 | 5.203 |
| 2026/5/22 | wav2lip | mouth inpainting | omnirt | NPU 910B2 | Linux aarch64 glibc2.35 | cann driver | f3532c19 + 5f24f56f | audio+image | 498×832 | 30 | 933ms | 9.478 | 35.931 | 1401.98 | 2615.322 | 4019.564 | 23.945 | 9.113 | 9.113 |
| 2026/5/22 | quicktalk | mouth inpainting | omnirt | NPU 910B2 | Linux aarch64 glibc2.35 | cann driver | f3532c19 + 5f24f56f | audio+image | 540×900 | 25 | 1120ms | 9.471 | 39.142 | 1427.894 | 1782.861 | 3212.053 | 29.66 | 2.473 | 2.473 |
| 2026/5/22 | musetalk | mouth inpainting | omnirt | NPU 910B2 | Linux aarch64 glibc2.35 | cann driver | f3532c19 + 5f24f56f | audio+image | 512×512 | 25 | 1000ms | 27.177 | 65.282 | 1566.821 | 4211.721 | 5781.453 | 12.276 | 8.754 | 8.754 |
| 2026/5/27 | quicktalk | mouth inpainting | omnirt | RTX 3050 Laptop | WSL2 glibc2.35 | driver 581.57 | 3c893c52 + 5f24f56f | audio+image | 540×900 | 25 | 1120ms | 5.98 | 20.77 | 1661 | 2833 | 4109 | 19.06 | 1.41 | 1.41 |
| 2026/5/27 | quicktalk | mouth inpainting | omnirt | RTX 3050 Laptop | WSL2 glibc2.35 | driver 581.57 | 3c893c52 + 5f24f56f | audio+image | 306×512 | 25 | 1120ms | 6.282 | 20.78 | 1580.28 | 2661 | 4243.26 | 20.695 | 1.385 | 1.396 |