4.3 KiB
4.3 KiB
我现在已经跑通了a2f,能够将音频转化成csv格式文件,我想让你帮我实现一个项目:用py写实现两个函数,文字转音频文件/音 频文件转csv文件/csv文件转52个形态键/ 最后在暴露出一个文字输入的接口,输出52个形态键的数据 python_services项目你可以作为参考,# Babylon.js + A2F 低延迟实时嘴型方案设计文档
1. 文档目的
本文档用于指导在 Babylon.js(Web) 环境下,基于 Audio2Face(A2F) 实现“尽可能低延迟”的数字人嘴型驱动方案。目标并非严格意义上的零延迟实时,而是在 Web 约束下实现 准实时(400–600ms 首帧延迟) 且稳定可上线的工程方案。
2. 设计约束与前提
2.1 技术约束
- A2F 本身为 非严格流式模型,需要一定音频前瞻(lookahead)
- Babylon.js MorphTarget 为 CPU 驱动 + GPU 顶点更新,性能敏感
3. 总体方案概述
3.1 核心思想
- 文本按句拆分,缩短首帧等待时间
- 句级流水线处理,而非整段阻塞
- 音频与嘴型数据流式推送
- 前端仅负责 插值播放,不做重计算
3.2 总体架构
文本输入
↓
句子拆分(强停顿标点)
↓
句子队列(Pipeline)
↓
┌──────────────┐
│ 流式 TTS │
└──────────────┘
↓ PCM chunk
┌──────────────┐
│ A2F(句级) │
└──────────────┘
↓ BlendShape Frames
┌──────────────┐
│ 二进制传输 │
└──────────────┘
↓
Babylon.js 插值播放
4. 文本拆句策略
4.1 拆分规则
-
仅按 强停顿标点 拆分:
。!?;
4.3 句尾处理
- 每句音频结尾 补 150–300ms 静音
- 用于嘴型自然回到 neutral
5. 后端处理流程
5.1 流水线调度
-
同时最多处理 2–3 句
-
始终保证:
- 当前句播放中
- 下一句已 ready
5.2 TTS 要求
- 必须支持 流式 / chunk 输出
- chunk 大小建议:100–200ms PCM
5.3 A2F 调用策略
- 不等待整段文本
- 以 句为最小单元调用
6. 数据格式设计(替代 CSV)
6.1 为什么不用 CSV
- 文本解析慢
- 数据冗余大
- 不支持流式 append
6.2 推荐二进制结构
Frame {
uint16 timestamp_ms;
uint8 shape_count;
uint8 shape_indices[shape_count];
int8 shape_values[shape_count]; // -127 ~ 127
}
6.3 优点
- 数据量减少 60–80%
- WebSocket 直传
- JS 解析成本极低
7. 前端(Babylon.js)播放方案
7.1 核心原则
-
不用 onBeforeRender 逐帧 setInfluence
-
使用 Animation / AnimationGroup
-
前端只负责:
- buffer
- 时间对齐
- 插值
7.2 帧率与形态键
| 项目 | 建议 |
|---|---|
| 嘴型帧率 | 15–20 fps |
| 形态键 | 20–30 个 |
| Morph Normal | 关闭 |
7.3 句间过渡
- 句尾:morph → neutral(100ms lerp)
- 句首:neutral → first frame(100ms fade in)
8. 延迟评估
| 环节 | 典型延迟 |
|---|---|
| 流式 TTS | 100–200 ms |
| A2F 计算 | 200–300 ms |
| 网络 | 20–50 ms |
| 前端 buffer | ~100 ms |
总首帧延迟:≈ 400–600 ms
9. 风险与边界
- A2F 不适合 <200ms 的强实时场景
- 高并发时需限流(TTS / A2F GPU)
- 超长文本必须强制拆句
10. 结论
- 拆句 + 流水线 是 Web + A2F 的最优解
- CSV 必须淘汰,二进制流是必选项
- 在 Babylon.js 中可实现稳定、可上线的准实时数字人嘴型系统
正常流式传输逻辑是后端将文字拆分成句,每个句调用TTS生成音频,再调用A2F生成blendshape数据,最后将blendshape数据发送给前端。要有并发处理能力,能够同时处理多句。优先将当前句的blendshape数据发送给前端,等下一句blendshape数据 ready 后再发送。FLASK后端可以使用异步处理,用FlaskAPI库的asyncio支持。前端可以使用WebSocket接收blendshape数据,实时播放。