diff --git a/CMakeLists.txt b/CMakeLists.txt index bea57b68..ea8ffd0f 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.16) -set(PROJECT_VER "1.1.1") +set(PROJECT_VER "1.1.2") # Add this line to disable the specific warning add_compile_options(-Wno-missing-field-initializers) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index d0a4a14a..ea1651ee 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -91,7 +91,7 @@ endif() file(GLOB BOARD_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.cc) list(APPEND SOURCES ${BOARD_SOURCES}) -if(CONFIG_IDF_TARGET_ESP32S3) +if(CONFIG_USE_AUDIO_PROCESSING) list(APPEND SOURCES "audio_processing/audio_processor.cc" "audio_processing/wake_word_detect.cc") endif() diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index bb05789a..96e2a835 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -118,6 +118,12 @@ choice DISPLAY_LCD_TYPE bool "ILI9341, 分辨率240*320, 非IPS" config LCD_CUSTOM bool "自定义屏幕参数" -endchoice +endchoice +config USE_AUDIO_PROCESSING + bool "启用语音唤醒与音频处理" + default y + depends on IDF_TARGET_ESP32S3 && USE_AFE + help + 需要 ESP32 S3 与 AFE 支持 endmenu diff --git a/main/application.cc b/main/application.cc index 26575a16..dfd8bdcf 100644 --- a/main/application.cc +++ b/main/application.cc @@ -77,7 +77,7 @@ void Application::CheckNewVersion() { display->SetStatus("新版本 " + ota_.GetFirmwareVersion()); board.SetPowerSaveMode(false); -#if CONFIG_IDF_TARGET_ESP32S3 +#if CONFIG_USE_AUDIO_PROCESSING wake_word_detect_.StopDetection(); #endif // 预先关闭音频输出,避免升级过程有音频操作 @@ -365,7 +365,7 @@ void Application::Start() { }, "check_new_version", 4096 * 2, this, 1, nullptr); -#if CONFIG_IDF_TARGET_ESP32S3 +#if CONFIG_USE_AUDIO_PROCESSING audio_processor_.Initialize(codec->input_channels(), codec->input_reference()); audio_processor_.OnOutput([this](std::vector&& data) { background_task_->Schedule([this, data = std::move(data)]() mutable { @@ -551,7 +551,7 @@ void Application::InputAudio() { } } -#if CONFIG_IDF_TARGET_ESP32S3 +#if CONFIG_USE_AUDIO_PROCESSING if (audio_processor_.IsRunning()) { audio_processor_.Input(data); } @@ -595,7 +595,7 @@ void Application::SetDeviceState(DeviceState state) { case kDeviceStateIdle: display->SetStatus("待命"); display->SetEmotion("neutral"); -#ifdef CONFIG_IDF_TARGET_ESP32S3 +#ifdef CONFIG_USE_AUDIO_PROCESSING audio_processor_.Stop(); #endif break; @@ -607,7 +607,7 @@ void Application::SetDeviceState(DeviceState state) { display->SetEmotion("neutral"); ResetDecoder(); opus_encoder_->ResetState(); -#if CONFIG_IDF_TARGET_ESP32S3 +#if CONFIG_USE_AUDIO_PROCESSING audio_processor_.Start(); #endif UpdateIotStates(); @@ -615,7 +615,7 @@ void Application::SetDeviceState(DeviceState state) { case kDeviceStateSpeaking: display->SetStatus("说话中..."); ResetDecoder(); -#if CONFIG_IDF_TARGET_ESP32S3 +#if CONFIG_USE_AUDIO_PROCESSING audio_processor_.Stop(); #endif break; diff --git a/main/application.h b/main/application.h index d49a6184..8546946f 100644 --- a/main/application.h +++ b/main/application.h @@ -17,7 +17,7 @@ #include "ota.h" #include "background_task.h" -#if CONFIG_IDF_TARGET_ESP32S3 +#if CONFIG_USE_AUDIO_PROCESSING #include "wake_word_detect.h" #include "audio_processor.h" #endif @@ -66,7 +66,7 @@ class Application { Application(); ~Application(); -#if CONFIG_IDF_TARGET_ESP32S3 +#if CONFIG_USE_AUDIO_PROCESSING WakeWordDetect wake_word_detect_; AudioProcessor audio_processor_; #endif diff --git a/main/boards/atk-dnesp32s3/atk_dnesp32s3.cc b/main/boards/atk-dnesp32s3/atk_dnesp32s3.cc index 663f86a6..086879c0 100644 --- a/main/boards/atk-dnesp32s3/atk_dnesp32s3.cc +++ b/main/boards/atk-dnesp32s3/atk_dnesp32s3.cc @@ -162,13 +162,20 @@ class atk_dnesp32s3 : public WifiBoard { } virtual AudioCodec* GetAudioCodec() override { - static Es8388AudioCodec* audio_codec = nullptr; - if (audio_codec == nullptr) { - audio_codec = new Es8388AudioCodec(i2c_bus_, I2C_NUM_0, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, - AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, - GPIO_NUM_NC, AUDIO_CODEC_ES8388_ADDR); - } - return audio_codec; + static Es8388AudioCodec audio_codec( + i2c_bus_, + I2C_NUM_0, + AUDIO_INPUT_SAMPLE_RATE, + AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, + AUDIO_I2S_GPIO_BCLK, + AUDIO_I2S_GPIO_WS, + AUDIO_I2S_GPIO_DOUT, + AUDIO_I2S_GPIO_DIN, + GPIO_NUM_NC, + AUDIO_CODEC_ES8388_ADDR + ); + return &audio_codec; } virtual Display* GetDisplay() override { diff --git a/main/boards/atommatrix-echo-base/atommatrix_echo_base.cc b/main/boards/atommatrix-echo-base/atommatrix_echo_base.cc index fe1b275f..edb33649 100644 --- a/main/boards/atommatrix-echo-base/atommatrix_echo_base.cc +++ b/main/boards/atommatrix-echo-base/atommatrix_echo_base.cc @@ -122,13 +122,20 @@ class AtomMatrixEchoBaseBoard : public WifiBoard { } virtual AudioCodec* GetAudioCodec() override { - static Es8311AudioCodec* audio_codec = nullptr; - if (audio_codec == nullptr) { - audio_codec = new Es8311AudioCodec(i2c_bus_, I2C_NUM_1, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, - AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, - AUDIO_CODEC_GPIO_PA, AUDIO_CODEC_ES8311_ADDR, false); - } - return audio_codec; + static Es8311AudioCodec audio_codec( + i2c_bus_, + I2C_NUM_1, + AUDIO_INPUT_SAMPLE_RATE, + AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, + AUDIO_I2S_GPIO_BCLK, + AUDIO_I2S_GPIO_WS, + AUDIO_I2S_GPIO_DOUT, + AUDIO_I2S_GPIO_DIN, + AUDIO_CODEC_GPIO_PA, + AUDIO_CODEC_ES8311_ADDR, + false); + return &audio_codec; } }; diff --git a/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc b/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc index 93e44842..7c8d437f 100644 --- a/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc +++ b/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc @@ -233,13 +233,20 @@ class AtomS3rEchoBaseBoard : public WifiBoard { } virtual AudioCodec* GetAudioCodec() override { - static Es8311AudioCodec* audio_codec = nullptr; - if (audio_codec == nullptr) { - audio_codec = new Es8311AudioCodec(i2c_bus_, I2C_NUM_1, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, - AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, - AUDIO_CODEC_GPIO_PA, AUDIO_CODEC_ES8311_ADDR, false); - } - return audio_codec; + static Es8311AudioCodec audio_codec( + i2c_bus_, + I2C_NUM_1, + AUDIO_INPUT_SAMPLE_RATE, + AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, + AUDIO_I2S_GPIO_BCLK, + AUDIO_I2S_GPIO_WS, + AUDIO_I2S_GPIO_DOUT, + AUDIO_I2S_GPIO_DIN, + AUDIO_CODEC_GPIO_PA, + AUDIO_CODEC_ES8311_ADDR, + false); + return &audio_codec; } virtual Display* GetDisplay() override { diff --git a/main/boards/common/board.h b/main/boards/common/board.h index e092cbf2..c3f2689f 100644 --- a/main/boards/common/board.h +++ b/main/boards/common/board.h @@ -23,10 +23,7 @@ class Board { public: static Board& GetInstance() { - static Board* instance = nullptr; - if (nullptr == instance) { - instance = static_cast(create_board()); - } + static Board* instance = static_cast(create_board()); return *instance; } diff --git a/main/boards/esp-box-3/esp_box3_board.cc b/main/boards/esp-box-3/esp_box3_board.cc index 93b86d41..60efa39a 100644 --- a/main/boards/esp-box-3/esp_box3_board.cc +++ b/main/boards/esp-box-3/esp_box3_board.cc @@ -146,13 +146,20 @@ class EspBox3Board : public WifiBoard { } virtual AudioCodec* GetAudioCodec() override { - static BoxAudioCodec* audio_codec = nullptr; - if (audio_codec == nullptr) { - audio_codec = new BoxAudioCodec(i2c_bus_, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, - AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, - AUDIO_CODEC_PA_PIN, AUDIO_CODEC_ES8311_ADDR, AUDIO_CODEC_ES7210_ADDR, AUDIO_INPUT_REFERENCE); - } - return audio_codec; + static BoxAudioCodec audio_codec( + i2c_bus_, + AUDIO_INPUT_SAMPLE_RATE, + AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, + AUDIO_I2S_GPIO_BCLK, + AUDIO_I2S_GPIO_WS, + AUDIO_I2S_GPIO_DOUT, + AUDIO_I2S_GPIO_DIN, + AUDIO_CODEC_PA_PIN, + AUDIO_CODEC_ES8311_ADDR, + AUDIO_CODEC_ES7210_ADDR, + AUDIO_INPUT_REFERENCE); + return &audio_codec; } virtual Display* GetDisplay() override { diff --git a/main/boards/esp32s3-korvo2-v3/esp32s3_korvo2_v3_board.cc b/main/boards/esp32s3-korvo2-v3/esp32s3_korvo2_v3_board.cc index b71c1751..9d1e2d74 100644 --- a/main/boards/esp32s3-korvo2-v3/esp32s3_korvo2_v3_board.cc +++ b/main/boards/esp32s3-korvo2-v3/esp32s3_korvo2_v3_board.cc @@ -125,13 +125,20 @@ class esp32s3_korvo2_v3_board : public WifiBoard } virtual AudioCodec* GetAudioCodec() override { - static BoxAudioCodec* audio_codec = nullptr; - if (audio_codec == nullptr) { - audio_codec = new BoxAudioCodec(i2c_bus_, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, - AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, - AUDIO_CODEC_PA_PIN, AUDIO_CODEC_ES8311_ADDR, AUDIO_CODEC_ES7210_ADDR, AUDIO_INPUT_REFERENCE); - } - return audio_codec; + static BoxAudioCodec audio_codec( + i2c_bus_, + AUDIO_INPUT_SAMPLE_RATE, + AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, + AUDIO_I2S_GPIO_BCLK, + AUDIO_I2S_GPIO_WS, + AUDIO_I2S_GPIO_DOUT, + AUDIO_I2S_GPIO_DIN, + AUDIO_CODEC_PA_PIN, + AUDIO_CODEC_ES8311_ADDR, + AUDIO_CODEC_ES7210_ADDR, + AUDIO_INPUT_REFERENCE); + return &audio_codec; } virtual Display *GetDisplay() override diff --git a/main/boards/lichuang-c3-dev/lichuang_c3_dev_board.cc b/main/boards/lichuang-c3-dev/lichuang_c3_dev_board.cc index 1b6f4c3d..c47920f1 100644 --- a/main/boards/lichuang-c3-dev/lichuang_c3_dev_board.cc +++ b/main/boards/lichuang-c3-dev/lichuang_c3_dev_board.cc @@ -116,13 +116,19 @@ class LichuangC3DevBoard : public WifiBoard { } virtual AudioCodec* GetAudioCodec() override { - static Es8311AudioCodec* audio_codec = nullptr; - if (audio_codec == nullptr) { - audio_codec = new Es8311AudioCodec(codec_i2c_bus_, I2C_NUM_0, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, - AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, - AUDIO_CODEC_PA_PIN, AUDIO_CODEC_ES8311_ADDR); - } - return audio_codec; + static Es8311AudioCodec audio_codec( + codec_i2c_bus_, + I2C_NUM_0, + AUDIO_INPUT_SAMPLE_RATE, + AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, + AUDIO_I2S_GPIO_BCLK, + AUDIO_I2S_GPIO_WS, + AUDIO_I2S_GPIO_DOUT, + AUDIO_I2S_GPIO_DIN, + AUDIO_CODEC_PA_PIN, + AUDIO_CODEC_ES8311_ADDR); + return &audio_codec; } virtual Display* GetDisplay() override { diff --git a/main/boards/lichuang-dev/lichuang_dev_board.cc b/main/boards/lichuang-dev/lichuang_dev_board.cc index cc6f8bb7..f8a126d6 100644 --- a/main/boards/lichuang-dev/lichuang_dev_board.cc +++ b/main/boards/lichuang-dev/lichuang_dev_board.cc @@ -142,13 +142,20 @@ class LichuangDevBoard : public WifiBoard { } virtual AudioCodec* GetAudioCodec() override { - static BoxAudioCodec* audio_codec = nullptr; - if (audio_codec == nullptr) { - audio_codec = new BoxAudioCodec(i2c_bus_, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, - AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, - GPIO_NUM_NC, AUDIO_CODEC_ES8311_ADDR, AUDIO_CODEC_ES7210_ADDR, AUDIO_INPUT_REFERENCE); - } - return audio_codec; + static BoxAudioCodec audio_codec( + i2c_bus_, + AUDIO_INPUT_SAMPLE_RATE, + AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, + AUDIO_I2S_GPIO_BCLK, + AUDIO_I2S_GPIO_WS, + AUDIO_I2S_GPIO_DOUT, + AUDIO_I2S_GPIO_DIN, + GPIO_NUM_NC, + AUDIO_CODEC_ES8311_ADDR, + AUDIO_CODEC_ES7210_ADDR, + AUDIO_INPUT_REFERENCE); + return &audio_codec; } virtual Display* GetDisplay() override { diff --git a/main/boards/lilygo-t-circle-s3/lilygo-t-circle-s3.cc b/main/boards/lilygo-t-circle-s3/lilygo-t-circle-s3.cc index eb94e386..6495811d 100644 --- a/main/boards/lilygo-t-circle-s3/lilygo-t-circle-s3.cc +++ b/main/boards/lilygo-t-circle-s3/lilygo-t-circle-s3.cc @@ -219,14 +219,17 @@ class LilygoTCircleS3Board : public WifiBoard { } virtual AudioCodec *GetAudioCodec() override { - static Tcircles3AudioCodec *audio_codec = nullptr; - if (audio_codec == nullptr){ - audio_codec = new Tcircles3AudioCodec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, - AUDIO_MIC_I2S_GPIO_BCLK, AUDIO_MIC_I2S_GPIO_WS, AUDIO_MIC_I2S_GPIO_DATA, - AUDIO_SPKR_I2S_GPIO_BCLK, AUDIO_SPKR_I2S_GPIO_LRCLK, AUDIO_SPKR_I2S_GPIO_DATA, - AUDIO_INPUT_REFERENCE); - } - return audio_codec; + static Tcircles3AudioCodec audio_codec( + AUDIO_INPUT_SAMPLE_RATE, + AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_MIC_I2S_GPIO_BCLK, + AUDIO_MIC_I2S_GPIO_WS, + AUDIO_MIC_I2S_GPIO_DATA, + AUDIO_SPKR_I2S_GPIO_BCLK, + AUDIO_SPKR_I2S_GPIO_LRCLK, + AUDIO_SPKR_I2S_GPIO_DATA, + AUDIO_INPUT_REFERENCE); + return &audio_codec; } virtual Display *GetDisplay() override{ diff --git a/main/boards/m5stack-core-s3/m5stack_core_s3.cc b/main/boards/m5stack-core-s3/m5stack_core_s3.cc index e30ff576..5e38469a 100644 --- a/main/boards/m5stack-core-s3/m5stack_core_s3.cc +++ b/main/boards/m5stack-core-s3/m5stack_core_s3.cc @@ -303,14 +303,18 @@ class M5StackCoreS3Board : public WifiBoard { } virtual AudioCodec* GetAudioCodec() override { - static CoreS3AudioCodec* audio_codec = nullptr; - if (audio_codec == nullptr) { - aw9523_->ResetAw88298(); - audio_codec = new CoreS3AudioCodec(i2c_bus_, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, - AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS, AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, - AUDIO_CODEC_AW88298_ADDR, AUDIO_CODEC_ES7210_ADDR, AUDIO_INPUT_REFERENCE); - } - return audio_codec; + static CoreS3AudioCodec audio_codec(i2c_bus_, + AUDIO_INPUT_SAMPLE_RATE, + AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, + AUDIO_I2S_GPIO_BCLK, + AUDIO_I2S_GPIO_WS, + AUDIO_I2S_GPIO_DOUT, + AUDIO_I2S_GPIO_DIN, + AUDIO_CODEC_AW88298_ADDR, + AUDIO_CODEC_ES7210_ADDR, + AUDIO_INPUT_REFERENCE); + return &audio_codec; } virtual Display* GetDisplay() override { diff --git a/main/display/lcd_display.cc b/main/display/lcd_display.cc index 7188fdae..a86eb0eb 100644 --- a/main/display/lcd_display.cc +++ b/main/display/lcd_display.cc @@ -48,7 +48,7 @@ LcdDisplay::LcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_ .panel_handle = panel_, .control_handle = nullptr, .buffer_size = static_cast(width_ * 10), - .double_buffer = true, + .double_buffer = false, .trans_size = 0, .hres = static_cast(width_), .vres = static_cast(height_),