fciannella's picture
Working with service run on 7860
53ea588
raw
history blame
2.19 kB
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: BSD 2-Clause License
"""Manages the ACE avatar's posture states during conversations."""
from pipecat.frames.frames import BotStoppedSpeakingFrame, Frame, StartInterruptionFrame, TTSStartedFrame
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
from nvidia_pipecat.frames.action import StartPostureBotActionFrame
class PostureProviderProcessor(FrameProcessor):
"""Controls the ACE avatar's posture based on conversation state transitions.
This processor automatically manages the avatar's posture by transitioning between
three states: Listening, Talking, and Attentive. The transitions are triggered by
specific conversation events represented by input frames.
Input Frames:
TTSStartedFrame: Triggers transition to "Talking" posture
StartInterruptionFrame: Triggers transition to "Listening" posture
BotStoppedSpeakingFrame: Triggers transition to "Attentive" posture
Output Frames:
StartPostureBotActionFrame: Contains the target posture state
"""
def __init__(self):
"""Initialize the PostureProviderProcessor.
The processor starts with no initial state and will transition based on
the first received frame.
"""
super().__init__()
async def process_frame(self, frame: Frame, direction: FrameDirection):
"""Process an incoming frame and update the avatar's posture if needed.
Args:
frame: The incoming frame to process.
direction: The direction of frame flow in the pipeline.
"""
await super().process_frame(frame, direction)
await self.push_frame(frame, direction)
if isinstance(frame, TTSStartedFrame):
await self.push_frame(StartPostureBotActionFrame("Talking"))
if isinstance(frame, StartInterruptionFrame):
await self.push_frame(StartPostureBotActionFrame("Listening"))
if isinstance(frame, BotStoppedSpeakingFrame):
await self.push_frame(StartPostureBotActionFrame("Attentive"))