有限状态机#
状态机是3DAC系统的大脑,用于管理整个聊天生命周期,并确保所有系统状态的协调一致。它定义了一系列状态,并在整个系统运行过程中进行状态切换。状态机使用基于条件的事件队列来处理外部信号,如用户交互、网络事件等,包含两个阶段:
系统启动:确保在进入聊天之前所有静态和运行时资源可用,包括环境模型、角色网格、本地动画(例如,道歉行为的音频/动作/面部)。它还会生成开场白作为虚拟形象的第一句话。
交互对话:当用户进入聊天时触发,系统编排流生命周期管理,同步动画播放与运行时管道,并应用强大的错误处理和恢复功能,以提供无缝的聊天体验。
下图展示了状态机的整体工作流程:
状态机
状态#
INIT#
初始化 FSM 系统。
转换到:
WAITING_FOR_FRONTEND_READY:当初始化完成时。
WAITING_FOR_FRONTEND_READY#
等待Babylon场景准备就绪。
转换到:
SPAWN_ENVIRONMENT:当收到FRONTEND_READY条件时。EXIT:当场景启动超时时。
SPAWN_ENVIRONMENT#
使用用户设置加载HDR环境和地面模型。
转换到:
SPAWN_CHARACTER:当场景设置成功后。EXIT:当环境设置失败时。
SPAWN_CHARACTER#
加载角色配置和资源。
转换到:
WAITING_FOR_ALGORITHM_READY_ON_START:当角色成功添加到场景时。EXIT:当配置获取或模型加载失败时。
WAITING_FOR_ALGORITHM_READY_ON_START#
对算法服务进行健康检查并验证流缓冲区。
转换到:
CHECK_AND_UPDATE_ASSETS:当健康检查和网络流检查通过时。ALGORITHM_GENERATION_FAILED:当健康检查或网络流检查失败时。
CHECK_AND_UPDATE_ASSETS#
将角色本地动作/音频/面部同步到运行时组件(Runtime),并生成开场白。
转换到:
WAITING_FOR_USER_START_GAME:当同步和生成完成时。EXIT:当发生任何错误时。
WAITING_FOR_USER_START_GAME#
等待用户开始聊天,并开始缓冲开场白的流式数据。
转换到:
ACTOR_ANIMATION_STREAMING:当收到USER_START_GAME条件,且开场白仍在流式传输时。WAITING_FOR_ACTOR_ANIMATION_FINISHED:当收到USER_START_GAME条件,且开场白已完全接收时。EXIT:当麦克风检查失败,或开场白数据缺失时。
IDLE#
待机时监听用户输入。
转换到:
WAITING_FOR_USER_STOP_RECORDING:当收到USER_START_RECORDING条件时。
WAITING_FOR_USER_STOP_RECORDING#
用户正在上传音频。
转换到:
WAITING_FOR_LOCAL_ANIMATION_INTERRUPTED:当收到USER_STOP_RECORDING条件时。
WAITING_FOR_LOCAL_ANIMATION_INTERRUPTED#
等待本地动画中断。
转换到:
WAITING_FOR_ACTOR_RESPOND_GENERATION_FINISHED:当收到ANIMATION_FINISHED信号时。
WAITING_FOR_ACTOR_RESPOND_GENERATION_FINISHED#
等待算法响应生成。
转换到:
WAITING_FOR_USER_STOP_RECORDING:当收到USER_START_RECORDING信号时。ACTOR_ANIMATION_STREAMING:当动画开始流式传输时。WAITING_FOR_ACTOR_LEAVING_FINISHED:当算法服务的响应类型为leave时。ALGORITHM_GENERATION_FAILED:当算法服务未能返回有效流数据时。WAITING_FOR_STREAMED_ANIMATION_INTERRUPTED:当收到USER_INTERRUPT_ANIMATION信号时。
ACTOR_ANIMATION_STREAMING#
接收流式数据,并发送到流式动画管线。如果流式动画缓冲区耗尽,则处理断流/恢复事件。
转换到:
WAITING_FOR_ACTOR_ANIMATION_FINISHED:当流结束,或收到播放完成信号时。WAITING_FOR_STREAMED_ANIMATION_INTERRUPTED:当收到USER_INTERRUPT_ANIMATION信号时。ALGORITHM_GENERATION_FAILED:当流不可用,或发生未知错误时。
WAITING_FOR_STREAMED_ANIMATION_INTERRUPTED#
中断流式动画,返回聆听状态并重新开始音频录制。
转换到:
WAITING_FOR_USER_STOP_RECORDING:当打断行为发送到流式动画管线,且音频录制开始时。
WAITING_FOR_ACTOR_ANIMATION_FINISHED#
等待角色动画完成,并检查关系和情感状态更新。
转换到:
IDLE:当收到ANIMATION_FINISHED信号时。WAITING_FOR_STREAMED_ANIMATION_INTERRUPTED:当收到USER_INTERRUPT_ANIMATION信号时。
WAITING_FOR_ACTOR_LEAVING_FINISHED#
等待离场动画完成。
转换到:
EXIT:当收到ANIMATION_FINISHED信号时。
ALGORITHM_GENERATION_FAILED#
切换到本地错误/道歉动画。
转换到:
WAITING_FOR_ACTOR_APOLOGIZE_FINISHED:当切换动画信号发送到流式动画管线时。
WAITING_FOR_ACTOR_APOLOGIZE_FINISHED#
等待道歉动画完成。
转换到:
IDLE:当收到ANIMATION_FINISHED信号时。
EXIT#
终止状态机,并通知用户。
转换到:
(终端状态)