Add urgent flag for higher volume playback

Added optional 'urgent' boolean field to POST /notify requests.
When urgent=true, audio is played at 1.5x volume with clipping
protection for critical messages.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Cal Corum 2025-12-19 09:10:26 -06:00
parent 5e50df4dac
commit 5f7dd68bf6
4 changed files with 19 additions and 0 deletions

View File

@ -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

View File

@ -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())

View File

@ -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

View File

@ -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):
"""