Skip to content

Commit f418c16

Browse files
authored
Detect wake word model from index.json (#1211)
* detect wake word model from index.json * update wait time before entering wifi configure mode
1 parent a1e1f73 commit f418c16

File tree

20 files changed

+75
-134
lines changed

20 files changed

+75
-134
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# CMakeLists in this exact order for cmake to work correctly
55
cmake_minimum_required(VERSION 3.16)
66

7-
set(PROJECT_VER "2.0.1")
7+
set(PROJECT_VER "2.0.2")
88

99
# Add this line to disable the specific warning
1010
add_compile_options(-Wno-missing-field-initializers)

main/CMakeLists.txt

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,17 @@ list(APPEND SOURCES ${BOARD_COMMON_SOURCES})
4545
list(APPEND INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/boards/common)
4646

4747
idf_build_get_property(build_components BUILD_COMPONENTS)
48+
# Function to find component dynamically by pattern
49+
function(find_component_by_pattern PATTERN COMPONENT_VAR PATH_VAR)
50+
foreach(COMPONENT ${build_components})
51+
if(COMPONENT MATCHES "${PATTERN}")
52+
set(${COMPONENT_VAR} ${COMPONENT} PARENT_SCOPE)
53+
idf_component_get_property(COMPONENT_PATH ${COMPONENT} COMPONENT_DIR)
54+
set(${PATH_VAR} "${COMPONENT_PATH}" PARENT_SCOPE)
55+
break()
56+
endif()
57+
endforeach()
58+
endfunction()
4859

4960
# Set default BUILTIN_TEXT_FONT and BUILTIN_ICON_FONT
5061
set(BUILTIN_TEXT_FONT font_puhui_14_1)
@@ -64,7 +75,7 @@ elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_ESP32)
6475
set(BOARD_TYPE "bread-compact-esp32")
6576
elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_ESP32_LCD)
6677
set(BOARD_TYPE "bread-compact-esp32-lcd")
67-
set(BUILTIN_TEXT_FONT font_puhui_14_1)
78+
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
6879
set(BUILTIN_ICON_FONT font_awesome_14_1)
6980
elseif(CONFIG_BOARD_TYPE_DF_K10)
7081
set(BOARD_TYPE "df-k10")
@@ -202,14 +213,10 @@ elseif(CONFIG_BOARD_TYPE_ECHOEAR)
202213
set(BUILTIN_TEXT_FONT font_puhui_20_4)
203214
set(BUILTIN_ICON_FONT font_awesome_20_4)
204215
# Find esp_emote_gfx component for ECHOEAR extra files
205-
foreach(COMPONENT ${build_components})
206-
if(COMPONENT MATCHES "esp_emote_gfx" OR COMPONENT MATCHES "espressif2022__esp_emote_gfx")
207-
set(EMOTE_GFX_COMPONENT ${COMPONENT})
208-
idf_component_get_property(EMOTE_GFX_COMPONENT_PATH ${EMOTE_GFX_COMPONENT} COMPONENT_DIR)
209-
set(DEFAULT_ASSETS_EXTRA_FILES "${EMOTE_GFX_COMPONENT_PATH}/emoji_normal")
210-
break()
211-
endif()
212-
endforeach()
216+
find_component_by_pattern("esp_emote_gfx" EMOTE_GFX_COMPONENT EMOTE_GFX_COMPONENT_PATH)
217+
if(EMOTE_GFX_COMPONENT_PATH)
218+
set(DEFAULT_ASSETS_EXTRA_FILES "${EMOTE_GFX_COMPONENT_PATH}/emoji_normal")
219+
endif()
213220
elseif(CONFIG_BOARD_TYPE_ESP32S3_AUDIO_BOARD)
214221
set(BOARD_TYPE "waveshare-s3-audio-board")
215222
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
@@ -406,11 +413,11 @@ elseif(CONFIG_BOARD_TYPE_GENJUTECH_S3_1_54TFT)
406413
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
407414
elseif(CONFIG_BOARD_TYPE_ESP32_CGC)
408415
set(BOARD_TYPE "esp32-cgc")
409-
set(BUILTIN_TEXT_FONT font_puhui_14_1)
416+
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
410417
set(BUILTIN_ICON_FONT font_awesome_14_1)
411418
elseif(CONFIG_BOARD_TYPE_ESP32_CGC_144)
412419
set(BOARD_TYPE "esp32-cgc-144")
413-
set(BUILTIN_TEXT_FONT font_puhui_14_1)
420+
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
414421
set(BUILTIN_ICON_FONT font_awesome_14_1)
415422
elseif(CONFIG_BOARD_TYPE_ESP_S3_LCD_EV_Board)
416423
set(BOARD_TYPE "esp-s3-lcd-ev-board")
@@ -499,12 +506,11 @@ if(CONFIG_USE_AUDIO_PROCESSOR)
499506
else()
500507
list(APPEND SOURCES "audio/processors/no_audio_processor.cc")
501508
endif()
502-
if(CONFIG_USE_AFE_WAKE_WORD)
509+
if(CONFIG_IDF_TARGET_ESP32S3 OR CONFIG_IDF_TARGET_ESP32P4)
503510
list(APPEND SOURCES "audio/wake_words/afe_wake_word.cc")
504-
elseif(CONFIG_USE_ESP_WAKE_WORD)
505-
list(APPEND SOURCES "audio/wake_words/esp_wake_word.cc")
506-
elseif(CONFIG_USE_CUSTOM_WAKE_WORD)
507511
list(APPEND SOURCES "audio/wake_words/custom_wake_word.cc")
512+
else()
513+
list(APPEND SOURCES "audio/wake_words/esp_wake_word.cc")
508514
endif()
509515

