1+ /*
2+ * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3+ *
4+ * SPDX-License-Identifier: MIT
5+ */
6+ #include < Arduino.h>
7+ #include < M5Unified.h>
8+ #include < M5ModuleLLM.h>
9+
10+ M5ModuleLLM module_llm;
11+
12+ /* Must be capitalized */
13+ String wake_up_keyword = " HELLO" ;
14+ // String wake_up_keyword = "你好你好";
15+ String kws_work_id;
16+ String vad_work_id;
17+ String whisper_work_id;
18+ String language;
19+
20+ void setup ()
21+ {
22+ M5.begin ();
23+ M5.Display .setTextSize (2 );
24+ M5.Display .setTextScroll (true );
25+ // M5.Display.setFont(&fonts::efontCN_12); // Support Chinese display
26+ // M5.Display.setFont(&fonts::efontJA_12); // Support Japanese display
27+
28+ language = " en_US" ;
29+ // language = "zh_CN";
30+
31+ /* Init module serial port */
32+ // int rxd = 16, txd = 17; // Basic
33+ // int rxd = 13, txd = 14; // Core2
34+ // int rxd = 18, txd = 17; // CoreS3
35+ int rxd = M5.getPin (m5::pin_name_t ::port_c_rxd);
36+ int txd = M5.getPin (m5::pin_name_t ::port_c_txd);
37+ Serial2.begin (115200 , SERIAL_8N1, rxd, txd);
38+
39+ /* Init module */
40+ module_llm.begin (&Serial2);
41+
42+ /* Make sure module is connected */
43+ M5.Display .printf (" >> Check ModuleLLM connection..\n " );
44+ while (1 ) {
45+ if (module_llm.checkConnection ()) {
46+ break ;
47+ }
48+ }
49+
50+ /* Reset ModuleLLM */
51+ M5.Display .printf (" >> Reset ModuleLLM..\n " );
52+ module_llm.sys .reset ();
53+
54+ /* Setup Audio module */
55+ M5.Display .printf (" >> Setup audio..\n " );
56+ module_llm.audio .setup ();
57+
58+ /* Setup KWS module and save returned work id */
59+ M5.Display .printf (" >> Setup kws..\n " );
60+ m5_module_llm::ApiKwsSetupConfig_t kws_config;
61+ kws_config.kws = wake_up_keyword;
62+ kws_work_id = module_llm.kws .setup (kws_config, " kws_setup" , language);
63+
64+ /* Setup VAD module and save returned work id */
65+ M5.Display .printf (" >> Setup vad..\n " );
66+ m5_module_llm::ApiVadSetupConfig_t vad_config;
67+ vad_config.input = {" sys.pcm" , kws_work_id};
68+ vad_work_id = module_llm.vad .setup (vad_config, " vad_setup" );
69+
70+ /* Setup Whisper module and save returned work id */
71+ M5.Display .printf (" >> Setup whisper..\n " );
72+ m5_module_llm::ApiWhisperSetupConfig_t whisper_config;
73+ whisper_config.input = {" sys.pcm" , kws_work_id, vad_work_id};
74+ whisper_config.language = " en" ;
75+ // whisper_config.language = "zh";
76+ // whisper_config.language = "ja";
77+ whisper_work_id = module_llm.whisper .setup (whisper_config, " whisper_setup" );
78+
79+ M5.Display .printf (" >> Setup ok\n >> Say \" %s\" to wakeup\n " , wake_up_keyword.c_str ());
80+ }
81+
82+ void loop ()
83+ {
84+ /* Update ModuleLLM */
85+ module_llm.update ();
86+
87+ /* Handle module response messages */
88+ for (auto & msg : module_llm.msg .responseMsgList ) {
89+ /* If KWS module message */
90+ if (msg.work_id == kws_work_id) {
91+ M5.Display .setTextColor (TFT_GREENYELLOW);
92+ M5.Display .printf (" >> Keyword detected\n " );
93+ }
94+
95+ /* If ASR module message */
96+ if (msg.work_id == whisper_work_id) {
97+ /* Check message object type */
98+ if (msg.object == " asr.utf-8" ) {
99+ /* Parse message json and get ASR result */
100+ JsonDocument doc;
101+ deserializeJson (doc, msg.raw_msg );
102+ String asr_result = doc[" data" ].as <String>();
103+
104+ M5.Display .setTextColor (TFT_YELLOW);
105+ M5.Display .printf (" >> %s\n " , asr_result.c_str ());
106+ }
107+ }
108+ }
109+
110+ /* Clear handled messages */
111+ module_llm.msg .responseMsgList .clear ();
112+ }
0 commit comments