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:
parent
5e50df4dac
commit
5f7dd68bf6
@ -53,6 +53,13 @@ class NotifyRequest(BaseModel):
|
|||||||
description="Enable/disable TTS playback (for debugging)",
|
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")
|
@field_validator("message", mode="before")
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@ -10,6 +10,8 @@ import time
|
|||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ -27,6 +29,7 @@ class TTSRequest:
|
|||||||
voice: str
|
voice: str
|
||||||
rate: int
|
rate: int
|
||||||
voice_enabled: bool
|
voice_enabled: bool
|
||||||
|
urgent: bool = False
|
||||||
timestamp: float = field(default_factory=time.time)
|
timestamp: float = field(default_factory=time.time)
|
||||||
request_id: str | None = None
|
request_id: str | None = None
|
||||||
|
|
||||||
@ -180,6 +183,11 @@ class TTSQueueManager:
|
|||||||
self._stats.processed += 1
|
self._stats.processed += 1
|
||||||
return
|
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
|
# Play audio
|
||||||
self.audio_player.play(audio_data, self.tts_engine.get_sample_rate())
|
self.audio_player.play(audio_data, self.tts_engine.get_sample_rate())
|
||||||
|
|
||||||
|
|||||||
@ -67,6 +67,7 @@ async def notify(request: NotifyRequest) -> NotifyResponse:
|
|||||||
voice=voice,
|
voice=voice,
|
||||||
rate=request.rate,
|
rate=request.rate,
|
||||||
voice_enabled=request.voice_enabled and settings.voice_enabled,
|
voice_enabled=request.voice_enabled and settings.voice_enabled,
|
||||||
|
urgent=request.urgent,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Enqueue request
|
# Enqueue request
|
||||||
|
|||||||
@ -33,6 +33,7 @@ class TestNotifyRequest:
|
|||||||
assert request.voice is None # None = use server default
|
assert request.voice is None # None = use server default
|
||||||
assert request.rate == 170 # default rate
|
assert request.rate == 170 # default rate
|
||||||
assert request.voice_enabled is True # default enabled
|
assert request.voice_enabled is True # default enabled
|
||||||
|
assert request.urgent is False # default not urgent
|
||||||
|
|
||||||
def test_valid_request_with_all_fields(self):
|
def test_valid_request_with_all_fields(self):
|
||||||
"""
|
"""
|
||||||
@ -45,12 +46,14 @@ class TestNotifyRequest:
|
|||||||
voice="en_US-libritts-high",
|
voice="en_US-libritts-high",
|
||||||
rate=200,
|
rate=200,
|
||||||
voice_enabled=False,
|
voice_enabled=False,
|
||||||
|
urgent=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
assert request.message == "Test message"
|
assert request.message == "Test message"
|
||||||
assert request.voice == "en_US-libritts-high"
|
assert request.voice == "en_US-libritts-high"
|
||||||
assert request.rate == 200
|
assert request.rate == 200
|
||||||
assert request.voice_enabled is False
|
assert request.voice_enabled is False
|
||||||
|
assert request.urgent is True
|
||||||
|
|
||||||
def test_message_is_required(self):
|
def test_message_is_required(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user