diff --git a/code/ai_main.py b/code/ai_main.py index 9536c92..f20915f 100644 --- a/code/ai_main.py +++ b/code/ai_main.py @@ -1,5 +1,4 @@ import sim -from usr.ui import SelectWindow, ChatWindow from usr.jobs import scheduler from usr import pypubsub as pub @@ -33,20 +32,16 @@ def ai_callback(args): global GPIO39 event = args[0] msg = args[1] - global chat_win if event == 1: print('TIKTOK_RTC_EVENT_START') GPIO39.write(1) - chat_win.update_status("Please speak to me") elif event == 2: print('TIKTOK_RTC_EVENT_STOP') GPIO39.write(0) elif event == 3: - #chat_win.update_status("AI speaking . . .") print('TIKTOK_RTC_EVENT_TTS_TEXT {}'.format(msg)) #call.stopAudioService() elif event == 4: - #chat_win.update_status("AI listening . . .") print('TIKTOK_RTC_EVENT_ASR_TEXT {}'.format(msg)) #call.stopAudioService() elif event == 5: @@ -54,38 +49,11 @@ def ai_callback(args): else: print('TIKTOK_RTC_EVENT UNKNOWN {}'.format(event)) -def update_status_with_animation(chat_win, base_message, steps=3, delay_ms=400, final_wait=2): - # 更新动画 - for i in range(steps + 1): - chat_win.update_status(base_message + " " + " ." * i) - time.sleep_ms(delay_ms) - time.sleep(final_wait) - -def perform_initialization(chat_win, tiktok): - # 初始化动画加载状态 - print('start rtc') - chat_win.show() - tiktok.active(True) - - # 需要展示的状态列表 - status_list = [ - "Connecting to the server", - "Building the AI engine", - "Joining the AI room", - "Loading AI personality", - "Creating AI characters" - ] - - # 依次遍历状态并显示动画 - for status in status_list: - update_status_with_animation(chat_win, status) def ai_task(): global rtc_queue global extint1 global extint2 global tiktok - global chat_win - global selsct_win while True: lte = dataCall.getInfo(1, 0) if lte[2][0] == 1: @@ -99,16 +67,16 @@ def ai_task(): extint1.enable() extint2.enable() print('ai task running') + while True: data = rtc_queue.get() print('rtc_queue key event {}'.format(data)) if data == 1: - perform_initialization(chat_win, tiktok) + print('start rtc') + tiktok.active(True) elif data == 2: print('stop rtc') - selsct_win.show() tiktok.active(False) - if __name__ == "__main__": @@ -118,25 +86,17 @@ def ai_task(): sim.setSimDet(1, 1) # 设置按键中断 - extint1 = ExtInt(ExtInt.GPIO13, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, key1, filter_time=50) - extint2 = ExtInt(ExtInt.GPIO12, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, key2, filter_time=50) + extint1 = ExtInt(ExtInt.GPIO45, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, key1, filter_time=50) + extint2 = ExtInt(ExtInt.GPIO46, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, key2, filter_time=50) rtc_queue = Queue() - - # 初始化界面 - selsct_win = SelectWindow() - selsct_win.show() - - chat_win = ChatWindow() # 启动后台任务调度器 scheduler.start() - - print('window show over') tiktok = TiktokRTC(300000, ai_callback) GPIO39 = Pin(PA, Pin.OUT, Pin.PULL_DISABLE, 0) - tiktok.config(volume=6) + tiktok.config(volume=11) print('volume: {}'.format(tiktok.config('volume'))) _thread.start_new_thread(ai_task, ()) diff --git a/code/img/battery/bat_00.png b/code/img/battery/bat_00.png deleted file mode 100644 index b8010e6..0000000 Binary files a/code/img/battery/bat_00.png and /dev/null differ diff --git a/code/img/battery/bat_01.png b/code/img/battery/bat_01.png deleted file mode 100644 index 21c6310..0000000 Binary files a/code/img/battery/bat_01.png and /dev/null differ diff --git a/code/img/battery/bat_02.png b/code/img/battery/bat_02.png deleted file mode 100644 index 2bb73d2..0000000 Binary files a/code/img/battery/bat_02.png and /dev/null differ diff --git a/code/img/battery/bat_03.png b/code/img/battery/bat_03.png deleted file mode 100644 index ed50555..0000000 Binary files a/code/img/battery/bat_03.png and /dev/null differ diff --git a/code/img/battery/bat_04.png b/code/img/battery/bat_04.png deleted file mode 100644 index 26651db..0000000 Binary files a/code/img/battery/bat_04.png and /dev/null differ diff --git a/code/img/battery/bat_05.png b/code/img/battery/bat_05.png deleted file mode 100644 index 5b56a16..0000000 Binary files a/code/img/battery/bat_05.png and /dev/null differ diff --git a/code/img/battery/bat_06.png b/code/img/battery/bat_06.png deleted file mode 100644 index 933f9e3..0000000 Binary files a/code/img/battery/bat_06.png and /dev/null differ diff --git a/code/img/battery/bat_07.png b/code/img/battery/bat_07.png deleted file mode 100644 index 21181ab..0000000 Binary files a/code/img/battery/bat_07.png and /dev/null differ diff --git a/code/img/battery/bat_08.png b/code/img/battery/bat_08.png deleted file mode 100644 index 8a7eb09..0000000 Binary files a/code/img/battery/bat_08.png and /dev/null differ diff --git a/code/img/battery/bat_09.png b/code/img/battery/bat_09.png deleted file mode 100644 index 6a58084..0000000 Binary files a/code/img/battery/bat_09.png and /dev/null differ diff --git a/code/img/image1.png b/code/img/image1.png deleted file mode 100644 index 6d404ff..0000000 Binary files a/code/img/image1.png and /dev/null differ diff --git a/code/img/image1_80.png b/code/img/image1_80.png deleted file mode 100644 index 1364150..0000000 Binary files a/code/img/image1_80.png and /dev/null differ diff --git a/code/img/image2.png b/code/img/image2.png deleted file mode 100644 index 867b316..0000000 Binary files a/code/img/image2.png and /dev/null differ diff --git a/code/img/image2_80.png b/code/img/image2_80.png deleted file mode 100644 index 26340eb..0000000 Binary files a/code/img/image2_80.png and /dev/null differ diff --git a/code/img/signal/signal_00.png b/code/img/signal/signal_00.png deleted file mode 100644 index eb7de6d..0000000 Binary files a/code/img/signal/signal_00.png and /dev/null differ diff --git a/code/img/signal/signal_01.png b/code/img/signal/signal_01.png deleted file mode 100644 index edd3f67..0000000 Binary files a/code/img/signal/signal_01.png and /dev/null differ diff --git a/code/img/signal/signal_02.png b/code/img/signal/signal_02.png deleted file mode 100644 index 4e92430..0000000 Binary files a/code/img/signal/signal_02.png and /dev/null differ diff --git a/code/img/signal/signal_03.png b/code/img/signal/signal_03.png deleted file mode 100644 index ab2ed95..0000000 Binary files a/code/img/signal/signal_03.png and /dev/null differ diff --git a/code/img/signal/signal_04.png b/code/img/signal/signal_04.png deleted file mode 100644 index ea3a891..0000000 Binary files a/code/img/signal/signal_04.png and /dev/null differ diff --git a/code/img/signal/signal_05.png b/code/img/signal/signal_05.png deleted file mode 100644 index 7be8fde..0000000 Binary files a/code/img/signal/signal_05.png and /dev/null differ diff --git a/code/lcd_config.py b/code/lcd_config.py deleted file mode 100644 index 2754245..0000000 --- a/code/lcd_config.py +++ /dev/null @@ -1,129 +0,0 @@ -INIT_RAW_DATA = ( - 2, 0, 120, - 0, 0, 0x11, - 0, 1, 0x36, - 1, 1, 0x00, - # 0, 1, 0x36, - # 1, 1, 0x00, - 0, 1, 0x3A, - 1, 1, 0x05, - 0, 0, 0x21, - 0, 5, 0xB2, - 1, 1, 0x05, - 1, 1, 0x05, - 1, 1, 0x00, - 1, 1, 0x33, - 1, 1, 0x33, - 0, 1, 0xB7, - 1, 1, 0x23, - 0, 1, 0xBB, - 1, 1, 0x22, - 0, 1, 0xC0, - 1, 1, 0x2C, - 0, 1, 0xC2, - 1, 1, 0x01, - 0, 1, 0xC3, - 1, 1, 0x13, - 0, 1, 0xC4, - 1, 1, 0x20, - 0, 1, 0xC6, - 1, 1, 0x0F, - 0, 2, 0xD0, - 1, 1, 0xA4, - 1, 1, 0xA1, - 0, 1, 0xD6, - 1, 1, 0xA1, - 0, 14, 0xE0, - 1, 1, 0x70, - 1, 1, 0x06, - 1, 1, 0x0C, - 1, 1, 0x08, - 1, 1, 0x09, - 1, 1, 0x27, - 1, 1, 0x2E, - 1, 1, 0x34, - 1, 1, 0x46, - 1, 1, 0x37, - 1, 1, 0x13, - 1, 1, 0x13, - 1, 1, 0x25, - 1, 1, 0x2A, - 0, 14, 0xE1, - 1, 1, 0x70, - 1, 1, 0x04, - 1, 1, 0x08, - 1, 1, 0x09, - 1, 1, 0x07, - 1, 1, 0x03, - 1, 1, 0x2C, - 1, 1, 0x42, - 1, 1, 0x42, - 1, 1, 0x38, - 1, 1, 0x14, - 1, 1, 0x14, - 1, 1, 0x27, - 1, 1, 0x2C, - 0, 0, 0x29, - 0, 4, 0x2a, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0xef, - 0, 4, 0x2b, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0x01, - 1, 1, 0x3f, - 0, 0, 0x2c, - -) - -XSTART_H = 0xf0 -XSTART_L = 0xf1 -YSTART_H = 0xf2 -YSTART_L = 0xf3 -XEND_H = 0xE0 -XEND_L = 0xE1 -YEND_H = 0xE2 -YEND_L = 0xE3 - -XSTART = 0xD0 -XEND = 0xD1 -YSTART = 0xD2 -YEND = 0xD3 - - -INIT_DATA = bytearray(INIT_RAW_DATA) - - -INVALID_DATA = bytearray(( - 0, 4, 0x2a, - 1, 1, XSTART_H, - 1, 1, XSTART_L, - 1, 1, XEND_H, - 1, 1, XEND_L, - 0, 4, 0x2b, - 1, 1, YSTART_H, - 1, 1, YSTART_L, - 1, 1, YEND_H, - 1, 1, YEND_L, - 0, 0, 0x2c, -)) - - -DISPLAY_OFF_DATA = bytearray(( - 0, 0, 0x28, - 2, 0, 120, - 0, 0, 0x10, -)) - - -DISPLAY_ON_DATA = bytearray(( - 0, 0, 0x11, - 2, 0, 20, - 0, 0, 0x29, -)) - - -LCD_WIDTH = 240 -LCD_HEIGHT = 240 diff --git a/code/ui.py b/code/ui.py deleted file mode 100644 index 75e334f..0000000 --- a/code/ui.py +++ /dev/null @@ -1,221 +0,0 @@ -from usr import pypubsub as pub -import lvgl as lv -from machine import LCD -from usr.lcd_config import * -from usr.jobs import update_signal, update_time - - -# init lcd -lcd = LCD() -lcd.lcd_init(INIT_DATA, 240, 320, 26000, 1, 4, 0, INVALID_DATA, DISPLAY_ON_DATA, DISPLAY_OFF_DATA, None) - -# init lvgl -lv.init() -# init display driver -disp_buf = lv.disp_draw_buf_t() -buf_length = LCD_WIDTH * LCD_HEIGHT * 2 -disp_buf.init(bytearray(buf_length), None, buf_length) -# disp_buf1.init(bytearray(buf_length), bytearray(buf_length), buf_length) # 双buffer缓冲,占用过多RAM -disp_drv = lv.disp_drv_t() -disp_drv.init() -disp_drv.draw_buf = disp_buf -disp_drv.flush_cb = lcd.lcd_write -disp_drv.hor_res = LCD_WIDTH -disp_drv.ver_res = LCD_HEIGHT -# disp_drv.sw_rotate = 1 # 此处设置是否需要旋转 -# disp_drv.rotated = lv.DISP_ROT._270 # 旋转角度 -disp_drv.register() -# image cache -lv.img.cache_invalidate_src(None) -lv.img.cache_set_size(50) -# start lvgl thread -lv.tick_inc(5) -lv.task_handler() - - -# 创建字体 -arial_12_style = lv.style_t() -arial_12_style.init() -arial_12_style.set_text_color(lv.color_white()) -arial_12_style.set_text_font_v2("arial_12.bin", 18, 0) - - -arial_16_style = lv.style_t() -arial_16_style.init() -arial_16_style.set_text_color(lv.color_white()) -arial_16_style.set_text_font_v2("arial_16.bin", 24, 0) - -arial_22_style = lv.style_t() -arial_22_style.init() -arial_22_style.set_text_color(lv.color_white()) -arial_22_style.set_text_font_v2("arial_22.bin", 33, 0) - - -class SelectWindow(object): - - def __init__(self): - self.obj = lv.obj(None) - self.obj.set_style_bg_color(lv.color_black(), lv.PART.MAIN) - - self.batt = lv.img(self.obj) - self.batt.set_src("U:/img/battery/bat_09.png") - self.batt.align(lv.ALIGN.TOP_RIGHT, -10, 10) - - self.signal = lv.img(self.obj) - self.signal.set_size(16, 16) - self.signal.set_src("U:/img/signal/signal_00.png") - self.signal.align(lv.ALIGN.TOP_LEFT, 10, 10) - self.signal.set_offset_y(-20 * 0) - pub.subscribe("update_signal", lambda level: self.set_signal_level(level)) - update_signal.run() # first update signal - - self.time = lv.label(self.obj) - self.time.set_text("00:00") - self.time.add_style(arial_16_style, lv.PART.MAIN | lv.STATE.DEFAULT) - self.time.align(lv.ALIGN.TOP_MID, 0, 10) - pub.subscribe("update_time", lambda time: self.time.set_text(time)) - update_time.run() # first update time - - self.main_icon = lv.img(self.obj) - self.main_icon.set_src("U:/img/image1_80.png") - self.main_icon.set_size(80, 80) - self.main_icon.align(lv.ALIGN.TOP_RIGHT, -20, 85) - - self.main_icon1 = lv.img(self.obj) - self.main_icon1.set_src("U:/img/image2_80.png") - self.main_icon1.set_size(80, 80) - self.main_icon1.align(lv.ALIGN.TOP_LEFT, 20, 85) - - self.name = lv.label(self.obj) - self.name.add_style(arial_22_style, lv.PART.MAIN | lv.STATE.DEFAULT) - self.name.set_style_text_color(lv.palette_main(lv.PALETTE.BLUE), lv.PART.MAIN | lv.STATE.DEFAULT) - self.name.set_text("Ding") - self.name.align_to(self.main_icon, lv.ALIGN.OUT_TOP_MID, 0, -10) - - self.name = lv.label(self.obj) - self.name.add_style(arial_22_style, lv.PART.MAIN | lv.STATE.DEFAULT) - self.name.set_style_text_color(lv.palette_main(lv.PALETTE.RED), lv.PART.MAIN | lv.STATE.DEFAULT) - self.name.set_text("Wei") - self.name.align_to(self.main_icon1, lv.ALIGN.OUT_TOP_MID, 0, -10) - - self.choose = lv.label(self.obj) - self.choose.add_style(arial_22_style, lv.PART.MAIN | lv.STATE.DEFAULT) - self.choose.set_style_text_color(lv.palette_main(lv.PALETTE.YELLOW), lv.PART.MAIN | lv.STATE.DEFAULT) - self.choose.set_text("Choose her") - self.choose.align_to(self.main_icon1, lv.ALIGN.OUT_BOTTOM_MID, 0, 10) - - self.content = lv.label(self.obj) - self.content.add_style(arial_22_style, lv.PART.MAIN | lv.STATE.DEFAULT) - self.content.set_text("") - self.content.align_to(self.main_icon, lv.ALIGN.OUT_BOTTOM_MID, 0, 10) - - pub.subscribe("update_status", self.update_status) - - def update_status(self, status): - self.content.set_text(status) - self.content.align_to(self.main_icon, lv.ALIGN.OUT_BOTTOM_MID, 0, 10) - - def show(self): - lv.scr_load(self.obj) - - def set_signal_level(self, level): - """level 分 6 档, [0, 5], 其中 0 表示无信号, 5表示满信号""" - self.signal.set_src("U:/img/signal/signal_{:02d}.png".format(level)) - - def set_batt_level(self, level): - """level 分 10 档, [0, 9], 其中 0 表示电池异常馈电, 8表示满电池, 9表示电池充电""" - self.batt.set_src("U:/img/battery/bat_{:02d}.png".format(level)) - def update_status(self, status): - self.content.set_text(status) - self.content.align_to(self.main_icon, lv.ALIGN.OUT_BOTTOM_MID, 0, 10) - - def show(self): - lv.scr_load(self.obj) - - def set_signal_level(self, level): - """level 分 6 档, [0, 5], 其中 0 表示无信号, 5表示满信号""" - self.signal.set_src("U:/img/signal/signal_{:02d}.png".format(level)) - - def set_batt_level(self, level): - """level 分 10 档, [0, 9], 其中 0 表示电池异常馈电, 8表示满电池, 9表示电池充电""" - self.batt.set_src("U:/img/battery/bat_{:02d}.png".format(level)) - - -class ChatWindow(object): - - def __init__(self): - self.obj = lv.obj(None) - self.obj.set_style_bg_color(lv.color_black(), lv.PART.MAIN) - - self.batt = lv.img(self.obj) - self.batt.set_src("U:/img/battery/bat_09.png") - self.batt.align(lv.ALIGN.TOP_RIGHT, -10, 10) - - self.signal = lv.img(self.obj) - self.signal.set_size(16, 16) - self.signal.set_src("U:/img/signal/signal_00.png") - self.signal.align(lv.ALIGN.TOP_LEFT, 10, 10) - self.signal.set_offset_y(-20 * 0) - pub.subscribe("update_signal", lambda level: self.set_signal_level(level)) - update_signal.run() # first update signal - - self.time = lv.label(self.obj) - self.time.set_text("00:00") - self.time.add_style(arial_16_style, lv.PART.MAIN | lv.STATE.DEFAULT) - self.time.align(lv.ALIGN.TOP_MID, 0, 10) - pub.subscribe("update_time", lambda time: self.time.set_text(time)) - update_time.run() # first update time - - self.main_icon = lv.img(self.obj) - self.main_icon.set_src("U:/img/image2.png") - self.main_icon.set_size(128, 128) - self.main_icon.align(lv.ALIGN.CENTER, 0, 10) - - self.name = lv.label(self.obj) - self.name.add_style(arial_22_style, lv.PART.MAIN | lv.STATE.DEFAULT) - self.name.set_style_text_color(lv.palette_main(lv.PALETTE.ORANGE), lv.PART.MAIN | lv.STATE.DEFAULT) - self.name.set_text("Wei") - self.name.align_to(self.main_icon, lv.ALIGN.OUT_TOP_MID, 0, -10) - - self.content = lv.label(self.obj) - self.content.add_style(arial_22_style, lv.PART.MAIN | lv.STATE.DEFAULT) - self.content.set_text("") - self.content.align_to(self.main_icon, lv.ALIGN.OUT_BOTTOM_MID, 0, 10) - - pub.subscribe("update_status", self.update_status) - - def update_status(self, status): - self.content.set_text(status) - self.content.align_to(self.main_icon, lv.ALIGN.OUT_BOTTOM_MID, 0, 10) - - def show(self): - lv.scr_load(self.obj) - - def set_signal_level(self, level): - """level 分 6 档, [0, 5], 其中 0 表示无信号, 5表示满信号""" - self.signal.set_src("U:/img/signal/signal_{:02d}.png".format(level)) - - def set_batt_level(self, level): - """level 分 10 档, [0, 9], 其中 0 表示电池异常馈电, 8表示满电池, 9表示电池充电""" - self.batt.set_src("U:/img/battery/bat_{:02d}.png".format(level)) - def update_status(self, status): - self.content.set_text(status) - self.content.align_to(self.main_icon, lv.ALIGN.OUT_BOTTOM_MID, 0, 10) - - def show(self): - lv.scr_load(self.obj) - - def set_signal_level(self, level): - """level 分 6 档, [0, 5], 其中 0 表示无信号, 5表示满信号""" - self.signal.set_src("U:/img/signal/signal_{:02d}.png".format(level)) - - def set_batt_level(self, level): - """level 分 10 档, [0, 9], 其中 0 表示电池异常馈电, 8表示满电池, 9表示电池充电""" - self.batt.set_src("U:/img/battery/bat_{:02d}.png".format(level)) - - -if __name__ == '__main__': - selsct_win = SelectWindow() - chat_win = ChatWindow() - selsct_win.show() - chat_win.show() \ No newline at end of file diff --git a/docs/zh/media/wire_connection.jpg b/docs/zh/media/wire_connection.jpg index 8d6db0a..2b52b10 100644 Binary files a/docs/zh/media/wire_connection.jpg and b/docs/zh/media/wire_connection.jpg differ diff --git a/nvm/audio_gain.nvm b/nvm/audio_gain.nvm new file mode 100644 index 0000000..0758093 Binary files /dev/null and b/nvm/audio_gain.nvm differ diff --git a/nvm/audio_ve.nvm b/nvm/audio_ve.nvm new file mode 100644 index 0000000..6d8bcb6 Binary files /dev/null and b/nvm/audio_ve.nvm differ diff --git a/readme.md b/readme.md index 113ec77..f075d0a 100644 --- a/readme.md +++ b/readme.md @@ -12,6 +12,7 @@ - [贡献](#贡献) - [许可证](#许可证) - [支持](#支持) +- [致谢](#致谢) ## 介绍 @@ -43,14 +44,9 @@ QuecPython 推出了基于豆包 webRTC 的 AI 聊天机器人解决方案。该 在开始之前,请确保您具备以下先决条件: - **硬件:** - - [EC600MCNLE QuecPython 标准开发板](https://python.quectel.com/doc/Getting_started/zh/evb/ec600x-evb.html)(含天线、Type-C 数据线等) - > - 点击查看开发板的[原理图](https://images.quectel.com/python/2023/05/EC600X_EVB_V3.2-SCH.pdf)和[丝印图](https://images.quectel.com/python/2023/05/EC600X_EVB_V3.2-丝印.pdf)文档。 - > - [移远商城购买链接](https://www.quecmall.com/goods-detail/2c90800c916a8eb501918d85528b017b) + - EC800MCNLE QuecDuino 开发板(含天线、Type-C 数据线等) + > - [点此购买开发板套件](https://www.quecmall.com/goods-detail/2c90800c94028da20194824724370127) - 电脑(Windows 7、Windows 10 或 Windows 11) - - LCD 显示屏 - - 型号:ST7789 - - 分辨率:240×240 - - [移远商城购买链接](https://www.quecmall.com/goods-detail/2c90800b9488359c01951d6700700116) - 喇叭 - 任意 2-5W 功率的喇叭即可 - [移远商城购买链接](https://www.quecmall.com/goods-detail/2c90800c94028da201948249e9f4012d) @@ -58,7 +54,7 @@ QuecPython 推出了基于豆包 webRTC 的 AI 聊天机器人解决方案。该 - **软件:** - QuecPython 模块的 USB 驱动:[QuecPython_USB_Driver_Win10_ASR](https://images.quectel.com/python/2023/04/Quectel_Windows_USB_DriverA_Customer_V1.1.13.zip) - 调试工具 [QPYcom](https://images.quectel.com/python/2022/12/QPYcom_V3.6.0.zip) - - QuecPython [固件](https://github.com/QuecPython/AIChatBot-Volcengine-webRTC/releases/download/v1.0.0/EC600MCNLER06A01M08_OCPU_QPY_TEST0213.zip) + - QuecPython [固件](https://github.com/QuecPython/AIChatBot-Volcengine-webRTC/releases/download/v1.0.1/EC800MCNLER06A08M08_OCPU_QPY_TEST0219.zip) - Python 文本编辑器(例如,[VSCode](https://code.visualstudio.com/)、[Pycharm](https://www.jetbrains.com/pycharm/download/)) ### 安装 @@ -67,6 +63,7 @@ QuecPython 推出了基于豆包 webRTC 的 AI 聊天机器人解决方案。该 ```bash git clone https://github.com/QuecPython/AIChatBot-Volcengine-webRTC.git cd AIChatBot-Volcengine-webRTC + git checkout ec800m-quecduino ``` 2. **安装 USB 驱动** @@ -83,10 +80,9 @@ QuecPython 推出了基于豆包 webRTC 的 AI 聊天机器人解决方案。该 按照下图进行硬件连接: <img src="./docs/zh/media/wire_connection.jpg" style="zoom:67%;" /> 1. 将喇叭连接至图中标识有`SPK+`和`SPK-`的排针上。 - 2. 将 LCD 屏连接至标识有 `LCD` 字样的排针上。 - 3. 在图示位置插入可用的 Nano SIM 卡。 - 4. 将天线连接至标识有`LTE`字样的天线连接座上。 - 5. 使用 Type-C 数据线连接开发板和电脑。 + 2. 在图示位置插入可用的 Nano SIM 卡。 + 3. 将天线连接至标识有`LTE`字样的天线连接座上。 + 4. 使用 Type-C 数据线连接开发板和电脑。 2. **将代码下载到设备:** - 启动 QPYcom 调试工具。 @@ -94,6 +90,8 @@ QuecPython 推出了基于豆包 webRTC 的 AI 聊天机器人解决方案。该 - 按下开发板上的 **PWRKEY** 按钮启动设备。 - 按照[说明](https://python.quectel.com/doc/Application_guide/zh/dev-tools/QPYcom/qpycom-dw.html#%E4%B8%8B%E8%BD%BD%E8%84%9A%E6%9C%AC)将 `code` 文件夹中的所有文件导入到模块的文件系统中,保留目录结构。 +> 注意: 如果需要提高mic的灵敏度,避免说话识别错误,请将 nvm 文件夹下的 audio_gain.nvm 和 audio_ve.nvm 文件导入到模块文件系统的 /usr 目录中。 + 3. **运行应用程序:** - 选择 `File` 选项卡。 - 选择 `ai_main.py` 脚本。 @@ -103,12 +101,11 @@ QuecPython 推出了基于豆包 webRTC 的 AI 聊天机器人解决方案。该 ```python import example >>> example.exec('/usr/ai_main.py') -window show over -volume: 6 +volume: 11 >>> lte network normal ai task running -# 按KEY1键进入智能体 +# 按KEY S3键进入智能体 rtc_queue key event 1 start rtc TIKTOK_RTC_EVENT_START @@ -125,7 +122,7 @@ TIKTOK_RTC_EVENT_TTS_TEXT 你好有什么可以帮到你 TIKTOK_RTC_EVENT_TTS_TEXT 你好有什么可以帮到你的 TIKTOK_RTC_EVENT_TTS_TEXT 你好有什么可以帮到你的吗 -# 按KEY2键退出智能体 +# 按KEY S2键退出智能体 rtc_queue key event 2 stop rtc ``` @@ -154,7 +151,6 @@ solution-AI/ │ └── examples_ai.py ├── docs/zh/media/ │ └── wire_connection.jpg -├── EC600MCNLER06A01M08_OCPU_QPY_TEST0213.zip ├── LICENSE ├── readme.md └── readme_zh.md @@ -176,4 +172,8 @@ solution-AI/ ## 支持 -如果您有任何问题或需要支持,请参阅 [QuecPython 文档](https://python.quectel.com/doc) 或在本仓库中打开一个 issue。 \ No newline at end of file +如果您有任何问题或需要支持,请参阅 [QuecPython 文档](https://python.quectel.com/doc) 或在本仓库中打开一个 issue。 + +## 致谢 + +感谢 [yfpan](https://github.com/kkongling) 对本仓库的贡献,帮助支持了 EC800M QuecDuino 开发板! \ No newline at end of file