#ifdef SUPPORT_MS_EXTENSIONS #pragma bss_seg(".kws_event.data.bss") #pragma data_seg(".kws_event.data") #pragma const_seg(".kws_event.text.const") #pragma code_seg(".kws_event.text") #endif /***************************************************************** >file name : kws_event.c >author : lichao >create time : Mon 01 Nov 2021 11:34:00 AM CST *****************************************************************/ #include "app_config.h" #include "system/includes.h" #include "kws_event.h" #include "asr/jl_kws.h" #include "key/key_driver.h" #include "app_msg.h" #if ((defined TCFG_SMART_VOICE_ENABLE) && TCFG_SMART_VOICE_ENABLE) extern int config_audio_kws_event_enable; static const int kws_wake_word_event[] = { KWS_EVENT_NULL, KWS_EVENT_HEY_KEYWORD, }; static const int kws_multi_command_event[] = { [ 0] = KWS_EVENT_NULL, [ 1] = KWS_EVENT_NULL, [ 2] = KWS_EVENT_PLAY_MUSIC, [ 3] = KWS_EVENT_PAUSE_MUSIC, [ 4] = KWS_EVENT_STOP_MUSIC, [ 5] = KWS_EVENT_VOLUME_UP, [ 6] = KWS_EVENT_VOLUME_DOWN, [ 7] = KWS_EVENT_PREV_SONG, [ 8] = KWS_EVENT_NEXT_SONG, [ 9] = KWS_EVENT_DETECTION_HEART, [10] = KWS_EVENT_DETECTION_OXYGEN, [11] = KWS_EVENT_SEE_SPORT_RECORD, [12] = KWS_EVENT_SEE_ACTION_RECORD, [13] = KWS_EVENT_SEE_SLEEP_RECORD, [14] = KWS_EVENT_SEE_CALL_REDORD, [15] = KWS_EVENT_SEE_TRAIN_RECORD, [16] = KWS_EVENT_SEE_HEAT, [17] = KWS_EVENT_START_PHOTOS, [18] = KWS_EVENT_SWITCH_DIAL, [19] = KWS_EVENT_SWITCH_STYLE, [20] = KWS_EVENT_FIND_PHONE, [21] = KWS_EVENT_VOLUME_MUTE, [22] = KWS_EVENT_VOLUME_UNMUTE, [23] = KWS_EVENT_VOLUME_MAX, [24] = KWS_EVENT_BRIGHTNESS_ALWAYS, [25] = KWS_EVENT_BRIGHTNESS_UP, [26] = KWS_EVENT_BRIGHTNESS_DOWN, [27] = KWS_EVENT_BRIGHTNESS_AUTO, [28] = KWS_EVENT_OPEN_SPORT, [29] = KWS_EVENT_OPEN_TRAIN, [30] = KWS_EVENT_OPEN_CALCULAGRAPH, [31] = KWS_EVENT_OPEN_CALL_DIAL, [32] = KWS_EVENT_OPEN_PHONEBOOK, [33] = KWS_EVENT_OPEN_ALARM, [34] = KWS_EVENT_OPEN_STOPWATCH, [35] = KWS_EVENT_OPEN_WEATHER, [36] = KWS_EVENT_OPEN_MESS, [37] = KWS_EVENT_OPEN_SET, [38] = KWS_EVENT_OPEN_APP_LIST, [39] = KWS_EVENT_OPEN_BREATH_TRAIN, [40] = KWS_EVENT_OPEN_BARO, [41] = KWS_EVENT_OPEN_COMPASS, [42] = KWS_EVENT_OPEN_CARD_BAG, [43] = KWS_EVENT_OPEN_ALIPAY, [44] = KWS_EVENT_OPEN_FLASHLIGHT, [45] = KWS_EVENT_OPEN_CALENDAR, [46] = KWS_EVENT_OPEN_CALCULATOR, [47] = KWS_EVENT_OPEN_EDR, [48] = KWS_EVENT_CALL_ACTIVE, [49] = KWS_EVENT_CALL_HANGUP, }; static const int kws_call_command_event[] = { KWS_EVENT_NULL, KWS_EVENT_NULL, KWS_EVENT_CALL_ACTIVE, KWS_EVENT_CALL_HANGUP, }; static const int *kws_model_events[3] = { kws_wake_word_event, kws_multi_command_event, kws_call_command_event, }; int smart_voice_kws_event_handler(u8 model, int kws) { if (!config_audio_kws_event_enable || kws < 0) { return 0; } int event = KWS_EVENT_NULL; if (model >= sizeof(kws_model_events) / sizeof(kws_model_events[0])) { return -EINVAL; } event = kws_model_events[model][kws]; if (event == KWS_EVENT_NULL) { return -EINVAL; } int msg[2]; msg[0] = APP_MSG_SMART_VOICE_EVENT; msg[1] = event; os_taskq_post_type("app_core", MSG_FROM_APP, 2, msg); return 0; } static const char *kws_dump_words[] = { [ 0] = "no words", [ 1] = "hey siri", [ 2] = "bo fang", [ 3] = "zan ting", [ 4] = "ting zhi", [ 5] = "zeng da", [ 6] = "jian xiao", [ 7] = "shangyishou", [ 8] = "xiayishou", [ 9] = "xin lv", [10] = "xue yang", [11] = "duan lian ji lu", [12] = "huo dong ji lu", [13] = "shui mian shuo ju", [14] = "tong hua ji lu", [15] = "xun lian ji lu", [16] = "ya li zhi biao", [17] = "pai zhao", [18] = "geng huan biao pan", [19] = "jie mian feng ge", [20] = "zhao shou ji", [21] = "jing yin mo shi", [22] = "qu xiao jing yin", [23] = "zui da yin liang", [24] = "ping mu chang liang", [25] = "zeng da liang du", [26] = "jain xiao liang du", [27] = "tiao zheng liang du", [28] = "yun dong", [29] = "duan lian", [30] = "ji shi qi", [31] = "dian hua", [32] = "lian xi ren", [33] = "nao zhong", [34] = "miao biao", [35] = "tian qi", [36] = "xiao xi", [37] = "she zhi", [38] = "ying yong lie biao", [39] = "hu xi xun lian", [40] = "hai bo qi ya ji", [41] = "zhi nan zhen", [42] = "ka bao", [43] = "zhi fu bao", [44] = "shou dian tong", [45] = "ri li", [46] = "ji suan qi", [47] = "lan ya", [48] = "jie ting", [49] = "gua duan", }; struct kws_result_context { u16 timer; u32 result[0]; }; static void smart_voice_kws_dump_timer(void *arg) { struct kws_result_context *ctx = (struct kws_result_context *)arg; int i = 0; int kws_num = ARRAY_SIZE(kws_dump_words); printf("\n===============================================\nResults:\n"); for (i = 1; i < kws_num; i++) { printf("%s : %u\n", kws_dump_words[i], ctx->result[i]); } printf("\n===============================================\n"); } void *smart_voice_kws_dump_open(int period_time) { if (!config_audio_kws_event_enable) { return NULL; } struct kws_result_context *ctx = NULL; ctx = zalloc(sizeof(struct kws_result_context) + (sizeof(u32) * ARRAY_SIZE(kws_dump_words))); if (ctx) { ctx->timer = sys_timer_add(ctx, smart_voice_kws_dump_timer, period_time); } return ctx; } void smart_voice_kws_dump_result_add(void *_ctx, u8 model, int kws) { if (!config_audio_kws_event_enable || kws < 0) { return; } struct kws_result_context *ctx = (struct kws_result_context *)_ctx; int event = kws_model_events[model][kws]; if (event >= ARRAY_SIZE(kws_dump_words)) { return; } ctx->result[event]++; } void smart_voice_kws_dump_close(void *_ctx) { struct kws_result_context *ctx = (struct kws_result_context *)_ctx; if (config_audio_kws_event_enable) { if (ctx->timer) { sys_timer_del(ctx->timer); free(ctx); } } } #endif