有限状态机#

状态机是3DAC系统的大脑,用于管理整个聊天生命周期,并确保所有系统状态的协调一致。它定义了一系列状态,并在整个系统运行过程中进行状态切换。状态机使用基于条件的事件队列来处理外部信号,如用户交互、网络事件等,包含两个阶段:

  • 系统启动:确保在进入聊天之前所有静态和运行时资源可用,包括环境模型、角色网格、本地动画(例如,道歉行为的音频/动作/面部)。它还会生成开场白作为虚拟形象的第一句话。

  • 交互对话:当用户进入聊天时触发,系统编排流生命周期管理,同步动画播放与运行时管道,并应用强大的错误处理和恢复功能,以提供无缝的聊天体验。

下图展示了状态机的整体工作流程:

状态机

状态#

INIT#

WAITING_FOR_FRONTEND_READY#

  • 等待Babylon场景准备就绪。

  • 转换到:

SPAWN_ENVIRONMENT#

  • 使用用户设置加载HDR环境和地面模型。

  • 转换到:

SPAWN_CHARACTER#

WAITING_FOR_ALGORITHM_READY_ON_START#

CHECK_AND_UPDATE_ASSETS#

  • 将角色本地动作/音频/面部同步到运行时组件(Runtime),并生成开场白。

  • 转换到:

WAITING_FOR_USER_START_GAME#

  • 等待用户开始聊天,并开始缓冲开场白的流式数据。

  • 转换到:

IDLE#

WAITING_FOR_USER_STOP_RECORDING#

WAITING_FOR_LOCAL_ANIMATION_INTERRUPTED#

WAITING_FOR_ACTOR_RESPOND_GENERATION_FINISHED#

ACTOR_ANIMATION_STREAMING#

WAITING_FOR_STREAMED_ANIMATION_INTERRUPTED#

  • 中断流式动画,返回聆听状态并重新开始音频录制。

  • 转换到:

WAITING_FOR_ACTOR_ANIMATION_FINISHED#

WAITING_FOR_ACTOR_LEAVING_FINISHED#

  • 等待离场动画完成。

  • 转换到:

    • EXIT:当收到ANIMATION_FINISHED信号时。

ALGORITHM_GENERATION_FAILED#

WAITING_FOR_ACTOR_APOLOGIZE_FINISHED#

  • 等待道歉动画完成。

  • 转换到:

    • IDLE:当收到ANIMATION_FINISHED信号时。

EXIT#

  • 终止状态机,并通知用户。

  • 转换到:

    • (终端状态)