Clean up tts played

This commit is contained in:
Michael Hansen
2024-06-26 13:30:40 -05:00
parent 5d3c243a88
commit 2e046c6b8b
+14 -7
View File
@@ -5,6 +5,7 @@ import logging
import math import math
import time import time
import wave import wave
from dataclasses import dataclass
from enum import Enum, auto from enum import Enum, auto
from pathlib import Path from pathlib import Path
from typing import Callable, Dict, Final, List, Optional, Set, Union from typing import Callable, Dict, Final, List, Optional, Set, Union
@@ -60,6 +61,12 @@ class State(Enum):
STOPPED = auto() STOPPED = auto()
@dataclass
class SoundEvent:
event: Event
is_tts: bool
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@@ -76,7 +83,7 @@ class SatelliteBase:
self._mic_task: Optional[asyncio.Task] = None self._mic_task: Optional[asyncio.Task] = None
self._mic_webrtc: Optional[Callable[[bytes], bytes]] = None self._mic_webrtc: Optional[Callable[[bytes], bytes]] = None
self._snd_task: Optional[asyncio.Task] = None self._snd_task: Optional[asyncio.Task] = None
self._snd_queue: "Optional[asyncio.Queue[Event]]" = None self._snd_queue: "Optional[asyncio.Queue[SoundEvent]]" = None
self._wake_task: Optional[asyncio.Task] = None self._wake_task: Optional[asyncio.Task] = None
self._wake_queue: "Optional[asyncio.Queue[Event]]" = None self._wake_queue: "Optional[asyncio.Queue[Event]]" = None
self._event_task: Optional[asyncio.Task] = None self._event_task: Optional[asyncio.Task] = None
@@ -543,10 +550,10 @@ class SatelliteBase:
# Sound # Sound
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
async def event_to_snd(self, event: Event) -> None: async def event_to_snd(self, event: Event, is_tts: bool = True) -> None:
"""Send an event to the sound service.""" """Send an event to the sound service."""
if self._snd_queue is not None: if self._snd_queue is not None:
self._snd_queue.put_nowait(event) self._snd_queue.put_nowait(SoundEvent(event, is_tts))
def _make_snd_client(self) -> Optional[AsyncClient]: def _make_snd_client(self) -> Optional[AsyncClient]:
"""Create client for snd service.""" """Create client for snd service."""
@@ -581,7 +588,8 @@ class SatelliteBase:
if self._snd_queue is None: if self._snd_queue is None:
self._snd_queue = asyncio.Queue() self._snd_queue = asyncio.Queue()
event = await self._snd_queue.get() snd_event = await self._snd_queue.get()
event = snd_event.event
if snd_client is None: if snd_client is None:
snd_client = self._make_snd_client() snd_client = self._make_snd_client()
@@ -608,7 +616,7 @@ class SatelliteBase:
event.type event.type
): ):
await _disconnect() await _disconnect()
if not hasattr(event, 'wav'): if snd_event.is_tts:
await self.trigger_played() await self.trigger_played()
snd_client = None # reconnect on next event snd_client = None # reconnect on next event
except asyncio.CancelledError: except asyncio.CancelledError:
@@ -655,8 +663,7 @@ class SatelliteBase:
samples_per_chunk=self.settings.snd.samples_per_chunk, samples_per_chunk=self.settings.snd.samples_per_chunk,
volume_multiplier=self.settings.snd.volume_multiplier, volume_multiplier=self.settings.snd.volume_multiplier,
): ):
event.wav = True await self.event_to_snd(event, is_tts=False)
await self.event_to_snd(event)
except Exception: except Exception:
# Unmute in case of an error # Unmute in case of an error
self.microphone_muted = False self.microphone_muted = False