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

94 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 各个服务负责人
- 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协议 01 入门:https://www.jianshu.com/p/715f37b1202f
- RTMP协议 02 视频Chunk和音频Chunk到底长啥样?:https://www.jianshu.com/p/cc813ba41caa
- RTMP协议 03 RTMP设计思想:https://www.jianshu.com/p/9459606c2025
- RTMP协议 04 RTMP播放基本流程:https://www.jianshu.com/p/4577a61af0c7
- RTMP协议 05 时间戳:https://www.jianshu.com/p/119075482a54
## RTMP
### Message & Chunk
RTMP中一个重要的概念就是消息。
![600](https://upload-images.jianshu.io/upload_images/1720840-a4e1d3c0d08d671e.png?imageMogr2/auto-orient/strip|imageView2/2/w/870/format/webp)
![600](https://upload-images.jianshu.io/upload_images/1720840-f291fa10767d860b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
![800](https://upload-images.jianshu.io/upload_images/1720840-76439153b7b7aec6.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
**网络中实际发送的内容**
![600](https://upload-images.jianshu.io/upload_images/1720840-9dcadc0699c290c0.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
Chunk Format
Message被切割成一个或多个Chunk然后在网络上进行发送。
当发送时一个chunk发送完毕后才可以发送下一个chunk。
![600](https://upload-images.jianshu.io/upload_images/1720840-a476d0c147ffa144.png?imageMogr2/auto-orient/strip|imageView2/2/w/897/format/webp)
Message被拆分成一个或多个Chunk然后在网络上发送
拆分的时候,**默认的Chunk Size是128字节**以Message大小为300字节举例进行拆分。
```undefined
300 = 128 + 128 + 44
```
![600](https://upload-images.jianshu.io/upload_images/1720840-5f7e632acaf568ab.png?imageMogr2/auto-orient/strip|imageView2/2/w/955/format/webp)
作者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的做法
```cpp
/*SoundStreaming->RawPCMDataSize = DataSize;
SoundStreaming->RawPCMData = AudioData;*/
```
# 表情
在状态机里生成完成之后通过BP_Player的接口ATF_TO_BS传递数据到动画蓝图`NV2_Full_Skeleton_AnimBlueprint`中。之通过动画蓝图的Pose读取曲线并且播放动画。