From 32d13397721a5e1377ad68c1b8a1f3e1167abaee Mon Sep 17 00:00:00 2001 From: xysun Date: Mon, 2 Dec 2024 15:05:01 +0800 Subject: [PATCH] test: add more test case for multinet --- conftest.py | 2 +- test_apps/esp-sr/main/test_multinet.cpp | 84 ++++++++++++++++++++++++- 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/conftest.py b/conftest.py index 0220a9e..4c063b3 100644 --- a/conftest.py +++ b/conftest.py @@ -202,7 +202,7 @@ class IdfPytestEmbedded: for item in items: # default timeout 5 mins if 'timeout' not in item.keywords: - item.add_marker(pytest.mark.timeout(5 * 60)) + item.add_marker(pytest.mark.timeout(8 * 60)) # filter all the test cases with "--target" if self.target: diff --git a/test_apps/esp-sr/main/test_multinet.cpp b/test_apps/esp-sr/main/test_multinet.cpp index 369e23a..73751d9 100644 --- a/test_apps/esp-sr/main/test_multinet.cpp +++ b/test_apps/esp-sr/main/test_multinet.cpp @@ -125,6 +125,88 @@ TEST_CASE("multinet cpu loading", "[mn]") TEST_ASSERT_EQUAL(true, mn_state == ESP_MN_STATE_DETECTED); } +TEST_CASE("multinet set commands and detect", "[mn]") +{ + vTaskDelay(500 / portTICK_PERIOD_MS); + srmodel_list_t *models = esp_srmodel_init("model"); + char *model_name = esp_srmodel_filter(models, ESP_MN_PREFIX, NULL); + esp_mn_iface_t *multinet = esp_mn_handle_from_name(model_name); + + model_iface_data_t *model_data = multinet->create(model_name, 6000); + int frequency = multinet->get_samp_rate(model_data); + int audio_chunksize = multinet->get_samp_chunksize(model_data) * sizeof(int16_t); + char *lang = multinet->get_language(model_data); + esp_mn_commands_update_from_sdkconfig(multinet, model_data); + unsigned char* data = NULL; + size_t data_size = 0; + if (strcmp(lang, ESP_MN_ENGLISH) == 0) { + data = (unsigned char*)tell_me_a_joke; + data_size = sizeof(tell_me_a_joke); + printf("commands: tell me a joke, size:%d\n", data_size); + } else if(strcmp(lang, ESP_MN_CHINESE) == 0) { + data = (unsigned char*)da_kai_kong_tiao; + data_size = sizeof(da_kai_kong_tiao); + printf("commands: da kai kong tiao, size:%d\n", data_size); + } + + int16_t *buffer = (int16_t *) malloc(audio_chunksize); + int chunks = 0; + struct timeval tv_start, tv_end; + gettimeofday(&tv_start, NULL); + esp_mn_state_t mn_state; + esp_mn_error_t *error_phrases = NULL; + esp_mn_commands_clear(); + + if (strcmp(lang, ESP_MN_ENGLISH) == 0) { + if (strcmp(model_name, "mn5q8_en") == 0) { + esp_mn_commands_add(1, "TfL Mm c qbK"); + esp_mn_commands_add(2, "Sgl c Sel"); + } else { + esp_mn_commands_add(1, "TELL ME A JOKE"); + esp_mn_commands_add(2, "SING A SONG"); + } + error_phrases = esp_mn_commands_update(); + } else if(strcmp(lang, ESP_MN_CHINESE) == 0) { + esp_mn_commands_add(1, "da kai kong tiao"); + esp_mn_commands_add(2, "guan bi kong tiao"); + error_phrases = esp_mn_commands_update(); + } else { + printf("Invalid language\n"); + } + multinet->print_active_speech_commands(model_data); + + while (1) { + if ((chunks + 1)*audio_chunksize <= data_size) { + memcpy(buffer, data + chunks * audio_chunksize, audio_chunksize); + } else { + memset(buffer, 0, audio_chunksize); + } + mn_state = multinet->detect(model_data, buffer); + if (mn_state == ESP_MN_STATE_DETECTED) { + esp_mn_results_t *mn_result = multinet->get_results(model_data); + if (mn_result->num > 0) + printf("detected: command id:%d, string:%s\n",mn_result->command_id[0], mn_result->string); + else + printf("timeout\n"); + break; + } + chunks++; + if (chunks > 600) + break; + } + gettimeofday(&tv_end, NULL); + int tv_ms=(tv_end.tv_sec-tv_start.tv_sec)*1000+(tv_end.tv_usec-tv_start.tv_usec)/1000; + chunks -= 7; + int run_ms = (chunks)*audio_chunksize/sizeof(int16_t)*1000/frequency; + printf("Done! Took %d ms to parse %d ms worth of samples in %d iterations. CPU loading(single core):%.1f%%\n", + tv_ms, run_ms, chunks, tv_ms*100.0/run_ms); + + multinet->destroy(model_data); + esp_srmodel_deinit(models); + TEST_ASSERT_EQUAL(true, error_phrases == NULL); + TEST_ASSERT_EQUAL(true, mn_state == ESP_MN_STATE_DETECTED); +} + TEST_CASE("multinet set commands", "[mn]") { vTaskDelay(500 / portTICK_PERIOD_MS); @@ -367,4 +449,4 @@ TEST_CASE("multinet modify commands", "[mn]") multinet->destroy(model_data); esp_srmodel_deinit(models); TEST_ASSERT_EQUAL(true, 1); -} \ No newline at end of file +}