1 #include "kws.h"
2 #include "../menu.h"
3 #include "aiagent_service.h"
4 #include "aiagent_common.h"
5 #include "beeper/beeper.h"
6
7 #define TAG "kws"
8 #include "uvoice_init.h"
9 #include "uvoice_types.h"
10 #include "uvoice_event.h"
11 #include "uvoice_player.h"
12 #include "uvoice_recorder.h"
13
14 #include "uvoice_os.h"
15
16 MENU_COVER_TYP kws_cover = {MENU_COVER_NONE};
17 MENU_TASK_TYP kws_tasks = {kws_init, kws_uninit};
18 MENU_TYP kws = {"kws", &kws_cover, &kws_tasks, NULL, NULL};
19
20 static os_task_t play_task;
21 static uvoice_player_t *uvocplayer;
22 static char text_source[256];
23 static int source_sample_rate;
24 static int source_channels;
25 static bool running = false;
26
27 extern int audio_install_codec_driver();
28
get_format_from_name(char * name,media_format_t * format)29 static int get_format_from_name(char *name, media_format_t *format)
30 {
31 if (!name || !format) {
32 LOGE(TAG, "arg null !\n");
33 return -1;
34 }
35
36 if (strstr(name, ".mp3") || strstr(name, ".MP3"))
37 *format = MEDIA_FMT_MP3;
38 else if (strstr(name, ".wav") || strstr(name, ".WAV"))
39 *format = MEDIA_FMT_WAV;
40 else if (strstr(name, ".aac") || strstr(name, ".AAC"))
41 *format = MEDIA_FMT_AAC;
42 else if (strstr(name, ".m4a") || strstr(name, ".M4A"))
43 *format = MEDIA_FMT_M4A;
44 else if (strstr(name, ".pcm") || strstr(name, ".PCM"))
45 *format = MEDIA_FMT_PCM;
46 else if (strstr(name, ".spx") || strstr(name, ".SPX"))
47 *format = MEDIA_FMT_SPX;
48 else if (strstr(name, ".ogg") || strstr(name, ".OGG"))
49 *format = MEDIA_FMT_OGG;
50 else if (strstr(name, ".amrwb") || strstr(name, ".AMRWB"))
51 *format = MEDIA_FMT_AMRWB;
52 else if (strstr(name, ".amr") || strstr(name, ".AMR"))
53 *format = MEDIA_FMT_AMR;
54 else if (strstr(name, ".opus") || strstr(name, ".OPUS"))
55 *format = MEDIA_FMT_OPS;
56 else if (strstr(name, ".flac") || strstr(name, ".FLAC"))
57 *format = MEDIA_FMT_FLAC;
58
59 return 0;
60 }
61
play_music(void * arg)62 static void *play_music(void *arg)
63 {
64 media_format_t format = MEDIA_FMT_UNKNOWN;
65 get_format_from_name(text_source, &format);
66
67 if (uvocplayer->set_source(text_source)) {
68 LOGE(TAG, "set source failed !\n");
69 return NULL;
70 }
71
72 if (format == MEDIA_FMT_OPS || format == MEDIA_FMT_SPX)
73 uvocplayer->set_pcminfo(source_sample_rate,
74 source_channels, 16, 1280);
75
76 if (uvocplayer->start()) {
77 LOGE(TAG, "start failed !\n");
78 uvocplayer->clr_source();
79 }
80
81 return NULL;
82 }
83
play_local_mp3(void)84 static int32_t play_local_mp3(void)
85 {
86 int32_t random;
87
88 random = rand() % 240;
89 LOG("random: %d\n", random);
90 memset(text_source, 0, sizeof(text_source));
91 if (random < 100) {
92 strcpy(text_source, "fs:/data/mp3/haas_intro.mp3");
93 } else if (random > 100 && random < 150) {
94 strcpy(text_source, "fs:/data/mp3/haasxiaozhushou.mp3");
95 } else if (random > 150 && random < 200) {
96 strcpy(text_source, "fs:/data/mp3/zhurenwozai.mp3");
97 } else {
98 strcpy(text_source, "fs:/data/mp3/eiwozai.mp3");
99 }
100 aos_task_new_ext(&play_task,
101 "play music task", play_music,
102 NULL, 8192, 0);
103
104 return 0;
105 }
106
kws_callback(ai_result_t * result)107 int32_t kws_callback(ai_result_t *result)
108 {
109 int32_t kws_ret = (int32_t)*result;
110 int32_t ret = -1;
111 player_state_t player_state = -1;
112
113 if (kws_ret) {
114 beeper_start(0, 1, 25);
115 OLED_Clear();
116 OLED_Show_String(14, 24, "Hi, I am here!", 16, 1);
117 OLED_Refresh_GRAM();
118 beeper_stop(0);
119
120 /*play local asr*/
121 play_local_mp3();
122
123 ret = uvocplayer->wait_complete();
124 if (ret < 0)
125 aos_msleep(1000);
126
127 OLED_Clear();
128 OLED_Show_String(28, 16, "HaaS HaaS!", 16, 1);
129 OLED_Show_String(28, 34, "Wakeup me!", 16, 1);
130
131 OLED_Icon_Draw(2, 24, &icon_skip_left, 0);
132 OLED_Icon_Draw(122, 24, &icon_skip_right, 0);
133 OLED_Refresh_GRAM();
134 }
135
136 return 0;
137 }
138
kws_init(void)139 int32_t kws_init(void)
140 {
141 int32_t ret = 0;
142 ai_config_t config;
143
144 OLED_Clear();
145 OLED_Show_String(28, 16, "HaaS HaaS!", 16, 1);
146 OLED_Show_String(28, 34, "Wakeup me!", 16, 1);
147 OLED_Icon_Draw(2, 24, &icon_skip_left, 0);
148 OLED_Icon_Draw(122, 24, &icon_skip_right, 0);
149 OLED_Refresh_GRAM();
150
151 if (!running) {
152 /*Init sound driver*/
153 audio_install_codec_driver();
154
155 /*Init uvoice to play mp3*/
156 uvoice_init();
157
158 /*create uvoice player*/
159 uvocplayer = uvoice_player_create();
160 if (!uvocplayer) {
161 LOGE(TAG, "create media player failed !\n");
162 return -1;
163 }
164 /*set eq*/
165 uvocplayer->eq_enable(0);
166
167 /*set play volume*/
168 uvocplayer->set_volume(10);
169 running = true;
170 }
171
172 ret = aiagent_service_init("kws", AI_MODEL_KWS);
173 if (ret < 0) {
174 LOGE(TAG, "aiagent_service_init failed");
175 return -1;
176 }
177
178 /*config mic channel*/
179 config.channel = 0;
180 aiagent_service_config(&config);
181
182 return aiagent_service_model_infer(NULL, NULL, kws_callback);
183 }
184
kws_uninit(void)185 int32_t kws_uninit(void)
186 {
187 // running = false;
188 uvocplayer->stop();
189 uvocplayer->clr_source();
190 aiagent_service_uninit();
191 return 0;
192 }
193