BlueRoseNote/02-Note/DAWA/AI偶像陪伴项目/AI偶像陪伴项目笔记.md

4.0 KiB
Raw Blame History

各个服务负责人

  • TTS文字=>音频)
    • 张守高
  • 动作 (文字=>动作)
    • 张渤林
    • 孙佳俊
  • 口型(音频=>表情数据)
    • 张渤林
    • 常清

存在问题

  1. 目前是否以文件的方式实现。
  2. 文字、声音、表情与动作的关联性。(主要是声音、表情与动作)
  3. 生成资产数据存在顺序依赖问题
    1. 文字 => 声音 => 表情(口型)
    2. 文字 => 动作

推流设计思路

  1. 服务器发送的数据都使用一个基于玩家发送对话生成的UUID作为时间戳或许还需要一个用户ID)。
  2. 数据采用Stream式发送。动作与口型使用VMC来传输音频使用RTMP协议来传输。其中推流模式分为2种实现
    1. Stream式实时接受所有数据。
    2. Stream式缓存预读。
  3. 架构
    1. 根据上面说得2种模式在服务端控制时间戳的重置数据截断,并且发送给客户端进行截断与时间轴统一操作)。
      1. Puerts的Nodejs负责接收数据以及管理状态机来管理接受的推流数据以及是否播放。相关核心函数写在C++中
    2. AIVirtualIdolServer端接受到动作数据之后发送给AIVirtualIdol。
    3. RTMP的音频推流AI端需要部署RTMP推流器AIVirtualIdolServer部署RTMP ServerAIVirtualIdol接受Server数据后播放。

UE中的RTMP实现

参考RTMP

RTMP

Message & Chunk

RTMP中一个重要的概念就是消息。 600

600

800 网络中实际发送的内容

600

Chunk Format

Message被切割成一个或多个Chunk然后在网络上进行发送。
当发送时一个chunk发送完毕后才可以发送下一个chunk。

600

Message被拆分成一个或多个Chunk然后在网络上发送

拆分的时候,默认的Chunk Size是128字节以Message大小为300字节举例进行拆分。

300 = 128 + 128 + 44

600

作者FlyingPenguin
链接:https://www.jianshu.com/p/715f37b1202f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

开发计划

  1. C++实现RecivedDataManagerComponent管理音频、口型&动作数据、文字。
  2. Puerts实现数据接收逻辑。
  3. 实现声音播放逻辑。
  4. 实现口型&动作动画节点。
  5. 实现动画状态机结构初版。

声音

Runtime Import Sound

使用RuntimeAudioImporter插件,里面的解码使用了第三方库https://github.com/mackron/dr_libs。导入Sound使用了UImportedSoundWave::PopulateAudioDataFromDecodedInfo()

UE的做法

/*SoundStreaming->RawPCMDataSize = DataSize;
SoundStreaming->RawPCMData = AudioData;*/

表情

在状态机里生成完成之后通过BP_Player的接口ATF_TO_BS传递数据到动画蓝图NV2_Full_Skeleton_AnimBlueprint中。之通过动画蓝图的Pose读取曲线并且播放动画。