流式传输

This commit is contained in:
yinsx
2025-12-25 15:36:35 +08:00
parent e56f47076c
commit 14bfdcbf51
19 changed files with 1191 additions and 65 deletions

176
需求.md Normal file
View File

@ -0,0 +1,176 @@
我现在已经跑通了a2f能够将音频转化成csv格式文件我想让你帮我实现一个项目用py写实现两个函数文字转音频文件/音
频文件转csv文件/csv文件转52个形态键/ 最后在暴露出一个文字输入的接口输出52个形态键的数据
python_services项目你可以作为参考# Babylon.js + A2F 低延迟实时嘴型方案设计文档
## 1. 文档目的
本文档用于指导在 **Babylon.jsWeb** 环境下,基于 **Audio2FaceA2F** 实现“尽可能低延迟”的数字人嘴型驱动方案。目标并非严格意义上的零延迟实时,而是在 Web 约束下实现 **准实时400600ms 首帧延迟)** 且稳定可上线的工程方案。
---
## 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 句尾处理
* 每句音频结尾 **补 150300ms 静音**
* 用于嘴型自然回到 neutral
---
## 5. 后端处理流程
### 5.1 流水线调度
* 同时最多处理 **23 句**
* 始终保证:
* 当前句播放中
* 下一句已 ready
### 5.2 TTS 要求
* 必须支持 **流式 / chunk 输出**
* chunk 大小建议100200ms 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 优点
* 数据量减少 6080%
* WebSocket 直传
* JS 解析成本极低
---
## 7. 前端Babylon.js播放方案
### 7.1 核心原则
* **不用 onBeforeRender 逐帧 setInfluence**
* 使用 **Animation / AnimationGroup**
* 前端只负责:
* buffer
* 时间对齐
* 插值
### 7.2 帧率与形态键
| 项目 | 建议 |
| ------------ | --------- |
| 嘴型帧率 | 1520 fps |
| 形态键 | 2030 个 |
| Morph Normal | 关闭 |
### 7.3 句间过渡
* 句尾morph → neutral100ms lerp
* 句首neutral → first frame100ms fade in
---
## 8. 延迟评估
| 环节 | 典型延迟 |
| --------- | ---------- |
| 流式 TTS | 100200 ms |
| A2F 计算 | 200300 ms |
| 网络 | 2050 ms |
| 前端 buffer | ~100 ms |
**总首帧延迟:≈ 400600 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数据实时播放