94 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# 各个服务负责人
							 | 
						|||
| 
								 | 
							
								- 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 Server;AIVirtualIdol接受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中一个重要的概念就是消息。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								**网络中实际发送的内容**。  
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Chunk Format
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  
							 | 
						|||
| 
								 | 
							
								Message被切割成一个或多个Chunk,然后在网络上进行发送。  
							 | 
						|||
| 
								 | 
							
								当发送时,一个chunk发送完毕后才可以发送下一个chunk。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Message被拆分成一个或多个Chunk,然后在网络上发送
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								拆分的时候,**默认的Chunk Size是128字节**,以Message大小为300字节举例,进行拆分。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```undefined
							 | 
						|||
| 
								 | 
							
								300 = 128 + 128 + 44
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  
							 | 
						|||
| 
								 | 
							
								  
							 | 
						|||
| 
								 | 
							
								作者: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读取曲线并且播放动画。
							 |