一、效果演示
EPS-SPARKBOT 对话效果演示
二、配置ASR/TTS/LLM
注册并登录 百度智能云-登录 ,必须进行实名认证,才能领取免费使用额度。
1、ASR/TTS
搜索语音技术,获取 API Key 与 Secret Key,调用 API 获取 ACCESS_TOKEN, 直达链接 百度智能云控制台。
点击同意协议,然后创建应用,
应用名称和描述可以随便填,服务接口必须勾选语音识别与语音合成,
创建完成之后,页面会显示 API Key 和 Secret Key,此时复制保持下来,
创建好的应用可以在应用列表查询到,
最后我们参考 https://ai.baidu.com/ai-doc/REFERENCE/Lkru0zoz4#%E6%A6%82%E8%BF%B0 获取 access token,Linux 下可以直接执行以下命令,记得替换对于的 Key。
curl -X POST 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key ]&client_secret=[Secret Key]' -H 'Content-Type: application/json'
2、LLM
直接搜索 千帆 ModelBuilder ,获取 API Key 与 Secret Key,调用 API 获取 ACCESS_TOKEN,
预置服务中有写可以免费使用的模型,我们使用的是 ERNIE-Lite-8K 模型,参考文档ERNIE-Lite-8K - ModelBuilder,同样的,我们需要创建应用,但是需要注意固件使用的是旧版本接口,
创建完之后,我们在该页面获取到 API Key 和 Secret Key,
接着调用以下指令获取 access token,记得替换对于的 Key 值,
curl -X POST 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key ]&client_secret=[Secret Key]' -H 'Content-Type: application/json'
三、获取天气 API TOKEN
登录 和风天气开发服务 ~ 强大、丰富的天气数据服务,创建一个免费的项目即可,
把创建好的API KEY 记录下来,等会配置时需要使用。
四、克隆固件源码
git clone https://gitee.com/esp-friends/esp_sparkbot.git
五、编译烧录固件
这里我使用的 ESP-IDF 版本是 5.4.0,官方使用的版本是 5.2.3,参考官方文档 固件烧录指南
1、设置芯片
idf.py set-target esp32s3
2、配置 menuconfig
idf.py menuconfig
输入指令,回车,进入配置页面,
按下 shift 旁边的 “/” 按键进入搜索,输入 bmi,
可以看到目前使用的是 BMI220 姿态传感器芯片,当前我使用的是 BMI270 芯片,所以这里需要按一下方向键↓,然后回车,
设置完毕,按 esc 回退到主菜单,接下来设置三个 token 和配网,选中 Example Configuration,回车进入配置页面,
第一个配置百度语音识别 token,第二个配置百度大模型 token,第三个配置天气 token,第四第五配置联网的 wifi 和密码,
- BAIDU_AUDIO_ACCESS_TOKEN:百度音频服务的 ACCESS_TOKEN,通过百度控制台中的语音技术的 API Key 和 Secret Key 申请,详情参考:获取 access_token
- BAIDU_LLM_ACCESS_TOKEN:大语言模型服务的 ACCESS_TOKEN,通过百度控制台中的大语言模型应用的 API Key 和 Secret Key 申请,详情参考:获取 access_token。 注意:大语言模型和语音服务使用的是两种不同的 access_token
- QWEATHER_REQUEST_KEY:和风天气的 request key, 用于在桌面钟界面显示天气和温度信息
- EXAMPLE_WIFI_SSID:连接 Wi-Fi 的 SSID
- EXAMPLE_WIFI_PASSWORD:连接 Wi-Fi 的密码
可以通过 idf.py menuconfig 手动配置上方参数,也可以直接在 Kconfig.projbuild 中修改 default 值 注意:如果 sdkconfig 文件已经生成,则 Kconfig.projbuild 不再生效。可以删除 sdkconfig 或运行 idf.py menuconfig 指令修改。
输入真正的 token 之后回车保存,直到所有配置都配置完毕,一直按 esc 键返回,最后按 y 键确认配置,
注意:百度的 token 有效期是 30 天,过期后需要重新获取 token
3、编译
idf.py build
4、一键烧录
要先确认设备的串口号,可以用这个命令,
ls /dev/tty*
此时,未给设备上电,因此还没串口号,接下来按住 boot 键再接电源,
刷出串口号 /dev/ttyACM0 就是设备的串口号,为了避免权限问题,先赋权,
sudo chmod 777 /dev/ttyACM0
最后输入烧录指令,
idf.py -p /dev/ttyACM0 flash monitor
从控制台日志中可以看到,烧录完成,并且网络和 api 调用都正常。如果编译完成后显示“waiting for download...” 则需要重启设备。至此,烧录完成,可以愉快玩耍了!
彩蛋:固件代码精简
1、去掉 BMI270 传感器
在 main/app_main.c 中注释以下代码,
app_imu_init();
2、去掉 FPC 触屏按钮
在 main/app_main.c 中注释以下代码,
bsp_touch_button_create(button_handler);
/* Create GPIO button */
button_config_t gpio_btn_cfg = {
.type = BUTTON_TYPE_GPIO,
.long_press_time = CONFIG_BUTTON_LONG_PRESS_TIME_MS,
.short_press_time = CONFIG_BUTTON_SHORT_PRESS_TIME_MS,
.gpio_button_config = {
.gpio_num = 0,
.active_level = 0,
},
};
button_handle_t gpio_btn = iot_button_create(&gpio_btn_cfg);
if (NULL == gpio_btn) {
ESP_LOGE(TAG, "Button create failed");
}
iot_button_register_cb(gpio_btn, BUTTON_LONG_PRESS_START, button_long_press_cb, NULL);
3、去掉摄像头
在 main/app_main.c 中注释以下代码,
const camera_config_t camera_config = BSP_CAMERA_DEFAULT_CONFIG;
err = esp_camera_init(&camera_config);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Camera Init Failed");
return;
}
sensor_t *s = esp_camera_sensor_get();
s->set_vflip(s, BSP_CAMERA_VFLIP);
s->set_hmirror(s, BSP_CAMERA_HMIRROR);
ESP_LOGI(TAG, "Camera Init done");
4、减少 LGVL UI
修改 main/ui/ui.c 中的 ui_init 函数,全局变量 ui_pages 对应调整, .c 和 .h 文件都需要改,
补充:FPC 切屏原理
Step1、ui 中使用 xQueueCreate 创建队列,使用 xQueueSend 往队列中发送事件。
Step2、使用 lv_timer_create 创建定时器,绑定事件函数 ui_system_update ,函数中使用 xQueueReceive 从队列中读取事件,每读取到一个事件后,根据传参调用 lv_event_send 开始 lvgl 页面渲染。
Step3、main/app/app_audio_record.c 中捕获唤醒词进行切屏,ASR/TTS/LLM核心逻辑也在这里