当前位置: 首页 > news >正文

【AI智能体】智能音视频-基于乐鑫 ESP32 实现音视频通话

本文介绍如何在乐鑫 ESP32 芯片上实现与智能体音视频通话,你可以选择基于 RTC 实现音视频通话,或基于 WebSocket 实现语音通话。

RTC 音视频通话

乐鑫提供了 esp-adf 示例项目源码,本文将基于该示例项目源码,详细演示如何在乐鑫 ESP32-S3 芯片的 ESP32-S3-Korvo-2 开发板上实现与智能体的音视频通话功能。该开发板适用于开发多种智能产品,包括但不限于音视频通话设备、智能门铃、宠物监控系统、智能音响、儿童玩具以及智能家具面板等。

搭建开发环境

本文基于 esp-adf 示例项目源码进行实现,该仓库已内置稳定版本的 ESP-IDF,无需额外安装。详细的 ESP32-S3 开发环境信息请参见 ESP-IDF 快速入门。

获取示例代码。

在终端创建一个 esp 目录用于存放相关代码。

mkdir ~/esp

    进入 esp 目录并克隆代码。

    cd ~/esp
    git clone https://github.com/espressif/esp-adf.git

      递归更新子模块。

      git submodule update --init --recursive

      在 adf 仓库下运行安装脚本。

      sh ./install.sh
      sh ./export.sh

      配置环境变量,ADF_PATH 和 IDF_PATH 的获取方法请参见 ESP ADF 快速入门。

      ADF_PATH={{你的 adf 路径}}
      IDF_PATH={{你的 idf 路径}}

      适配硬件

      选择开发板

      进入本地 esp-adf 代码的 volc_rtc 目录。

      cd ~/esp/esp-adf/examples/ai_agent/volc_rtc

      设置目标芯片型号,本文使用 esp32s3。

      idf.py set-target esp32s3

      选择开发板。

      idf.py menuconfig

      在弹出的交互界面中选择使用的开发板,本文使用 ESP32-S3-Korvo-2 ,按 S 保存。

      修改 I/O 配置(可选)

      说明:

      如果使用乐鑫官方的 ESP32-S3-Korvo-2 开发板,请忽略该步骤。

      由于本示例使用的 01_RTC_LCD 开发板在视频流和扬声器的针脚与官方 ESP32-S3-Korvo-2 不一致,需修改驱动代码以确保正常运行。

      使用编码 IDE 打开 esp-adf 目录,单击 components/audio_board_board.c 文件。

       

      修改以下内容:

      扬声器 PA 针脚:找到 audio_board_init 函数,将 PA 针脚修改为 TCA9554 的 0 号针脚。将下面的代码替换掉audio_board_init 函数。

      audio_board_handle_t audio_board_init(void)
      {ESP_LOGW(TAG, "Init board Start!");if (board_handle) {ESP_LOGW(TAG, "The board has already been initialized!");return board_handle;}board_handle = (audio_board_handle_t) audio_calloc(1, sizeof(struct audio_board_handle));AUDIO_MEM_CHECK(TAG, board_handle, return NULL);board_handle->audio_hal = audio_board_codec_init();board_handle->adc_hal = audio_board_adc_init();esp_tca9554_config_t pca_cfg = {.i2c_scl = GPIO_NUM_18,.i2c_sda = GPIO_NUM_17,.interrupt_output = -1,};tca9554_init(&pca_cfg);tca9554_set_io_config(BIT(0), TCA9554_IO_OUTPUT);tca9554_set_output_state(BIT(0), TCA9554_IO_HIGH);return board_handle;
      }

        屏幕偏选信号:屏幕型号为 ST7789,触摸 IC 为 GT911。找到 audio_board_lcd_init 函数中的 io_config 对象,将如下代码替换掉io_config中的初始化代码。

        esp_lcd_panel_io_spi_config_t io_config = {.dc_gpio_num = LCD_DC_GPIO,.cs_gpio_num = LCD_CS_GPIO,.pclk_hz = 60 * 1000 * 1000,.lcd_cmd_bits = 8,.lcd_param_bits = 8,.spi_mode = 0,.trans_queue_depth = 10,.on_color_trans_done = cb,.user_ctx = NULL,};

        修改示例项目源码

        你需要修改 esp-adf 示例代码中的 WiFi 信息和扣子配置。

        配置 WiFi 信息。

        在 menuconfig 中,填写 SSID 和 PASSWORD,然后编译下载到开发板中。

        配置扣子。

        在 coze_http_request.h 中修改如下配置:

        参数

        是否必选

        说明

        uri

        必选。

        请填写 https://api.coze.cn/v1/audio/rooms。

        authorization

        必选。

        请填写扣子的访问密钥,用于身份认证与鉴权。

        体验或调试场景:建议开发者生成一个短期的个人访问令牌(PAT),快速跑通 Realtime SDK 的整体流程。个人访问令牌获取方式可参考添加个人访问令牌。

        线上环境:线上环境应使用 OAuth 鉴权方案。OAuth 鉴权方案的详细说明可参考OAuth 应用管理。

        bot_id

        必选。

        智能体 ID,获取方法如下:

        进入智能体的开发页面,开发页面 URL 中 bot 参数后的数字即为智能体 ID。例如, URL 为扣子,则智能体 ID 为73428668*****。

        voice_id

        可选。

        音色 ID。默认采用柔美女友音色,音色 ID 为 7426720361733046281。你可以调用查看音色列表 API 查看当前可用的音色列表,也可以使用系统音色列表。

        修改 HTTP 请求配置。

        说明:

        你也可以自行配置 TLS 证书,配置之后无需修改。

        在 byte_rtc_request.c 文件中,找到 byte_rtc_request 函数中的 http_client_config 变量,将该变量的声明替换为如下的代码:

        esp_http_client_config_t http_client_config = {.url = config->uri,.query = "esp",.event_handler = _http_event_handler,.user_data = &rsp_data,.disable_auto_redirect = true,.buffer_size = DEFAULT_STACK_SIZE,.buffer_size_tx = DEFAULT_STACK_SIZE,.skip_cert_common_name_check = true,.cert_pem = NULL,.transport_type = HTTP_TRANSPORT_OVER_SSL,.crt_bundle_attach = esp_crt_bundle_attach,.is_async = false,.timeout_ms = 10000,.keep_alive_enable = true
        };

        本文介绍如何在乐鑫 ESP32 芯片上实现与智能体音视频通话,你可以选择基于 RTC 实现音视频通话,或基于 WebSocket 实现语音通话。

        RTC 音视频通话

        乐鑫提供了 esp-adf 示例项目源码,本文将基于该示例项目源码,详细演示如何在乐鑫 ESP32-S3 芯片的 ESP32-S3-Korvo-2 开发板上实现与智能体的音视频通话功能。该开发板适用于开发多种智能产品,包括但不限于音视频通话设备、智能门铃、宠物监控系统、智能音响、儿童玩具以及智能家具面板等。

        搭建开发环境

        本文基于 esp-adf 示例项目源码进行实现,该仓库已内置稳定版本的 ESP-IDF,无需额外安装。详细的 ESP32-S3 开发环境信息请参见 ESP-IDF 快速入门。

        获取示例代码。

        在终端创建一个 esp 目录用于存放相关代码。

        mkdir ~/esp

          进入 esp 目录并克隆代码。

          cd ~/esp
          git clone https://github.com/espressif/esp-adf.git

            递归更新子模块。

            git submodule update --init --recursive

            在 adf 仓库下运行安装脚本。

            sh ./install.sh
            sh ./export.sh

            配置环境变量,ADF_PATH 和 IDF_PATH 的获取方法请参见 ESP ADF 快速入门。

            ADF_PATH={{你的 adf 路径}}
            IDF_PATH={{你的 idf 路径}}

            适配硬件

            选择开发板

            进入本地 esp-adf 代码的 volc_rtc 目录。

            cd ~/esp/esp-adf/examples/ai_agent/volc_rtc

            设置目标芯片型号,本文使用 esp32s3。

            idf.py set-target esp32s3

            选择开发板。

            idf.py menuconfig

            在弹出的交互界面中选择使用的开发板,本文使用 ESP32-S3-Korvo-2 ,按 S 保存。

            修改 I/O 配置(可选)

            如果使用乐鑫官方的 ESP32-S3-Korvo-2 开发板,请忽略该步骤。

            由于本示例使用的 01_RTC_LCD 开发板在视频流和扬声器的针脚与官方 ESP32-S3-Korvo-2 不一致,需修改驱动代码以确保正常运行。

            使用编码 IDE 打开 esp-adf 目录,单击 components/audio_board_board.c 文件。

             

            修改以下内容:

            扬声器 PA 针脚:找到 audio_board_init 函数,将 PA 针脚修改为 TCA9554 的 0 号针脚。将下面的代码替换掉audio_board_init 函数。

            audio_board_handle_t audio_board_init(void)
            {ESP_LOGW(TAG, "Init board Start!");if (board_handle) {ESP_LOGW(TAG, "The board has already been initialized!");return board_handle;}board_handle = (audio_board_handle_t) audio_calloc(1, sizeof(struct audio_board_handle));AUDIO_MEM_CHECK(TAG, board_handle, return NULL);board_handle->audio_hal = audio_board_codec_init();board_handle->adc_hal = audio_board_adc_init();esp_tca9554_config_t pca_cfg = {.i2c_scl = GPIO_NUM_18,.i2c_sda = GPIO_NUM_17,.interrupt_output = -1,};tca9554_init(&pca_cfg);tca9554_set_io_config(BIT(0), TCA9554_IO_OUTPUT);tca9554_set_output_state(BIT(0), TCA9554_IO_HIGH);return board_handle;
            }

              屏幕偏选信号:屏幕型号为 ST7789,触摸 IC 为 GT911。找到 audio_board_lcd_init 函数中的 io_config 对象,将如下代码替换掉io_config中的初始化代码。

              esp_lcd_panel_io_spi_config_t io_config = {.dc_gpio_num = LCD_DC_GPIO,.cs_gpio_num = LCD_CS_GPIO,.pclk_hz = 60 * 1000 * 1000,.lcd_cmd_bits = 8,.lcd_param_bits = 8,.spi_mode = 0,.trans_queue_depth = 10,.on_color_trans_done = cb,.user_ctx = NULL,};

              修改示例项目源码

              你需要修改 esp-adf 示例代码中的 WiFi 信息和扣子配置。

              配置 WiFi 信息。

              在 menuconfig 中,填写 SSID 和 PASSWORD,然后编译下载到开发板中。

              配置扣子。

              在 coze_http_request.h 中修改如下配置:

              参数

              是否必选

              说明

              uri

              必选。

              请填写 https://api.coze.cn/v1/audio/rooms。

              authorization

              必选。

              请填写扣子的访问密钥,用于身份认证与鉴权。

              体验或调试场景:建议开发者生成一个短期的个人访问令牌(PAT),快速跑通 Realtime SDK 的整体流程。个人访问令牌获取方式可参考添加个人访问令牌。

              线上环境:线上环境应使用 OAuth 鉴权方案。OAuth 鉴权方案的详细说明可参考OAuth 应用管理。

              bot_id

              必选。

              智能体 ID,获取方法如下:

              进入智能体的开发页面,开发页面 URL 中 bot 参数后的数字即为智能体 ID。例如, URL 为扣子,则智能体 ID 为73428668*****。

              voice_id

              可选。

              音色 ID。默认采用柔美女友音色,音色 ID 为 7426720361733046281。你可以调用查看音色列表 API 查看当前可用的音色列表,也可以使用系统音色列表。

              修改 HTTP 请求配置。

              你也可以自行配置 TLS 证书,配置之后无需修改。

              在 byte_rtc_request.c 文件中,找到 byte_rtc_request 函数中的 http_client_config 变量,将该变量的声明替换为如下的代码:

              esp_http_client_config_t http_client_config = {.url = config->uri,.query = "esp",.event_handler = _http_event_handler,.user_data = &rsp_data,.disable_auto_redirect = true,.buffer_size = DEFAULT_STACK_SIZE,.buffer_size_tx = DEFAULT_STACK_SIZE,.skip_cert_common_name_check = true,.cert_pem = NULL,.transport_type = HTTP_TRANSPORT_OVER_SSL,.crt_bundle_attach = esp_crt_bundle_attach,.is_async = false,.timeout_ms = 10000,.keep_alive_enable = true
              };

              本文介绍如何在乐鑫 ESP32 芯片上实现与智能体音视频通话,你可以选择基于 RTC 实现音视频通话,或基于 WebSocket 实现语音通话。

              RTC 音视频通话

              乐鑫提供了 esp-adf 示例项目源码,本文将基于该示例项目源码,详细演示如何在乐鑫 ESP32-S3 芯片的 ESP32-S3-Korvo-2 开发板上实现与智能体的音视频通话功能。该开发板适用于开发多种智能产品,包括但不限于音视频通话设备、智能门铃、宠物监控系统、智能音响、儿童玩具以及智能家具面板等。

              搭建开发环境

              本文基于 esp-adf 示例项目源码进行实现,该仓库已内置稳定版本的 ESP-IDF,无需额外安装。详细的 ESP32-S3 开发环境信息请参见 ESP-IDF 快速入门。

              获取示例代码。

              在终端创建一个 esp 目录用于存放相关代码。

              mkdir ~/esp

                进入 esp 目录并克隆代码。

                cd ~/esp
                git clone https://github.com/espressif/esp-adf.git

                  递归更新子模块。

                  git submodule update --init --recursive

                  在 adf 仓库下运行安装脚本。

                  sh ./install.sh
                  sh ./export.sh

                  配置环境变量,ADF_PATH 和 IDF_PATH 的获取方法请参见 ESP ADF 快速入门。

                  ADF_PATH={{你的 adf 路径}}
                  IDF_PATH={{你的 idf 路径}}

                  适配硬件

                  选择开发板

                  进入本地 esp-adf 代码的 volc_rtc 目录。

                  cd ~/esp/esp-adf/examples/ai_agent/volc_rtc

                  设置目标芯片型号,本文使用 esp32s3。

                  idf.py set-target esp32s3

                  选择开发板。

                  idf.py menuconfig

                  在弹出的交互界面中选择使用的开发板,本文使用 ESP32-S3-Korvo-2 ,按 S 保存。

                  修改 I/O 配置(可选)

                  如果使用乐鑫官方的 ESP32-S3-Korvo-2 开发板,请忽略该步骤。

                  由于本示例使用的 01_RTC_LCD 开发板在视频流和扬声器的针脚与官方 ESP32-S3-Korvo-2 不一致,需修改驱动代码以确保正常运行。

                  使用编码 IDE 打开 esp-adf 目录,单击 components/audio_board_board.c 文件。

                   

                  修改以下内容:

                  扬声器 PA 针脚:找到 audio_board_init 函数,将 PA 针脚修改为 TCA9554 的 0 号针脚。将下面的代码替换掉audio_board_init 函数。

                  audio_board_handle_t audio_board_init(void)
                  {ESP_LOGW(TAG, "Init board Start!");if (board_handle) {ESP_LOGW(TAG, "The board has already been initialized!");return board_handle;}board_handle = (audio_board_handle_t) audio_calloc(1, sizeof(struct audio_board_handle));AUDIO_MEM_CHECK(TAG, board_handle, return NULL);board_handle->audio_hal = audio_board_codec_init();board_handle->adc_hal = audio_board_adc_init();esp_tca9554_config_t pca_cfg = {.i2c_scl = GPIO_NUM_18,.i2c_sda = GPIO_NUM_17,.interrupt_output = -1,};tca9554_init(&pca_cfg);tca9554_set_io_config(BIT(0), TCA9554_IO_OUTPUT);tca9554_set_output_state(BIT(0), TCA9554_IO_HIGH);return board_handle;
                  }

                    屏幕偏选信号:屏幕型号为 ST7789,触摸 IC 为 GT911。找到 audio_board_lcd_init 函数中的 io_config 对象,将如下代码替换掉io_config中的初始化代码。

                    esp_lcd_panel_io_spi_config_t io_config = {.dc_gpio_num = LCD_DC_GPIO,.cs_gpio_num = LCD_CS_GPIO,.pclk_hz = 60 * 1000 * 1000,.lcd_cmd_bits = 8,.lcd_param_bits = 8,.spi_mode = 0,.trans_queue_depth = 10,.on_color_trans_done = cb,.user_ctx = NULL,};

                    修改示例项目源码

                    你需要修改 esp-adf 示例代码中的 WiFi 信息和扣子配置。

                    配置 WiFi 信息。

                    在 menuconfig 中,填写 SSID 和 PASSWORD,然后编译下载到开发板中。

                    配置扣子。

                    在 coze_http_request.h 中修改如下配置:

                    参数

                    是否必选

                    说明

                    uri

                    必选。

                    请填写 https://api.coze.cn/v1/audio/rooms。

                    authorization

                    必选。

                    请填写扣子的访问密钥,用于身份认证与鉴权。

                    体验或调试场景:建议开发者生成一个短期的个人访问令牌(PAT),快速跑通 Realtime SDK 的整体流程。个人访问令牌获取方式可参考添加个人访问令牌。

                    线上环境:线上环境应使用 OAuth 鉴权方案。OAuth 鉴权方案的详细说明可参考OAuth 应用管理。

                    bot_id

                    必选。

                    智能体 ID,获取方法如下:

                    进入智能体的开发页面,开发页面 URL 中 bot 参数后的数字即为智能体 ID。例如, URL 为扣子,则智能体 ID 为73428668*****。

                    voice_id

                    可选。

                    音色 ID。默认采用柔美女友音色,音色 ID 为 7426720361733046281。你可以调用查看音色列表 API 查看当前可用的音色列表,也可以使用系统音色列表。

                    修改 HTTP 请求配置。

                    你也可以自行配置 TLS 证书,配置之后无需修改。

                    在 byte_rtc_request.c 文件中,找到 byte_rtc_request 函数中的 http_client_config 变量,将该变量的声明替换为如下的代码:

                    esp_http_client_config_t http_client_config = {.url = config->uri,.query = "esp",.event_handler = _http_event_handler,.user_data = &rsp_data,.disable_auto_redirect = true,.buffer_size = DEFAULT_STACK_SIZE,.buffer_size_tx = DEFAULT_STACK_SIZE,.skip_cert_common_name_check = true,.cert_pem = NULL,.transport_type = HTTP_TRANSPORT_OVER_SSL,.crt_bundle_attach = esp_crt_bundle_attach,.is_async = false,.timeout_ms = 10000,.keep_alive_enable = true
                    };

                    创建并加入扣子房间。

                    你需要调用扣子的创建房间接口创建房间,再加入房间,才可以与智能体进行对话。在乐鑫示例代码的 volc_rtc.c 文件中已经实现了创建房间的代码,在实际使用的时候,你需要执行如下操作才能使用相关代码。

                    声明一个全局变量。

                    const char* g_default_room_id = NULL;  // 定义全局变量

                      修改文件中的byte_rtc_engine_create方法,引入请求扣子的代码,并使用扣子返回的 app_id 创建 RTC 引擎。

                       

                        使用扣子返回的 room_id 赋值给全局变量 g_default_room_id 。

                         

                          在voice_read_task方法中,用扣子返回的 room_id 指定对话时的 room_id。

                          byte_rtc_send_audio_data(s_volc_rtc.engine, g_default_room_id, voice_data, voice_data_read_sz, &audio_frame_info);

                          WebSocket 语音通话

                          乐鑫推出基于扣子 WebSocket 封装的轻量级 Espressif Coze SDK,能在 ESP32 嵌入式设备上接入扣子 WebSocket Open API,实现语音通话,具体请参见 Espressif Coze 官网,示例项目源码请参见 esp_websocket_client 示例项目源码。

                          相关文档

                          集成音视频 Realtime 嵌入式 SDK

                          硬件设备基于 WebSocket 实现语音交互

                          http://www.dtcms.com/a/269788.html

                          相关文章:

                        1. ICML 2025 | TimeBridge : 巧妙化解非平稳性难题,精准预测长短结合!
                        2. Redis:高性能内存数据库与缓存利器
                        3. 验证KANO问题时合适的行为指标(如点击率、转化率等)来匹配问卷目标的一些尝试
                        4. 【论文翻译】用于大感受野的小波卷积 Wavelet Convolutions for Large Receptive Fields
                        5. 一天一道Sql题(day01)
                        6. Java武林:虚拟机之道 第二章:心法传承 - 类加载机制
                        7. three案例 Three.js波纹效果演示
                        8. “Jmeter中 xxx.jtl:1:1: Fatal Error! 前言中不允许有内容”的解决办法
                        9. 开源 SIP 协议栈介绍
                        10. INNER JOIN, LEFT JOIN, RIGHT JOIN 的区别
                        11. 字节面试被问到“手机号存储选 Int 还是 String”!
                        12. 区块链技术促进算力生态发展的具体案例
                        13. Python 机器学习核心入门与实战进阶 Day 6 - 模型保存与加载(joblib / pickle)
                        14. 2025年Linux安装MySQL详细教程
                        15. mysql-笔记
                        16. 服务器经常出现蓝屏是什么原因导致的?如何排查和修复?
                        17. Nature子刊:EPFL-ANU团队实现晶格对称性编程手性,双通道光学加密动态范围创1.6新高
                        18. Element-Plus-全局自动引入图标组件,无需每次import
                        19. 集群与集群应用
                        20. 东南亚主播解决方案|东南亚 TikTok 直播专线:纯净住宅 IP 、直播不卡顿
                        21. Spring自动装配(xml)
                        22. 芯片之后,AI之争的下一个战场是能源?
                        23. 小架构step系列08:logback.xml的配置
                        24. 知识库中如何确实嵌入文本块大小?语义完整性与检索颗粒度的平衡机制
                        25. 聊一聊软件架构师
                        26. C++排序算法全解析(加强版)
                        27. 单调栈通关指南:从力扣 84 到力扣 42
                        28. 前端技术小结
                        29. Android Jetpack Compose状态管理与状态提升
                        30. linux安装CUDA