9.7 KiB
Raw Blame History

卡皮巴拉触摸玩偶

例程简介

ESP-Spot 体积小巧,内置扬声器、麦克风和电池,可轻松嵌入毛绒玩具中,让智能玩具“活”起来!本次 Demo 视频重点展示了如何将扣子智能语音对话与 ESP32-S3 触摸传感器结合,打造一款真正具有“情感交互”的 AI 玩具。

视频展示

用触摸交互升级大模型 AI 玩具【ESP-SPOT】

视频包含组装过程、成品演示、以及原理讲解

硬件接线

ESP-Spot 上板也可作为一块带音频的 ESP32 开发板单独使用VIN 可以允许 3.3->5V 供电,如果需要默认使能 3V3 电源域,请将 VBUS 上拉VBAT 接 3.3V。

注意:当 PREP_VCC_CTL 引脚GPIO6 拉高时 CODEC_3V3 使能,音频编解码芯片工作。 也就是说,只有当 GPIO6 拉高时,音频功能才会正常工作

引脚布局如下

ESP32-S3 模组自带触摸传感器功能,技术细节请参考::ESP32-S3 数据手册

预备知识

获取扣子账号

更多触摸交互逻辑

  • 目前的触摸交互逻辑是:通过触摸对应部位,播放预设的音频内容或调用对应的应用逻辑
  • 后续可升级为:通过触摸触发不同的事件,并发送至大模型进行处理,实现更智能、更加丰富的语音交互体验。详情请参考 Coze 文档:手动提交对话内容

