Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions aioesphomeapi/api.proto
Original file line number Diff line number Diff line change
Expand Up @@ -1469,6 +1469,7 @@ message VoiceAssistantRequest {
string conversation_id = 2;
uint32 flags = 3;
VoiceAssistantAudioSettings audio_settings = 4;
string wake_word_phrase = 5;
}

message VoiceAssistantResponse {
Expand Down
144 changes: 72 additions & 72 deletions aioesphomeapi/api_pb2.py

Large diffs are not rendered by default.

10 changes: 8 additions & 2 deletions aioesphomeapi/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1212,7 +1212,7 @@ def api_version(self) -> APIVersion | None:
def subscribe_voice_assistant(
self,
handle_start: Callable[
[str, int, VoiceAssistantAudioSettingsModel],
[str, int, VoiceAssistantAudioSettingsModel, str | None],
Coroutine[Any, Any, int | None],
],
handle_stop: Callable[[], Coroutine[Any, Any, None]],
Expand Down Expand Up @@ -1244,9 +1244,15 @@ def _on_voice_assistant_request(msg: VoiceAssistantRequest) -> None:

command = VoiceAssistantCommand.from_pb(msg)
if command.start:
wake_word_phrase: str | None = command.wake_word_phrase
if wake_word_phrase == "":
wake_word_phrase = None
start_task = asyncio.create_task(
handle_start(
command.conversation_id, command.flags, command.audio_settings
command.conversation_id,
command.flags,
command.audio_settings,
wake_word_phrase,
)
)
start_task.add_done_callback(_started)
Expand Down
1 change: 1 addition & 0 deletions aioesphomeapi/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -1115,6 +1115,7 @@ class VoiceAssistantCommand(APIModelBase):
default=VoiceAssistantAudioSettings(),
converter=VoiceAssistantAudioSettings.from_pb,
)
wake_word_phrase: str = ""


class LogLevel(APIIntEnum):
Expand Down
25 changes: 19 additions & 6 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -2047,9 +2047,12 @@ async def test_subscribe_voice_assistant(
stops = []

async def handle_start(
conversation_id: str, flags: int, audio_settings: VoiceAssistantAudioSettings
conversation_id: str,
flags: int,
audio_settings: VoiceAssistantAudioSettings,
wake_word_phrase: str | None,
) -> int | None:
starts.append((conversation_id, flags, audio_settings))
starts.append((conversation_id, flags, audio_settings, wake_word_phrase))
return 42

async def handle_stop() -> None:
Expand All @@ -2068,6 +2071,7 @@ async def handle_stop() -> None:
start=True,
flags=42,
audio_settings=audio_settings,
wake_word_phrase="okay nabu",
)
mock_data_received(protocol, generate_plaintext_packet(response))
await asyncio.sleep(0)
Expand All @@ -2081,6 +2085,7 @@ async def handle_stop() -> None:
auto_gain=42,
volume_multiplier=42,
),
"okay nabu",
)
]
assert stops == []
Expand Down Expand Up @@ -2117,9 +2122,12 @@ async def test_subscribe_voice_assistant_failure(
stops = []

async def handle_start(
conversation_id: str, flags: int, audio_settings: VoiceAssistantAudioSettings
conversation_id: str,
flags: int,
audio_settings: VoiceAssistantAudioSettings,
wake_word_phrase: str | None,
) -> int | None:
starts.append((conversation_id, flags, audio_settings))
starts.append((conversation_id, flags, audio_settings, wake_word_phrase))
# Return None to indicate failure
return None

Expand Down Expand Up @@ -2152,6 +2160,7 @@ async def handle_stop() -> None:
auto_gain=42,
volume_multiplier=42,
),
None,
)
]
assert stops == []
Expand Down Expand Up @@ -2188,9 +2197,12 @@ async def test_subscribe_voice_assistant_cancels_long_running_handle_start(
stops = []

async def handle_start(
conversation_id: str, flags: int, audio_settings: VoiceAssistantAudioSettings
conversation_id: str,
flags: int,
audio_settings: VoiceAssistantAudioSettings,
wake_word_phrase: str | None,
) -> int | None:
starts.append((conversation_id, flags, audio_settings))
starts.append((conversation_id, flags, audio_settings, wake_word_phrase))
await asyncio.sleep(10)
# Return None to indicate failure
starts.append("never")
Expand Down Expand Up @@ -2228,6 +2240,7 @@ async def handle_stop() -> None:
auto_gain=42,
volume_multiplier=42,
),
None,
)
]

Expand Down