510516
# Select language directory according to Kconfig
@@ -603,24 +609,16 @@ add_custom_target(lang_header ALL
603609
)
604610

605611
# Find ESP-SR component dynamically
606-
foreach(COMPONENT ${build_components})
607-
if(COMPONENT MATCHES "espressif__esp-sr")
608-
set(ESP_SR_COMPONENT ${COMPONENT})
609-
idf_component_get_property(ESP_SR_COMPONENT_PATH ${ESP_SR_COMPONENT} COMPONENT_DIR)
610-
set(ESP_SR_MODEL_PATH "${ESP_SR_COMPONENT_PATH}/model")
611-
break()
612-
endif()
613-
endforeach()
612+
find_component_by_pattern("espressif__esp-sr" ESP_SR_COMPONENT ESP_SR_COMPONENT_PATH)
613+
if(ESP_SR_COMPONENT_PATH)
614+
set(ESP_SR_MODEL_PATH "${ESP_SR_COMPONENT_PATH}/model")
615+
endif()
614616

615617
# Find xiaozhi-fonts component dynamically
616-
foreach(COMPONENT ${build_components})
617-
if(COMPONENT MATCHES "xiaozhi-fonts")
618-
set(XIAOZHI_FONTS_COMPONENT ${COMPONENT})
619-
idf_component_get_property(XIAOZHI_FONTS_COMPONENT_PATH ${XIAOZHI_FONTS_COMPONENT} COMPONENT_DIR)
620-
set(XIAOZHI_FONTS_PATH "${XIAOZHI_FONTS_COMPONENT_PATH}")
621-
break()
622-
endif()
623-
endforeach()
618+
find_component_by_pattern("xiaozhi-fonts" XIAOZHI_FONTS_COMPONENT XIAOZHI_FONTS_COMPONENT_PATH)
619+
if(XIAOZHI_FONTS_COMPONENT_PATH)
620+
set(XIAOZHI_FONTS_PATH "${XIAOZHI_FONTS_COMPONENT_PATH}")
621+
endif()
624622

