From 6b21fdf9701f029d55111fc91f4e5cdb131fc8ad Mon Sep 17 00:00:00 2001 From: sxy Date: Mon, 15 Aug 2022 15:03:18 +0800 Subject: [PATCH] feat(model): modify model loader to reduce model bin size for esp32 --- CMakeLists.txt | 3 + include/esp32/model_path.h | 79 --------- include/esp32s3/esp_mn_speech_commands.h | 158 ------------------ include/esp32s3/esp_process_sdkconfig.h | 23 --- lib/esp32/libesp_audio_front_end.a | Bin 309406 -> 309426 bytes lib/esp32/libesp_audio_processor.a | Bin 2966320 -> 2966320 bytes lib/esp32/libmultinet.a | Bin 688886 -> 688886 bytes lib/esp32/libwakenet.a | Bin 182340 -> 179800 bytes src/esp_process_sdkconfig.c | 3 +- .../include}/esp_mn_speech_commands.h | 0 .../include}/esp_process_sdkconfig.h | 2 +- {include/esp32s3 => src/include}/model_path.h | 17 +- src/model_path.c | 25 +-- 13 files changed, 36 insertions(+), 274 deletions(-) delete mode 100644 include/esp32/model_path.h delete mode 100644 include/esp32s3/esp_mn_speech_commands.h delete mode 100644 include/esp32s3/esp_process_sdkconfig.h rename {include/esp32 => src/include}/esp_mn_speech_commands.h (100%) rename {include/esp32 => src/include}/esp_process_sdkconfig.h (80%) rename {include/esp32s3 => src/include}/model_path.h (88%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 13e8518..29ba1d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,7 @@ if(IDF_TARGET STREQUAL "esp32") set(COMPONENT_ADD_INCLUDEDIRS esp-tts/esp_tts_chinese/include include/esp32 + src/include ) set(COMPONENT_SRCS src/esp_mn_speech_commands.c @@ -40,6 +41,7 @@ elseif(${IDF_TARGET} STREQUAL "esp32s2") set(COMPONENT_ADD_INCLUDEDIRS esp-tts/esp_tts_chinese/include include/esp32 + src/include ) set(COMPONENT_SRCS src/esp_process_sdkconfig.c @@ -62,6 +64,7 @@ elseif(${IDF_TARGET} STREQUAL "esp32s3") set(COMPONENT_ADD_INCLUDEDIRS esp-tts/esp_tts_chinese/include include/esp32s3 + src/include ) set(COMPONENT_SRCS src/esp_mn_speech_commands.c diff --git a/include/esp32/model_path.h b/include/esp32/model_path.h deleted file mode 100644 index 4900dbb..0000000 --- a/include/esp32/model_path.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -typedef struct -{ - char **model_name; // the name of models, like "wn9_hilexin"(wakenet9, hilexin), "mn5_en"(multinet5, english) - char *partition_label; // partition label used to save the files of model - int num; // the number of models -} srmodel_list_t; - -#define MODEL_NAME_MAX_LENGTH 64 - -/** - * @brief Return all avaliable models in spiffs or selected in Kconfig. - * - * @param partition_label The spiffs label defined in your partition file used to save models. - * - * @return all avaliable models in spiffs,save as srmodel_list_t. - */ -srmodel_list_t* esp_srmodel_init(const char* partition_label); - -/** - * @brief Free srmodel_list_t and unregister SPIFFS filesystem if open SPIFFS filesystem. - * - * @param models The srmodel_list_t point allocated by esp_srmodel_init function. - * - * @return all avaliable models in spiffs,save as srmodel_list_t. - */ -void esp_srmodel_deinit(srmodel_list_t *models); - -/** - * @brief Return the first model name containing the specified keywords - * If keyword is NULL, we will ignore the keyword. - * - * @param models The srmodel_list_t point allocated by esp_srmodel_init function. - * @param keyword1 The specified keyword1 , like ESP_WN_PREDIX(the prefix of wakenet), - * ESP_MN_PREFIX(the prefix of multinet), - * - * @param keyword2 The specified keyword2, like ESP_MN_ENGLISH(the english multinet) - * ESP_MN_CHINESE(the chinese multinet) - * "alexa" (the "alexa" wakenet) - * @return return model name if can find one model name containing the keywords otherwise return NULL. - */ -char *esp_srmodel_filter(srmodel_list_t *models, const char *keyword1, const char *keyword2); - - -/** - * @brief Check whether the specified model name exists or not. - * - * @param models The srmodel_list_t point allocated by esp_srmodel_init function. - * @param model_name The specified model name - * @return return index in models if model name exists otherwise return -1 - */ -int esp_srmodel_exists(srmodel_list_t *models, char *model_name); - -/** - * @brief Initialize and mount SPIFFS filesystem, return all avaliable models in spiffs. - * - * @param partition_label The spiffs label defined in your partition file used to save models. - * - * @return all avaliable models in spiffs,save as srmodel_list_t. - */ -srmodel_list_t *srmodel_spiffs_init(const char* partition_label); - -/** - * @brief unregister SPIFFS filesystem and free srmodel_list_t. - * - * @param models The srmodel_list_t point allocated by srmodel_spiffs_init function. - * - * @return all avaliable models in spiffs,save as srmodel_list_t. - */ -void srmodel_spiffs_deinit(srmodel_list_t *models); - - -/** - * @brief Return base path of srmodel spiffs - * - * @return the base path od srmodel spiffs - */ -char *get_model_base_path(void); \ No newline at end of file diff --git a/include/esp32s3/esp_mn_speech_commands.h b/include/esp32s3/esp_mn_speech_commands.h deleted file mode 100644 index 2ef3c16..0000000 --- a/include/esp32s3/esp_mn_speech_commands.h +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2015-2022 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#pragma once -#include "esp_err.h" -#include "esp_mn_iface.h" - -/* -esp_mn_node_t is a singly linked list which is used to manage speech commands. -It is easy to add one speech command into linked list and remove one speech command from linked list. -*/ - - -/** - * @brief Initialze the speech commands singly linked list. - * - * @return - * - ESP_OK Success - * - ESP_ERR_NO_MEM No memory - * - ESP_ERR_INVALID_STATE The Speech Commands link has been initialized - */ -esp_err_t esp_mn_commands_alloc(void); - -/** - * @brief Clear the speech commands linked list and free root node. - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_STATE The Speech Commands link has not been initialized - */ -esp_err_t esp_mn_commands_free(void); - -/** - * @brief Add one speech commands with phoneme string and command ID - * - * @param command_id The command ID - * @param phoneme_string The phoneme string of the speech commands - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_STATE Fail - */ -esp_err_t esp_mn_commands_add(int command_id, char *phoneme_string); - -/** - * @brief Modify one speech commands with new phoneme string - * - * @param old_phoneme_string The old phoneme string of the speech commands - * @param new_phoneme_string The new phoneme string of the speech commands - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_STATE Fail - */ -esp_err_t esp_mn_commands_modify(char *old_phoneme_string, char *new_phoneme_string); - -/** - * @brief Remove one speech commands by phoneme string - * - * @param phoneme_string The phoneme string of the speech commands - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_STATE Fail - */ -esp_err_t esp_mn_commands_remove(char *phoneme_string); - -/** - * @brief Clear all speech commands in linked list - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_STATE Fail - */ -esp_err_t esp_mn_commands_clear(void); - -/** - * @brief Get phrase from index, which is the depth from the phrase node to root node - * - * @Warning: The first phrase index is 0, the second phrase index is 1, and so on. - * - * @return - * - esp_mn_phrase_t* Success - * - NULL Fail - */ -esp_mn_phrase_t *esp_mn_commands_get_from_index(int index); - -/** - * @brief Get phrase from phoneme string - * - * @return - * - esp_mn_phrase_t* Success - * - NULL Fail - */ -esp_mn_phrase_t *esp_mn_commands_get_from_string(const char *phoneme_string); - -/** - * @brief Update the speech commands of MultiNet - * - * @Warning: Must be used after [add/remove/modify/clear] function, - * otherwise the language model of multinet can not be updated. - * - * @param multinet The multinet handle - * @param model_data The model object to query - * - * @return - * - NULL Success - * - others The list of error phrase which can not be parsed by multinet. - */ -esp_mn_error_t *esp_mn_commands_update(const esp_mn_iface_t *multinet, const model_iface_data_t *model_data); - -/** - * @brief Print the MultiNet Speech Commands. - */ -void esp_mn_print_commands(void); - -/** - * @brief Initialze the esp_mn_phrase_t struct by command id and phoneme string . - * - * @return the pointer of esp_mn_phrase_t - */ -esp_mn_phrase_t *esp_mn_phrase_alloc(int command_id, char *phoneme_string); - -/** - * @brief Free esp_mn_phrase_t pointer. - * - * @param phrase The esp_mn_phrase_t pointer - */ -void esp_mn_phrase_free(esp_mn_phrase_t *phrase); - -/** - * @brief Initialze the esp_mn_node_t struct by esp_mn_phrase_t pointer. - * - * @return the pointer of esp_mn_node_t - */ -esp_mn_node_t *esp_mn_node_alloc(esp_mn_phrase_t *phrase); - -/** - * @brief Free esp_mn_node_t pointer. - * - * @param node The esp_mn_node_free pointer - */ -void esp_mn_node_free(esp_mn_node_t *node); - -/** - * @brief Print phrase linked list. - */ -void esp_mn_commands_print(void); \ No newline at end of file diff --git a/include/esp32s3/esp_process_sdkconfig.h b/include/esp32s3/esp_process_sdkconfig.h deleted file mode 100644 index aca5c50..0000000 --- a/include/esp32s3/esp_process_sdkconfig.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -#include "esp_err.h" -#include "esp_mn_iface.h" - -/** - * @brief Check chip config to ensure optimum performance - */ -void check_chip_config(void); - -/** - * @brief Update the speech commands of MultiNet by menuconfig - * - * @param multinet The multinet handle - * - * @param model_data The model object to query - * - * @param langugae The language of MultiNet - * - * @return - * - ESP_OK Success - * - ESP_ERR_INVALID_STATE Fail - */ -esp_err_t esp_mn_commands_update_from_sdkconfig(esp_mn_iface_t *multinet, const model_iface_data_t *model_data); diff --git a/lib/esp32/libesp_audio_front_end.a b/lib/esp32/libesp_audio_front_end.a index 2846c5df0e30d4b9c4cd8ce99d96963ad2db8bd0..838b01b955294f4cdd380718c27d0521f4c2c066 100644 GIT binary patch delta 54972 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 delta 54995 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 XIOl>(uDIrgTZY_m&%>vb$H(^%v3O(@ diff --git a/lib/esp32/libmultinet.a b/lib/esp32/libmultinet.a index 011f645af49269e58b9326821697c7909ab02fb6..cc6e21c529610e0b00af7be48747afbb7b853dd1 100644 GIT binary patch delta 55 zcmey?s`af^tD%Llg{g(Pg{6hHg>4J_{!M}=Rz@aPCZ-HP;8>cjU})NYVG}zLb8Nq` IiBs(Y02{>4J_{!M}gR>qcACZ-HP;8>cjU})5SVG}zLb8Nq` IiBs(Y02{>Q5 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 ZJ@|-O%Racwj0?;7&8RuE%$(T#{{dgQda(ci delta 26125 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 diff --git a/src/esp_process_sdkconfig.c b/src/esp_process_sdkconfig.c index 1e23a4d..9582c63 100644 --- a/src/esp_process_sdkconfig.c +++ b/src/esp_process_sdkconfig.c @@ -876,7 +876,7 @@ char *get_id_name_en(int i) #endif } -esp_err_t esp_mn_commands_update_from_sdkconfig(esp_mn_iface_t *multinet, const model_iface_data_t *model_data) +esp_mn_error_t* esp_mn_commands_update_from_sdkconfig(esp_mn_iface_t *multinet, const model_iface_data_t *model_data) { esp_mn_commands_alloc(); int total_phrase_num = 0; @@ -902,7 +902,6 @@ esp_err_t esp_mn_commands_update_from_sdkconfig(esp_mn_iface_t *multinet, const char *token = strtok(command_str_temp, ","); while (token != NULL) { - int len = strlen(token); if (total_phrase_num > ESP_MN_MAX_PHRASE_NUM) { ESP_LOGE(TAG, "The number of speech commands phrase must less than ESP_MN_MAX_PHRASE_NUM"); free(command_str_temp); diff --git a/include/esp32/esp_mn_speech_commands.h b/src/include/esp_mn_speech_commands.h similarity index 100% rename from include/esp32/esp_mn_speech_commands.h rename to src/include/esp_mn_speech_commands.h diff --git a/include/esp32/esp_process_sdkconfig.h b/src/include/esp_process_sdkconfig.h similarity index 80% rename from include/esp32/esp_process_sdkconfig.h rename to src/include/esp_process_sdkconfig.h index aca5c50..355515e 100644 --- a/include/esp32/esp_process_sdkconfig.h +++ b/src/include/esp_process_sdkconfig.h @@ -20,4 +20,4 @@ void check_chip_config(void); * - ESP_OK Success * - ESP_ERR_INVALID_STATE Fail */ -esp_err_t esp_mn_commands_update_from_sdkconfig(esp_mn_iface_t *multinet, const model_iface_data_t *model_data); +esp_mn_error_t* esp_mn_commands_update_from_sdkconfig(esp_mn_iface_t *multinet, const model_iface_data_t *model_data); diff --git a/include/esp32s3/model_path.h b/src/include/model_path.h similarity index 88% rename from include/esp32s3/model_path.h rename to src/include/model_path.h index 4900dbb..0c685cd 100644 --- a/include/esp32s3/model_path.h +++ b/src/include/model_path.h @@ -76,4 +76,19 @@ void srmodel_spiffs_deinit(srmodel_list_t *models); * * @return the base path od srmodel spiffs */ -char *get_model_base_path(void); \ No newline at end of file +char *get_model_base_path(void); + + +#ifdef ESP_PLATFORM +#include "dl_lib_coefgetter_if.h" +/** + * @brief Return model_coeff_getter_t pointer base on model_name + * + * @warning Just support ESP32 to load old wakenet + * + * @param model_name The model name + * + * @return model_coeff_getter_t pointer or NULL + */ +model_coeff_getter_t* srmodel_get_model_coeff(char *model_name); +#endif \ No newline at end of file diff --git a/src/model_path.c b/src/model_path.c index ad45064..90fe089 100644 --- a/src/model_path.c +++ b/src/model_path.c @@ -79,8 +79,7 @@ srmodel_list_t *read_models_form_spiffs(esp_vfs_spiffs_conf_t *conf) srmodel_list_t* srmodel_spiffs_init(const char *partition_label) { - printf(" \n"); - ESP_LOGI(TAG, "Initializing models from SPIFFS, partition label: %s", partition_label); + ESP_LOGI(TAG, "\nInitializing models from SPIFFS, partition label: %s\n", partition_label); esp_vfs_spiffs_conf_t conf = { .base_path = SRMODE_BASE_PATH, @@ -185,6 +184,12 @@ void srmodel_config_deinit(srmodel_list_t *models) } } +model_coeff_getter_t* srmodel_get_model_coeff(char *model_name) +{ + model_coeff_getter_t *gettercb = &WAKENET_COEFF; + return gettercb; +} + #endif char *get_model_base_path(void) @@ -200,7 +205,7 @@ int set_model_base_path(const char *base_path) return 1; } -char* join_path(char* dirname, char *filename) +char* _join_path_(const char* dirname, const char *filename) { if (dirname == NULL || filename == NULL) return NULL; @@ -223,8 +228,8 @@ srmodel_list_t* srmodel_sdcard_init(const char *base_path) { printf("Initializing models from path: %s\n", base_path); set_model_base_path(base_path); - struct dirent *ret, *sub_ret; - DIR *dir, *sub_dir; + struct dirent *ret; + DIR *dir; dir = opendir(base_path); srmodel_list_t *models = NULL; int model_num = 0; @@ -238,8 +243,8 @@ srmodel_list_t* srmodel_sdcard_init(const char *base_path) { // NULL if reach the end of directory if (ret->d_type == DT_DIR) { // if d_type is directory - char *sub_path = join_path(base_path, ret->d_name); - char *info_file = join_path(sub_path, "_MODEL_INFO_"); + char *sub_path = _join_path_(base_path, ret->d_name); + char *info_file = _join_path_(sub_path, "_MODEL_INFO_"); fp = fopen(info_file, "r"); if (fp != NULL) { model_num ++; // If _MODLE_INFO_ file exists, model_num ++ @@ -271,8 +276,8 @@ srmodel_list_t* srmodel_sdcard_init(const char *base_path) { // NULL if reach the end of directory if (ret->d_type == DT_DIR) { // if d_type is directory - char *sub_path = join_path(base_path, ret->d_name); - char *info_file = join_path(sub_path, "_MODEL_INFO_"); + char *sub_path = _join_path_(base_path, ret->d_name); + char *info_file = _join_path_(sub_path, "_MODEL_INFO_"); fp = fopen(info_file, "r"); if (fp != NULL) { memcpy(models->model_name[idx], ret->d_name, strlen(ret->d_name)); @@ -337,7 +342,7 @@ void esp_srmodel_deinit(srmodel_list_t *models) char *_esp_strstr_(const char *haystack, const char *needle) { if (needle == NULL) return haystack; - else return strstr(haystack, needle); + else return (char *)strstr(haystack, needle); } char *esp_srmodel_filter(srmodel_list_t *models, const char *keyword1, const char *keyword2)