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