Files
a2f-service/需求.md
2025-12-25 15:36:35 +08:00

4.3 KiB
Raw Blame History

我现在已经跑通了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数据实时播放。