Files
2025-12-03 11:12:34 +08:00

230 lines
6.1 KiB
C

#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