mirror of
https://github.com/esphome/esphome.git
synced 2025-07-28 22:26:36 +00:00
Refactor voice assistant API methods to reduce code duplication (#9374)
This commit is contained in:
parent
440de12e3f
commit
206659ddb8
@ -1176,66 +1176,53 @@ void APIConnection::bluetooth_scanner_set_mode(const BluetoothScannerSetModeRequ
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_VOICE_ASSISTANT
|
#ifdef USE_VOICE_ASSISTANT
|
||||||
|
bool APIConnection::check_voice_assistant_api_connection_() const {
|
||||||
|
return voice_assistant::global_voice_assistant != nullptr &&
|
||||||
|
voice_assistant::global_voice_assistant->get_api_connection() == this;
|
||||||
|
}
|
||||||
|
|
||||||
void APIConnection::subscribe_voice_assistant(const SubscribeVoiceAssistantRequest &msg) {
|
void APIConnection::subscribe_voice_assistant(const SubscribeVoiceAssistantRequest &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (voice_assistant::global_voice_assistant != nullptr) {
|
||||||
voice_assistant::global_voice_assistant->client_subscription(this, msg.subscribe);
|
voice_assistant::global_voice_assistant->client_subscription(this, msg.subscribe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void APIConnection::on_voice_assistant_response(const VoiceAssistantResponse &msg) {
|
void APIConnection::on_voice_assistant_response(const VoiceAssistantResponse &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (!this->check_voice_assistant_api_connection_()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
return;
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (msg.error) {
|
if (msg.error) {
|
||||||
voice_assistant::global_voice_assistant->failed_to_start();
|
voice_assistant::global_voice_assistant->failed_to_start();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (msg.port == 0) {
|
if (msg.port == 0) {
|
||||||
// Use API Audio
|
// Use API Audio
|
||||||
voice_assistant::global_voice_assistant->start_streaming();
|
voice_assistant::global_voice_assistant->start_streaming();
|
||||||
} else {
|
} else {
|
||||||
struct sockaddr_storage storage;
|
struct sockaddr_storage storage;
|
||||||
socklen_t len = sizeof(storage);
|
socklen_t len = sizeof(storage);
|
||||||
this->helper_->getpeername((struct sockaddr *) &storage, &len);
|
this->helper_->getpeername((struct sockaddr *) &storage, &len);
|
||||||
voice_assistant::global_voice_assistant->start_streaming(&storage, msg.port);
|
voice_assistant::global_voice_assistant->start_streaming(&storage, msg.port);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
void APIConnection::on_voice_assistant_event_response(const VoiceAssistantEventResponse &msg) {
|
void APIConnection::on_voice_assistant_event_response(const VoiceAssistantEventResponse &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (this->check_voice_assistant_api_connection_()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice_assistant::global_voice_assistant->on_event(msg);
|
voice_assistant::global_voice_assistant->on_event(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void APIConnection::on_voice_assistant_audio(const VoiceAssistantAudio &msg) {
|
void APIConnection::on_voice_assistant_audio(const VoiceAssistantAudio &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (this->check_voice_assistant_api_connection_()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice_assistant::global_voice_assistant->on_audio(msg);
|
voice_assistant::global_voice_assistant->on_audio(msg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
void APIConnection::on_voice_assistant_timer_event_response(const VoiceAssistantTimerEventResponse &msg) {
|
void APIConnection::on_voice_assistant_timer_event_response(const VoiceAssistantTimerEventResponse &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (this->check_voice_assistant_api_connection_()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice_assistant::global_voice_assistant->on_timer_event(msg);
|
voice_assistant::global_voice_assistant->on_timer_event(msg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void APIConnection::on_voice_assistant_announce_request(const VoiceAssistantAnnounceRequest &msg) {
|
void APIConnection::on_voice_assistant_announce_request(const VoiceAssistantAnnounceRequest &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (this->check_voice_assistant_api_connection_()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice_assistant::global_voice_assistant->on_announce(msg);
|
voice_assistant::global_voice_assistant->on_announce(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1243,35 +1230,29 @@ void APIConnection::on_voice_assistant_announce_request(const VoiceAssistantAnno
|
|||||||
VoiceAssistantConfigurationResponse APIConnection::voice_assistant_get_configuration(
|
VoiceAssistantConfigurationResponse APIConnection::voice_assistant_get_configuration(
|
||||||
const VoiceAssistantConfigurationRequest &msg) {
|
const VoiceAssistantConfigurationRequest &msg) {
|
||||||
VoiceAssistantConfigurationResponse resp;
|
VoiceAssistantConfigurationResponse resp;
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (!this->check_voice_assistant_api_connection_()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
return resp;
|
||||||
return resp;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto &config = voice_assistant::global_voice_assistant->get_configuration();
|
|
||||||
for (auto &wake_word : config.available_wake_words) {
|
|
||||||
VoiceAssistantWakeWord resp_wake_word;
|
|
||||||
resp_wake_word.id = wake_word.id;
|
|
||||||
resp_wake_word.wake_word = wake_word.wake_word;
|
|
||||||
for (const auto &lang : wake_word.trained_languages) {
|
|
||||||
resp_wake_word.trained_languages.push_back(lang);
|
|
||||||
}
|
|
||||||
resp.available_wake_words.push_back(std::move(resp_wake_word));
|
|
||||||
}
|
|
||||||
for (auto &wake_word_id : config.active_wake_words) {
|
|
||||||
resp.active_wake_words.push_back(wake_word_id);
|
|
||||||
}
|
|
||||||
resp.max_active_wake_words = config.max_active_wake_words;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto &config = voice_assistant::global_voice_assistant->get_configuration();
|
||||||
|
for (auto &wake_word : config.available_wake_words) {
|
||||||
|
VoiceAssistantWakeWord resp_wake_word;
|
||||||
|
resp_wake_word.id = wake_word.id;
|
||||||
|
resp_wake_word.wake_word = wake_word.wake_word;
|
||||||
|
for (const auto &lang : wake_word.trained_languages) {
|
||||||
|
resp_wake_word.trained_languages.push_back(lang);
|
||||||
|
}
|
||||||
|
resp.available_wake_words.push_back(std::move(resp_wake_word));
|
||||||
|
}
|
||||||
|
for (auto &wake_word_id : config.active_wake_words) {
|
||||||
|
resp.active_wake_words.push_back(wake_word_id);
|
||||||
|
}
|
||||||
|
resp.max_active_wake_words = config.max_active_wake_words;
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void APIConnection::voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) {
|
void APIConnection::voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) {
|
||||||
if (voice_assistant::global_voice_assistant != nullptr) {
|
if (this->check_voice_assistant_api_connection_()) {
|
||||||
if (voice_assistant::global_voice_assistant->get_api_connection() != this) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
voice_assistant::global_voice_assistant->on_set_configuration(msg.active_wake_words);
|
voice_assistant::global_voice_assistant->on_set_configuration(msg.active_wake_words);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -301,6 +301,11 @@ class APIConnection : public APIServerConnection {
|
|||||||
static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint16_t message_type, APIConnection *conn,
|
static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint16_t message_type, APIConnection *conn,
|
||||||
uint32_t remaining_size, bool is_single);
|
uint32_t remaining_size, bool is_single);
|
||||||
|
|
||||||
|
#ifdef USE_VOICE_ASSISTANT
|
||||||
|
// Helper to check voice assistant validity and connection ownership
|
||||||
|
inline bool check_voice_assistant_api_connection_() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Helper method to process multiple entities from an iterator in a batch
|
// Helper method to process multiple entities from an iterator in a batch
|
||||||
template<typename Iterator> void process_iterator_batch_(Iterator &iterator) {
|
template<typename Iterator> void process_iterator_batch_(Iterator &iterator) {
|
||||||
size_t initial_size = this->deferred_batch_.size();
|
size_t initial_size = this->deferred_batch_.size();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user