Clean up tts played
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user