From 6b2752a498fe39760eaf364873d7c2776548cc48 Mon Sep 17 00:00:00 2001 From: ooxxU <71391474@qq.com> Date: Mon, 17 Feb 2025 18:47:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=96=E6=8E=A5=E5=94=A4=E9=86=92=E6=A8=A1?= =?UTF-8?q?=E7=BB=84=E7=9A=84=E6=94=AF=E6=8C=81=EF=BC=8C=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E6=9C=89=E5=A4=9A=E7=A7=8D=E8=87=AA=E5=AE=9A=E4=B9=89=E5=94=A4?= =?UTF-8?q?=E9=86=92=E8=AF=8D=EF=BC=8C=E8=BF=9B=E8=A1=8C=E5=94=A4=E9=86=92?= =?UTF-8?q?=E5=B0=8F=E6=99=BA=EF=BC=8CESP32(=E9=9D=9EC3=EF=BC=8C=E9=9D=9ES?= =?UTF-8?q?3)=20=E9=9D=A2=E5=8C=85=E6=9D=BF=E4=B8=8A=E5=B7=B2=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20(#172)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 外接唤醒模组的支持,可以有多种自定义唤醒词,进行唤醒小智 ESP32(非C3,非S3) 面包板上已支持 * Update application.cc 外接唤醒模组的支持,好处是可以有多种自定义唤醒词,进行唤醒小智 唤醒模组需要一个GPIO Pin,设置成输出模式+高电平 对该Pin进行唤醒设置,1秒内的低电平脉冲,也就是小智的一个Click 可以参考 ESP32 面包板中的 asr_button_ 按钮的功能函数调用 本人测试采用ASR-ProV1.0版本的唤醒模组,测试内容包括:自定义唤醒词,唤醒词打断,唤醒词回应 此代码兼容其他型号的唤醒模组,并没做限制模组型号,方便大家使用 Modify By MarsBear * Update esp32_bread_board.cc --------- Co-authored-by: Xiaoxia --- main/application.cc | 19 ++++++++++++++++++- main/application.h | 1 + main/boards/bread-compact-esp32/config.h | 1 + .../bread-compact-esp32/esp32_bread_board.cc | 10 +++++++++- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/main/application.cc b/main/application.cc index 8ffd4efa..84568c11 100644 --- a/main/application.cc +++ b/main/application.cc @@ -699,4 +699,21 @@ void Application::UpdateIotStates() { void Application::Reboot() { ESP_LOGI(TAG, "Rebooting..."); esp_restart(); -} \ No newline at end of file +} + +void Application::WakeWordInvoke(const std::string& wake_word) { + if (device_state_ == kDeviceStateIdle) { + ToggleChatState(); + Schedule([this, wake_word]() { + if (protocol_) { + protocol_->SendWakeWordDetected(wake_word); + } + }); + } else if (device_state_ == kDeviceStateSpeaking) { + AbortSpeaking(kAbortReasonNone); + } else if (device_state_ == kDeviceStateListening) { + if (protocol_) { + protocol_->CloseAudioChannel(); + } + } +} diff --git a/main/application.h b/main/application.h index c7321c16..b66cdf3b 100644 --- a/main/application.h +++ b/main/application.h @@ -63,6 +63,7 @@ public: void StopListening(); void UpdateIotStates(); void Reboot(); + void WakeWordInvoke(const std::string& wake_word); private: Application(); diff --git a/main/boards/bread-compact-esp32/config.h b/main/boards/bread-compact-esp32/config.h index aef02003..0c477e3c 100644 --- a/main/boards/bread-compact-esp32/config.h +++ b/main/boards/bread-compact-esp32/config.h @@ -30,6 +30,7 @@ #define BOOT_BUTTON_GPIO GPIO_NUM_0 #define TOUCH_BUTTON_GPIO GPIO_NUM_5 +#define ASR_BUTTON_GPIO GPIO_NUM_19 #define BUILTIN_LED_GPIO GPIO_NUM_2 #define DISPLAY_SDA_PIN GPIO_NUM_4 diff --git a/main/boards/bread-compact-esp32/esp32_bread_board.cc b/main/boards/bread-compact-esp32/esp32_bread_board.cc index 34dc95f1..1096b267 100644 --- a/main/boards/bread-compact-esp32/esp32_bread_board.cc +++ b/main/boards/bread-compact-esp32/esp32_bread_board.cc @@ -21,6 +21,8 @@ class CompactWifiBoard : public WifiBoard { private: Button boot_button_; Button touch_button_; + Button asr_button_; + i2c_master_bus_handle_t display_i2c_bus_; void InitializeDisplayI2c() { @@ -59,6 +61,12 @@ private: gpio_set_level(BUILTIN_LED_GPIO, 1); app.ToggleChatState(); }); + + asr_button_.OnClick([this]() { + std::string wake_word="你好小智"; + Application::GetInstance().WakeWordInvoke(wake_word); + }); + touch_button_.OnPressDown([this]() { gpio_set_level(BUILTIN_LED_GPIO, 1); Application::GetInstance().StartListening(); @@ -77,7 +85,7 @@ private: } public: - CompactWifiBoard() : boot_button_(BOOT_BUTTON_GPIO), touch_button_(TOUCH_BUTTON_GPIO) + CompactWifiBoard() : boot_button_(BOOT_BUTTON_GPIO), touch_button_(TOUCH_BUTTON_GPIO), asr_button_(ASR_BUTTON_GPIO) { InitializeDisplayI2c(); InitializeButtons();