本地音频

  • 本例程在 /tools/audio_tone.bin/components/audio_flash_tone/ 目录下已经帮助用户生成了例程所需的 bin 文件和音频文件在 flash 中地址的源代码文件。

  • 如果用户需要生成自己的 audio_tone.bin,则需要执行 mk_audio_bin.py 脚本(位于 $ADF_PATH/tools/audio_tone/mk_audio_tone.py并且指定相关文件的路径。

  • 源 MP3 文件在 tone_mp3_folder 文件夹中,生成的 C 文件、H 文件以及二进制 bin 文件都存放在此目录下。

    python3 $ADF_PATH/tools/audio_tone/mk_audio_tone.py -f ./ -r tone_mp3_folder
    
  • 请使用 python3 $ADF_PATH/tools/audio_tone/mk_audio_tone.py --help 查看更多脚本信息。

  • 本例程默认的 audio_tone.bin 包含如下音频文件:

       "flash://tone/0_belly_1.mp3",
       "flash://tone/1_belly_2.mp3",
       "flash://tone/2_belly_3.mp3",
       "flash://tone/3_belly_4.mp3",
       "flash://tone/4_bread_1.mp3",
       "flash://tone/5_bread_2.mp3",
       "flash://tone/6_capybara_song_1.mp3",
       "flash://tone/7_hat_1.mp3",
       "flash://tone/8_neck_1.mp3",
       "flash://tone/9_neck_2.mp3",
       "flash://tone/10_reverse.mp3",
       "flash://tone/11_screaming.mp3",
       "flash://tone/12_shake.mp3",
       "flash://tone/13_touch_nose.mp3",
       "flash://tone/14_woohoo.mp3",
    
  • 本地音频在 partition_flash_tone.csv 中地址配置如下,用户可以根据自己的项目 flash 分区灵活配置地址:

    flashTone,data,  0x04,  0x720000 , 500K,
    

动作和姿态识别

  • 硬件方面采用 BMI270 传感器,用于识别不同的动作和姿态,后续将提供优化后的 BMI270 固件,以实现更精确、稳定的动作识别

IDF 默认分支

  • 本例程支持 IDF release/v5.4 及以后的分支。

配置工程

开发板

  • 默认使用搭载 ESP32-S3 模组的 ESP-SPOT 开发板,配置项为 CONFIG_ESP32_S3_SPOT_BOARD=y
  • 硬件初始化代码位于本仓库中的 example/adf/components/audio_board ,编译前将其替换掉 ADF 路径中的 $ADF_PATH/components/audio_board

音频文件

  • 如果 MP3 音频总数量大于 9,则需要修改 $ADF_PATH/components/audio_stream 目录下的 tone_stream.c 文件,可以直接使用本仓库中的 example/adf/components/tone_stream.c 替换 ADF 路径下的原文件
  • 本仓库的中的 tone_stream.c 改了什么:将 _tone_open(audio_element_handle_t self) 函数中 char find_num[2] 数组的长度修改为 char find_num[3]。这样可以确保函数在解析双位数的音频文件名(例如 10.mp3、11.mp3时不会发生字符串截断错误正确识别全部音频文件

触摸功能

  • 本例程默认使用 GPIO 3、9、13、14 引脚作触摸,分别对应卡皮巴拉玩偶的不同部位,触发不同的语音交互功能:

    • GPIO3鼻子短按触发一种语音交互长按触发另一种语音交互。
    • GPIO9帽子第一次按下触发语音对话第二次按下播放《卡皮巴拉之歌》并点亮灯环。
    • GPIO13肚子每次按下依次切换到下一阶段的语音交互共有五种不同交互。
    • GPIO14脖子作为开启/关闭大模型语音交互的总开关。
  • 如需更换触摸引脚,请在 main.c 中修改 TOUCH_CHANNEL_1 及相关宏定义。注意参考 ESP32-S3 数据手册 选择支持触摸功能的 IO

  • 触摸灵敏度可通过以下宏定义进行调整,阈值越小,感应越灵敏:

    • LIGHT_TOUCH_THRESHOLD:设置轻触的触发阈值。
    • HEAVY_TOUCH_THRESHOLD:设置重触的触发阈值。
  • 短按和长按的判定时间可在 touch_task 中进行配置

    const button_config_t btn_cfg = {
          .short_press_time = 300,       // 触发短按时长ms
          .long_press_time = 2000,       // 触发长按时长ms
       };
    

LED 灯环

  • 本例程使用 WS2812 灯环,相关配置如下:
    • CONFIG_LED_GPIO_INPUT:控制灯环的引脚,默认为 GPIO45,可通过 idf.py menuconfig 进行配置
    • CONFIG_LED_COUNT:用于设置灯环的 LED 数量,默认为 16 个,同样可在 idf.py menuconfig 中进行配置

扣子大模型鉴权

  • 将获取到的 Access tokenBOT ID 信息填入 Menuconfig->Example Configuration 中。Access token 默认是以 pat_ 开头的

Wi-Fi 信息

  • 將 wifi 信息填入 Menuconfig->>Example Configuration

编译和下载

请先编译版本并烧录到开发板上,然后运行 monitor 工具来查看串口输出(替换 PORT 为端口名称):

idf.py -p PORT flash monitor

此外,本例程还需烧录 /tools/audio_tone.binpartition_flash_tone.csvflashTone 分区,请使用如下命令:

esptool.py --chip esp32s3 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x720000 ./tools/audio_tone.bin

有关配置和使用 ESP-IDF 生成项目的完整步骤,请参阅 《ESP-IDF 编程指南》

如何使用

功能和用法

  • 例程开始运行后,如果事前没有烧录 /tools/audio_tone.binpartition_flash_tone.csv flashTone 分区,例程将会报错,请参考 编译和下载 的说明进行烧录

故障排除

  • 如果遇到下方错误,请把按照 编译和下载 的说明烧录 /tools/audio_tone.binpartition_flash_tone.csv flashTone 分区。

    E (481) TONE_PARTITION: Not flash tone partition
    E (481) AUDIO_ELEMENT: [tone] AEL_STATUS_ERROR_OPEN,-1
    W (491) AUDIO_ELEMENT: [tone] audio_element_on_cmd_error,7
    E (501) TONE_PARTITION: /repo/adfs/bugfix/esp-adf-internal/components/tone_partition/tone_partition.c:204 (tone_partition_deinit): Got NULL Pointer
    W (511) AUDIO_ELEMENT: IN-[mp3] AEL_IO_ABORT
    E (511) MP3_DECODER: failed to read audio data (line 119)
    W (521) AUDIO_ELEMENT: [mp3] AEL_IO_ABORT, -3
    W (531) AUDIO_ELEMENT: IN-[i2s] AEL_IO_ABORT
    
  • 如果遇到下方错误,通常是由于网络波动导致数据未能及时上传。此时可以尝试更换网络,或通过配置参数提升 ESP32-S3 的 Wi-Fi 性能。具体优化方法可参考乐鑫官方文档:如何提高 Wi-Fi 性能。当前上传使用的音频格式为 PCM,扣子即将支持 Opus 编码格式,可有效降低带宽占用

    E (144192) coze_chat: Audio data send to queue failed
    E (144222) coze_chat: Audio data send to queue failed
    E (144243) coze_chat: Audio data send to queue failed
    E (144267) coze_chat: Audio data send to queue failed
    E (144288) coze_chat: Audio data send to queue failed
    E (144309) coze_chat: Audio data send to queue failed
    E (144347) coze_chat: Audio data send to queue failed
    E (144368) coze_chat: Audio data send to queue failed
    E (144399) coze_chat: Audio data send to queue failed
    

技术支持

请按照下面的链接获取技术支持:

我们会尽快回复。