625623
if(CONFIG_BOARD_TYPE_ESP_HI)
626624
set(URL "https://github.com/espressif2022/image_player/raw/main/test_apps/test_8bit")

main/audio/audio_service.cc

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@
88
#include "processors/no_audio_processor.h"
99
#endif
1010

11-
#if CONFIG_USE_AFE_WAKE_WORD
11+
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4
1212
#include "wake_words/afe_wake_word.h"
13-
#elif CONFIG_USE_ESP_WAKE_WORD
14-
#include "wake_words/esp_wake_word.h"
15-
#elif CONFIG_USE_CUSTOM_WAKE_WORD
1613
#include "wake_words/custom_wake_word.h"
14+
#else
15+
#include "wake_words/esp_wake_word.h"
1716
#endif
1817

1918
#define TAG "AudioService"
@@ -50,16 +49,6 @@ void AudioService::Initialize(AudioCodec* codec) {
5049
audio_processor_ = std::make_unique<NoAudioProcessor>();
5150
#endif
5251

53-
#if CONFIG_USE_AFE_WAKE_WORD
54-
wake_word_ = std::make_unique<AfeWakeWord>();
55-
#elif CONFIG_USE_ESP_WAKE_WORD
56-
wake_word_ = std::make_unique<EspWakeWord>();
57-
#elif CONFIG_USE_CUSTOM_WAKE_WORD
58-
wake_word_ = std::make_unique<CustomWakeWord>();
59-
#else
60-
wake_word_ = nullptr;
61-
#endif
62-
6352
audio_processor_->OnOutput([this](std::vector<int16_t>&& data) {
6453
PushTaskToEncodeQueue(kAudioTaskTypeEncodeToSendQueue, std::move(data));
6554
});
@@ -71,14 +60,6 @@ void AudioService::Initialize(AudioCodec* codec) {
7160
}
7261
});
7362

