diff --git a/.env.example b/.env.example index ee4614f..0211637 100644 --- a/.env.example +++ b/.env.example @@ -101,6 +101,9 @@ LVA_PULSE_COOKIE="/run/user/${LVA_USER_ID}/pulse/cookie" ### Delay before mic opens for continued conversation (optional): # CONTINUE_CONVERSATION_DELAY="0.5" +### Unducking delay (optional) +# UNDUCK_DELAY="1.2" + ### Sound files (optional): # path for custom files in docker is for example "sounds/custom/your_soundfile.flac" # WAKEUP_SOUND="sounds/wake_word_triggered.flac" diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 1863692..cdb0cec 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -92,6 +92,10 @@ if [ -n "${CONTINUE_CONVERSATION_DELAY}" ]; then EXTRA_ARGS+=( "--continue-conversation-delay" "$CONTINUE_CONVERSATION_DELAY" ) fi +if [ -n "${UNDUCK_DELAY}" ]; then + EXTRA_ARGS+=( "--unduck-delay" "$UNDUCK_DELAY" ) +fi + if [ -n "${WAKEUP_SOUND}" ]; then EXTRA_ARGS+=( "--wakeup-sound" "$WAKEUP_SOUND" ) fi diff --git a/linux_voice_assistant/__main__.py b/linux_voice_assistant/__main__.py index 38526d4..6dba0e1 100644 --- a/linux_voice_assistant/__main__.py +++ b/linux_voice_assistant/__main__.py @@ -118,6 +118,12 @@ async def main() -> None: default=0.5, help="Seconds to wait after TTS finishes before opening the mic for continued conversation (default: 0.5)", ) + parser.add_argument( + "--unduck-delay", + type=float, + default=0.0, + help="Seconds to keep music ducked after TTS finishes (default: 0.0)", + ) parser.add_argument( "--wakeup-sound", default=str(_SOUNDS_DIR / "wake_word_triggered.flac"), @@ -438,6 +444,7 @@ async def main() -> None: preferences_path=preferences_path, refractory_seconds=args.refractory_seconds, continue_conversation_delay=args.continue_conversation_delay, + unduck_delay=args.unduck_delay, output_only=args.output_only, download_dir=args.download_dir, volume=initial_volume, diff --git a/linux_voice_assistant/models.py b/linux_voice_assistant/models.py index c1012b1..30b040f 100644 --- a/linux_voice_assistant/models.py +++ b/linux_voice_assistant/models.py @@ -124,6 +124,7 @@ class ServerState: preferences_path: Path download_dir: Path continue_conversation_delay: float = 0.5 # seconds to wait after TTS before opening mic + unduck_delay: float = 0.0 # seconds to keep music ducked after TTS ends media_player_entity: "Optional[MediaPlayerEntity]" = None satellite: "Optional[VoiceSatelliteProtocol]" = None diff --git a/linux_voice_assistant/satellite.py b/linux_voice_assistant/satellite.py index ffffe5e..100bcb3 100644 --- a/linux_voice_assistant/satellite.py +++ b/linux_voice_assistant/satellite.py @@ -957,7 +957,12 @@ class VoiceSatelliteProtocol(APIServer): threading.Timer(self.state.continue_conversation_delay, _start_continued_conversation).start() else: self._continue_conversation = False - self.unduck() + unduck_delay = self.state.unduck_delay + if unduck_delay > 0: + _LOGGER.debug("Unducking after %.2fs", unduck_delay) + threading.Timer(unduck_delay, self.unduck).start() + else: + self.unduck() self._emit(LVAEvent.IDLE) _LOGGER.debug("TTS response finished")