diff --git a/app/models.py b/app/models.py index c61a5eb..7e04932 100644 --- a/app/models.py +++ b/app/models.py @@ -53,6 +53,13 @@ class NotifyRequest(BaseModel): description="Enable/disable TTS playback (for debugging)", ), ] + urgent: Annotated[ + bool, + Field( + default=False, + description="Play at higher volume for critical messages", + ), + ] @field_validator("message", mode="before") @classmethod diff --git a/app/queue_manager.py b/app/queue_manager.py index 83e15e8..43b1b47 100644 --- a/app/queue_manager.py +++ b/app/queue_manager.py @@ -10,6 +10,8 @@ import time from dataclasses import dataclass, field from typing import Any +import numpy as np + logger = logging.getLogger(__name__) @@ -27,6 +29,7 @@ class TTSRequest: voice: str rate: int voice_enabled: bool + urgent: bool = False timestamp: float = field(default_factory=time.time) request_id: str | None = None @@ -180,6 +183,11 @@ class TTSQueueManager: self._stats.processed += 1 return + # Apply volume boost for urgent messages + if request.urgent: + audio_data = np.clip(audio_data * 1.5, -1.0, 1.0).astype(np.float32) + logger.debug("Applied urgent volume boost (1.5x)") + # Play audio self.audio_player.play(audio_data, self.tts_engine.get_sample_rate()) diff --git a/app/routes.py b/app/routes.py index 5791f22..ed618e9 100644 --- a/app/routes.py +++ b/app/routes.py @@ -67,6 +67,7 @@ async def notify(request: NotifyRequest) -> NotifyResponse: voice=voice, rate=request.rate, voice_enabled=request.voice_enabled and settings.voice_enabled, + urgent=request.urgent, ) # Enqueue request diff --git a/tests/test_models.py b/tests/test_models.py index 9c20cce..40f3ff2 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -33,6 +33,7 @@ class TestNotifyRequest: assert request.voice is None # None = use server default assert request.rate == 170 # default rate assert request.voice_enabled is True # default enabled + assert request.urgent is False # default not urgent def test_valid_request_with_all_fields(self): """ @@ -45,12 +46,14 @@ class TestNotifyRequest: voice="en_US-libritts-high", rate=200, voice_enabled=False, + urgent=True, ) assert request.message == "Test message" assert request.voice == "en_US-libritts-high" assert request.rate == 200 assert request.voice_enabled is False + assert request.urgent is True def test_message_is_required(self): """