37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
import asyncio
|
|
from enum import Enum
|
|
|
|
|
|
class SessionState(str, Enum):
|
|
IDLE = "idle"
|
|
USER_SPEAKING = "user_speaking"
|
|
THINKING = "thinking"
|
|
AVATAR_SPEAKING = "avatar_speaking"
|
|
|
|
|
|
class Arbitrator:
|
|
def __init__(self) -> None:
|
|
self.state = SessionState.IDLE
|
|
self._lock = asyncio.Lock()
|
|
self.cancel_avatar_event = asyncio.Event()
|
|
|
|
async def on_speech_start(self) -> None:
|
|
async with self._lock:
|
|
if self.state == SessionState.AVATAR_SPEAKING:
|
|
self.cancel_avatar_event.set()
|
|
self.state = SessionState.USER_SPEAKING
|
|
|
|
async def on_speech_end(self) -> None:
|
|
async with self._lock:
|
|
self.cancel_avatar_event.clear()
|
|
self.state = SessionState.THINKING
|
|
|
|
async def on_avatar_start(self) -> None:
|
|
async with self._lock:
|
|
self.state = SessionState.AVATAR_SPEAKING
|
|
|
|
async def on_avatar_done(self) -> None:
|
|
async with self._lock:
|
|
if self.state == SessionState.AVATAR_SPEAKING:
|
|
self.state = SessionState.IDLE
|