74-
if (wake_word_) {
75-
wake_word_->OnWakeWordDetected([this](const std::string& wake_word) {
76-
if (callbacks_.on_wake_word_detected) {
77-
callbacks_.on_wake_word_detected(wake_word);
78-
}
79-
});
80-
}
81-
8263
esp_timer_create_args_t audio_power_timer_args = {
8364
.callback = [](void* arg) {
8465
AudioService* audio_service = (AudioService*)arg;
@@ -100,11 +81,11 @@ void AudioService::Start() {
10081

10182
#if CONFIG_USE_AUDIO_PROCESSOR
10283
/* Start the audio input task */
103-
xTaskCreate([](void* arg) {
84+
xTaskCreatePinnedToCore([](void* arg) {
10485
AudioService* audio_service = (AudioService*)arg;
10586
audio_service->AudioInputTask();
10687
vTaskDelete(NULL);
107-
}, "audio_input", 2048 * 3, this, 8, &audio_input_task_handle_);
88+
}, "audio_input", 2048 * 3, this, 8, &audio_input_task_handle_, 0);
10889

10990
/* Start the audio output task */
11091
xTaskCreate([](void* arg) {
@@ -670,4 +651,36 @@ void AudioService::CheckAndUpdateAudioPowerState() {
670651

671652
void AudioService::SetModelsList(srmodel_list_t* models_list) {
672653
models_list_ = models_list;
673-
}
654+
655+
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4
656+
if (esp_srmodel_filter(models_list_, ESP_MN_PREFIX, NULL) != nullptr) {
657+
wake_word_ = std::make_unique<CustomWakeWord>();
658+
} else if (esp_srmodel_filter(models_list_, ESP_WN_PREFIX, NULL) != nullptr) {
659+
wake_word_ = std::make_unique<AfeWakeWord>();
660+
} else {
661+
wake_word_ = nullptr;
662+
}
663+
#else
664+
if (esp_srmodel_filter(models_list_, ESP_WN_PREFIX, NULL) != nullptr) {
665+
wake_word_ = std::make_unique<EspWakeWord>();
666+
} else {
667+
wake_word_ = nullptr;
668+
}
669+
#endif
670+
671+
if (wake_word_) {
672+
wake_word_->OnWakeWordDetected([this](const std::string& wake_word) {
673+
if (callbacks_.on_wake_word_detected) {
674+
callbacks_.on_wake_word_detected(wake_word);
675+
}
676+
});
677+
}
678+
}
679+
680+
bool AudioService::IsAfeWakeWord() {
681+
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4
682+
return wake_word_ != nullptr && dynamic_cast<AfeWakeWord*>(wake_word_.get()) != nullptr;
683+
#else
684+
return false;
685+
#endif
686+
}

main/audio/audio_service.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ class AudioService {
9494
bool IsIdle();
9595
bool IsWakeWordRunning() const { return xEventGroupGetBits(event_group_) & AS_EVENT_WAKE_WORD_RUNNING; }
9696
bool IsAudioProcessorRunning() const { return xEventGroupGetBits(event_group_) & AS_EVENT_AUDIO_PROCESSOR_RUNNING; }
97+
bool IsAfeWakeWord();
9798

9899
void EnableWakeWordDetection(bool enable);
99100
void EnableVoiceProcessing(bool enable);

main/audio/wake_words/custom_wake_word.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@ bool CustomWakeWord::Initialize(AudioCodec* codec, srmodel_list_t* models_list)
9191
if (models_list == nullptr) {
9292
language_ = "cn";
9393
models_ = esp_srmodel_init("model");
94+
#if CONFIG_CUSTOM_WAKE_WORD
9495
threshold_ = CONFIG_CUSTOM_WAKE_WORD_THRESHOLD / 100.0f;
9596
commands_.push_back({CONFIG_CUSTOM_WAKE_WORD, CONFIG_CUSTOM_WAKE_WORD_DISPLAY, "wake"});
97+
#endif
9698
} else {
9799
models_ = models_list;
98100
ParseWakenetModelConfig();

main/boards/atommatrix-echo-base/README.md

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,6 @@ idf.py menuconfig
1818
Xiaozhi Assistant -> Board Type -> AtomMatrix + Echo Base
1919
```
2020

21-
**修改 flash 大小:**
22-
23-
```
24-
Serial flasher config -> Flash size -> 4 MB
25-
```
26-
27-
**修改分区表:**
28-
29-
```
30-
Partition Table -> Custom partition CSV file -> partitions/v1/4m.csv
31-
```
32-
3321
**编译:**
3422

3523
```bash

main/boards/atommatrix-echo-base/config.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
{
55
"name": "atommatrix-echo-base",
66
"sdkconfig_append": [
7-
"CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y",
8-
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/4m.csv\""
97
]
108
}
119
]

main/boards/atoms3-echo-base/config.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
"name": "atoms3-echo-base",
66
"sdkconfig_append": [
77
"CONFIG_SPIRAM=n",
8-
"CONFIG_USE_AFE=n",
98
"CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y",
109
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\""
1110
]

main/boards/bread-compact-esp32-lcd/config.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
{
55
"name": "bread-compact-esp32-lcd",
66
"sdkconfig_append": [
7-
"CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y",
8-
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/4m.csv\"",
97
"LCD_ST7789_240X240_7PIN=y"
108
]
119
}

main/boards/bread-compact-esp32/README.md

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,6 @@ idf.py menuconfig
1818
Xiaozhi Assistant -> Board Type -> 面包板 ESP32 DevKit
1919
```
2020

21-
**修改 flash 大小:**
22-
23-
```
24-
Serial flasher config -> Flash size -> 4 MB
25-
```
26-
27-
**修改分区表:**
28-
29-
```
30-
Partition Table -> Custom partition CSV file -> partitions/v1/4m.csv
31-
```
32-
3321
**编译:**
3422

3523
```bash

0 commit comments

Comments
 (0)