Enhance audio feedback mechanism by introducing a flag to play a popup (#1560)

* Enhance audio feedback mechanism by introducing a flag to play a popup sound after transitioning to listening mode. Update Schedule method to accept rvalue references for callbacks. Bump esp-ml307 component version to 3.5.3. Adjust signal strength thresholds in Ml307Board for better accuracy.

* Update esp-wifi-connect component version to 3.0.2 in idf_component.yml

* Adjust Wi-Fi signal strength thresholds in WifiBoard for improved accuracy in network state icon representation.
This commit is contained in:
Xiaoxia
2025-12-15 12:54:17 +08:00
committed by GitHub
parent 0ccdc082b5
commit 564018c762
5 changed files with 23 additions and 14 deletions

View File

@@ -780,9 +780,10 @@ void Application::HandleWakeWordDetectedEvent() {
protocol_->SendWakeWordDetected(wake_word); protocol_->SendWakeWordDetected(wake_word);
SetListeningMode(aec_mode_ == kAecOff ? kListeningModeAutoStop : kListeningModeRealtime); SetListeningMode(aec_mode_ == kAecOff ? kListeningModeAutoStop : kListeningModeRealtime);
#else #else
// Set flag to play popup sound after state changes to listening
// (PlaySound here would be cleared by ResetDecoder in EnableVoiceProcessing)
play_popup_on_listening_ = true;
SetListeningMode(aec_mode_ == kAecOff ? kListeningModeAutoStop : kListeningModeRealtime); SetListeningMode(aec_mode_ == kAecOff ? kListeningModeAutoStop : kListeningModeRealtime);
// Play the pop up sound to indicate the wake word is detected
audio_service_.PlaySound(Lang::Sounds::OGG_POPUP);
#endif #endif
} else if (state == kDeviceStateSpeaking) { } else if (state == kDeviceStateSpeaking) {
AbortSpeaking(kAbortReasonWakeWordDetected); AbortSpeaking(kAbortReasonWakeWordDetected);
@@ -825,6 +826,12 @@ void Application::HandleStateChangedEvent() {
audio_service_.EnableVoiceProcessing(true); audio_service_.EnableVoiceProcessing(true);
audio_service_.EnableWakeWordDetection(false); audio_service_.EnableWakeWordDetection(false);
} }
// Play popup sound after ResetDecoder (in EnableVoiceProcessing) has been called
if (play_popup_on_listening_) {
play_popup_on_listening_ = false;
audio_service_.PlaySound(Lang::Sounds::OGG_POPUP);
}
break; break;
case kDeviceStateSpeaking: case kDeviceStateSpeaking:
display->SetStatus(Lang::Strings::SPEAKING); display->SetStatus(Lang::Strings::SPEAKING);
@@ -846,7 +853,7 @@ void Application::HandleStateChangedEvent() {
} }
} }
void Application::Schedule(std::function<void()> callback) { void Application::Schedule(std::function<void()>&& callback) {
{ {
std::lock_guard<std::mutex> lock(mutex_); std::lock_guard<std::mutex> lock(mutex_);
main_tasks_.push_back(std::move(callback)); main_tasks_.push_back(std::move(callback));
@@ -960,9 +967,10 @@ void Application::WakeWordInvoke(const std::string& wake_word) {
protocol_->SendWakeWordDetected(wake_word); protocol_->SendWakeWordDetected(wake_word);
SetListeningMode(aec_mode_ == kAecOff ? kListeningModeAutoStop : kListeningModeRealtime); SetListeningMode(aec_mode_ == kAecOff ? kListeningModeAutoStop : kListeningModeRealtime);
#else #else
// Set flag to play popup sound after state changes to listening
// (PlaySound here would be cleared by ResetDecoder in EnableVoiceProcessing)
play_popup_on_listening_ = true;
SetListeningMode(aec_mode_ == kAecOff ? kListeningModeAutoStop : kListeningModeRealtime); SetListeningMode(aec_mode_ == kAecOff ? kListeningModeAutoStop : kListeningModeRealtime);
// Play the pop up sound to indicate the wake word is detected
audio_service_.PlaySound(Lang::Sounds::OGG_POPUP);
#endif #endif
} else if (state == kDeviceStateSpeaking) { } else if (state == kDeviceStateSpeaking) {
Schedule([this]() { Schedule([this]() {

View File

@@ -75,7 +75,7 @@ public:
/** /**
* Schedule a callback to be executed in the main task * Schedule a callback to be executed in the main task
*/ */
void Schedule(std::function<void()> callback); void Schedule(std::function<void()>&& callback);
/** /**
* Alert with status, message, emotion and optional sound * Alert with status, message, emotion and optional sound
@@ -139,6 +139,7 @@ private:
bool has_server_time_ = false; bool has_server_time_ = false;
bool aborted_ = false; bool aborted_ = false;
bool assets_version_checked_ = false; bool assets_version_checked_ = false;
bool play_popup_on_listening_ = false; // Flag to play popup sound after state changes to listening
int clock_ticks_ = 0; int clock_ticks_ = 0;
TaskHandle_t activation_task_handle_ = nullptr; TaskHandle_t activation_task_handle_ = nullptr;

View File

@@ -155,13 +155,13 @@ const char* Ml307Board::GetNetworkStateIcon() {
int csq = modem_->GetCsq(); int csq = modem_->GetCsq();
if (csq == -1) { if (csq == -1) {
return FONT_AWESOME_SIGNAL_OFF; return FONT_AWESOME_SIGNAL_OFF;
} else if (csq >= 0 && csq <= 14) { } else if (csq >= 0 && csq <= 9) {
return FONT_AWESOME_SIGNAL_WEAK; return FONT_AWESOME_SIGNAL_WEAK;
} else if (csq >= 15 && csq <= 19) { } else if (csq >= 10 && csq <= 14) {
return FONT_AWESOME_SIGNAL_FAIR; return FONT_AWESOME_SIGNAL_FAIR;
} else if (csq >= 20 && csq <= 24) { } else if (csq >= 15 && csq <= 19) {
return FONT_AWESOME_SIGNAL_GOOD; return FONT_AWESOME_SIGNAL_GOOD;
} else if (csq >= 25 && csq <= 31) { } else if (csq >= 20 && csq <= 31) {
return FONT_AWESOME_SIGNAL_STRONG; return FONT_AWESOME_SIGNAL_STRONG;
} }

View File

@@ -259,9 +259,9 @@ const char* WifiBoard::GetNetworkStateIcon() {
} }
int rssi = wifi.GetRssi(); int rssi = wifi.GetRssi();
if (rssi >= -60) { if (rssi >= -65) {
return FONT_AWESOME_WIFI; return FONT_AWESOME_WIFI;
} else if (rssi >= -70) { } else if (rssi >= -75) {
return FONT_AWESOME_WIFI_FAIR; return FONT_AWESOME_WIFI_FAIR;
} }
return FONT_AWESOME_WIFI_WEAK; return FONT_AWESOME_WIFI_WEAK;

View File

@@ -18,9 +18,9 @@ dependencies:
espressif/esp_io_expander_tca9554: ==2.0.0 espressif/esp_io_expander_tca9554: ==2.0.0
espressif/esp_lcd_panel_io_additions: ^1.0.1 espressif/esp_lcd_panel_io_additions: ^1.0.1
78/esp_lcd_nv3023: ~1.0.0 78/esp_lcd_nv3023: ~1.0.0
78/esp-wifi-connect: ~3.0.1 78/esp-wifi-connect: ~3.0.2
78/esp-opus-encoder: ~2.4.1 78/esp-opus-encoder: ~2.4.1
78/esp-ml307: ~3.5.2 78/esp-ml307: ~3.5.3
78/xiaozhi-fonts: ~1.5.5 78/xiaozhi-fonts: ~1.5.5
espressif/led_strip: ~3.0.1 espressif/led_strip: ~3.0.1
espressif/esp_codec_dev: ~1.5 espressif/esp_codec_dev: ~1.5