从零到一:ESP32与豆包大模型的RTC连续对话实现指南
一、对话效果演示
ESP32与豆包大模型的RTC连续对话
二、ESP-ADF 介绍
乐鑫 ESP-ADF(Espressif Audio Development Framework)是乐鑫科技(Espressif Systems)专为 ESP32 系列芯片开发的一款音频开发框架。它旨在简化基于 ESP32 芯片的音频应用的开发,提供丰富的音频功能和工具,帮助开发者快速构建高质量的音频产品。
1、主要特点
1.1、跨平台支持
ESP-ADF 支持多种操作系统,包括 FreeRTOS 和 Linux,适用于不同的开发环境。
1.2、丰富的音频功能
- 支持多种音频格式(如 MP3、AAC、WAV、FLAC、OPUS 等)的解码和编码。
- 提供音频流处理功能,支持网络流媒体(如 HTTP、HLS、RTSP)和本地文件播放。
- 支持音频效果处理,如均衡器、混音、回声消除等。
1.3、模块化设计
ESP-ADF 采用模块化设计,开发者可以根据需求灵活选择功能模块,降低开发复杂度。
1.4、易于集成
提供丰富的 API 和示例代码,方便开发者快速上手并集成到现有项目中。
1.5、支持多种外设
- 支持 I2S、PWM、DAC 等音频接口。
- 兼容多种麦克风、扬声器和音频编解码器。
1.6、低功耗设计
针对 ESP32 的低功耗特性优化,适合电池供电的音频设备。
2、主要组件
2.1、音频管道(Audio Pipeline)
提供音频数据流的处理框架,支持多路音频流的混合和处理。
2.2、音频编解码器(Codec)
支持多种音频格式的编解码,方便处理不同来源的音频数据。
2.3、音频流(Stream)
支持从网络、本地文件或外设获取音频数据。
2.4、音频效果(Effect)
提供音频效果处理功能,如均衡器、混音、回声消除等。
2.5、音频服务(Service)
提供高级音频服务,如语音助手集成、语音识别等。
3、应用场景
ESP-ADF 适用于多种音频应用场景,包括:
- 智能音箱和语音助手
- 网络音频播放器
- 蓝牙音频设备
- 录音设备
- 语音识别和语音控制设备
三、安装 ESP-ADF 框架
Step1、克隆仓库源码
# git clone --recursive https://github.com/espressif/esp-adf.git
git clone --recursive https://gitee.com/EspressifSystems/esp-adf.git

执行“recursive”更新失败,是因为 github 网络问题,此时需要使用工具仓库 esp-gitee-tools,可以参照 Linux下ESP32开发环境搭建:新手也能轻松上手_esp32 linux环境搭建-CSDN博客,

Step2、配置 ESP-IDF 与 ESP-ADF
cd esp-adf
./install.sh
. ./export.sh

如果在安装时,又遇到网络问题,可以把下载链接直接复制到其他软件进行下载,然后拷贝到 /home/sam/.espressif/dist/ 这个路径下,重新执行安装脚本,

这样子太麻烦了,实际上官方文档中有解决方案,
export IDF_GITHUB_ASSETS="dl.espressif.cn/github_assets"

可以看到使用了镜像地址之后下载速度一下子就提升了,

接着配置环境变量,
sudo vim ~/.bashrc
# export ADF_PATH=/data/home/sam/MyWorkSpace/esp-adf
# export IDF_PATH=/data/home/sam/MyWorkSpace/esp-adf/esp-idf
source ~/.bashrc

. ./export.sh

至此,环境搭建完毕。注意,这仅对当前命令窗口有效,如果新开了窗口,则需要重新执行脚本,因此我们可以为脚本导入一个别名,在 .bashrc 文件底部添加:
alias get_adf='. /data/home/sam/MyWorkSpace/esp-adf/export.sh'

四、烧录 volc_rtc 固件
1、准备工作
使用 vs code 打开 esp-adf 项目,打开路径 examples/ai_agent/volc_rtc ,

根据 README 文件的指引,需要登录火山引擎申请 token 与配置各个参数。
2、火山引擎配置
2.1、账号注册
登录网址:账号登录-火山引擎

首次注册登录需要实名认证,认证完之后直接搜索“实时音视频”,
2.2、开通“实时音视频”服务

点击“视频服务”的“实时音视频”就会跳转页面,

点击“领取礼包并开通”,

提交成功之后,点击“去控制台”,

可以看到已经创建了默认应用,直接点击“临时token”,

RoomId 与 UserId 随便填就可以,然后生成临时 Token,

把参数全部配置到 examples/ai_agent/volc_rtc/main/config.h 文件,还要配置 WIFI 账号密码,不然没法联网。
2.3、设置权限
配置“访问控制”:账号登录-火山引擎




2.4、智能体 API
智能体配置:API Explorer

使用智能体进行对话前,你需要开通 ASR、 TTS 和大模型服务并配置相关策略,详情请参看开通服务。
2.5、开通 ASR/TTS 服务
ASR/TTS:账号登录-火山引擎
进入页面后,点击“创建应用”,主要选中“大模型语音合成”、“语言合成” 、“流式语音识别”,


如果需要配置音色,则需要开通服务,这里先用试用版,

AppId 与 Token 可以在底部查到:

2.6、开通 LLM 服务
大语言模型配置:账号登录-火山引擎

点击“系统管理”,注意右上角开启“免费用量 自动暂停”,然后选中其中一个模型进行开通。




可以看到已经开通成功,接着配置“在线推理”:
2.7、自定义推理接入点


选中刚刚开通的大模型,点击“确认接入”,

这里 ep 开头的就是需要获取的 EndPointId 参数值,

以上我们已经获取了启动智能体所需的所有参数,先用 Web 端测试参数是否可以正常使用,
2.8、无代码测试

弹窗中,依次检查 Step1、Step2,然后“加入 RTC 房间”,

生成临时 token 并且使用临时 token 进入房间,

接着配置智能体,


输入刚刚获取的 ep 开头的 EndPointId ,

ASR 与 TTS 配置需要在语音技术页面找到 AppId 与 Cluster,点击下方蓝色提示词就可以跳转到对应的页面了,


最后点击“开始调用”,

此时会听到豆包AI在说话就表示正常调用。

2.9、启动智能体
接下来整合参数配置、发起请求启动智能体:
"ASRConfig": {"Provider": "volcano","ProviderParams": {"Mode": "smallmodel","AppId": "9*******"}},
语音识别配置,这里使用小模型,只需改 AppId。
"TTSConfig": {"Provider": "volcano","ProviderParams": {"app": {"appid": "9*******","cluster":"volcano_tts"}}},
语音合成配置,这里只需改 AppId。
"LLMConfig": {"Mode": "ArkV3","EndPointId": "ep*******","MaxTokens": 1024,"Temperature": 0.1,"TopP": 0.3,"SystemMessages": ["你是小马,性格幽默又善解人意。你在表达时需简明扼要,有自己的观点。"],"WelcomeSpeech": "你好,我是小马"}
大语音模型配置,这里只需改 EndPointId,角色预设与欢迎语根据自己需求修改。

配置好参数后,点击“发起调试”,可以看到已经调用成功。如果需要关闭智能体,则点第二个菜单,同样填入页面需要的参数即可。
五、编译烧录
1、自定义设备
添加 components/audio_board/esp32_s3_sparkbot,因为该硬件 codex 芯片采用 ES8311 ,因此可以参考示例中同样音频芯片的 ESP32-S3-BOX-3 设备,只需要修改对应 IO 即可,

修改 components/audio_board/CMakeLists.txt,

if (CONFIG_ESP32_S3_SPARKBOT_BOARD)
message(STATUS "Current board name is " CONFIG_ESP32_S3_SPARKBOT_BOARD)
list(APPEND COMPONENT_ADD_INCLUDEDIRS ./esp32_s3_sparkbot)
set(COMPONENT_SRCS
./esp32_s3_sparkbot/board.c
./esp32_s3_sparkbot/board_pins_config.c
)
endif()
修改 components/audio_board/Kconfig.projbuild ,

config ESP32_S3_SPARKBOT_BOARDbool "ESP32-S3-SparkBot"
2、设置目标芯片
idf.py set-target esp32s3

3、配置 menuconfig
idf.py menuconfig

这里我们选中刚刚自定义的 ESP32-S3-SparkBot,


4、执行编译
idf.py build

5、一键烧录
idf.py -p /dev/ttyACM0 flash monitor


可以看到加入房间成功,可以开始与豆包AI对话。
ESP32与豆包大模型的RTC连续对话
彩蛋:EspSparkBot 对接豆包大模型




博客链接:手把手教你玩转ESP-SPARKBOT与豆包大模型:从零到一的完整指南-CSDN博客
参考资料
- Get Started - - — Audio Development Framework latest documentation
- https://github.com/espressif/esp-adf
- esp-adf: ESP-ADF 是由乐鑫官方推出的针对 ESP32 和 ESP32-S2 系列芯片的音频开发框架。ESP-ADF 国内镜像仓库,Issues 和 PRs 请仍旧提交到 github。
- 开通服务--实时音视频-火山引擎
相关文章:
从零到一:ESP32与豆包大模型的RTC连续对话实现指南
一、对话效果演示 ESP32与豆包大模型的RTC连续对话 二、ESP-ADF 介绍 乐鑫 ESP-ADF(Espressif Audio Development Framework)是乐鑫科技(Espressif Systems)专为 ESP32 系列芯片开发的一款音频开发框架。它旨在简化基于 ESP32 芯…...
【深度学习与实战】2.3、线性回归模型与梯度下降法先导案例--最小二乘法(向量形式求解)
为了求解损失函数 对 的导数,并利用最小二乘法向量形式求解 的值 这是线性回归的平方误差损失函数,目标是最小化预测值 与真实值 之间的差距。 损失函数: 考虑多个样本的情况,损失函数为所有样本的平方误差之和&a…...
【Django】教程-2-前端-目录结构介绍
【Django】教程-1-安装创建项目目录结构介绍 3. 前端文件配置 3.1 目录介绍 在app下创建static文件夹, 是根据setting中的配置来的 STATIC_URL ‘static/’ templates目录,编写HTML模板(含有模板语法,继承,{% static ‘xx’ …...
JS判断对象是否为空的方法
在 JavaScript 中,判断一个对象是否为空对象(即没有自身可枚举属性),可以通过以下方法实现: 方法 1:使用 Object.keys() javascript function isEmptyObject(obj) {// 确保是普通对象(排除 n…...
详解list容器
1.list的介绍 list的底层结构是双向带头循环链表,允许随机的插入和删除,但其内存空间不是连续的。随机访问空间能力差,需要从头到尾遍历节点,不像vector一样高效支持 2.list的使用 构造函数 1.默认构造函数:创建一个…...
leetcode_977. 有序数组的平方_java
977. 有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/ 1.题目 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1…...
Spring Boot 3.4.3 基于 SpringDoc 2 和 Swagger 3 实现项目接口文档管理
在现代企业级应用开发中,前后端分离已成为主流模式,前端负责界面呈现,后端专注提供 RESTful API 接口。然而,接口文档的编写和维护往往是开发过程中的痛点。Spring Boot 3.4.3 结合 SpringDoc 2 和 Swagger 3,为开发者…...
前端面经分享(25/03/26)
北京一家做AI解决方案的公司,技术一面,15k-20k,要求3-5年 你们React项目里路由模式用的什么React里class组件和function组件都用过吗常用Hook,解释一下他们的作用useEffect第二个参数填空数组和不填有什么区别React组件通信的常用…...
Matlab基础知识与常见操作【无痛入门】
【1】Matlab基本概念 【2】Matlab程序设计 【3】Matlab图形绘制 以上三篇文章为Matlab主要的应用场景,我在学习的过程中做一下记录,方便以后回顾。 接下来介绍下Matlab的工作界面,以及如何高效率的应用Matlab的帮助手册。在我看来&#x…...
HTTP协议手写服务器
目录 一、请求的是Web根目录 二、GET方法通过URL传参 三、根据资源类型对应出Content-Type值 四、Http代码 项目完整源代码:Http 周不才/cpp_linux study - 码云 - 开源中国 一、请求的是Web根目录 如果URL中请求的资源是Web根目录,则自动跳转到主…...
网络探索之旅:网络原理(第二弹)
上篇文章,小编分享了应用层和传输层深入的一点的知识,那么接下来,这篇文章,继续分享网络层和数据链路层。 网络层 了解这个网络层,那么其实就是重点来了解下IP这个协议 对于这个协议呢,其实也是和前面的…...
深入剖析 JVM:从组成原理到调优实践
深入剖析 JVM:从组成原理到调优实践 深入剖析 JVM:从组成原理到调优实践一、JVM 组成架构:运行 Java 程序的 “幕后引擎”1.1 内存结构:数据存储的 “分区管理”1.2 执行引擎:字节码的 “翻译官”1.3 本地方法接口&…...
阿里云下一代可观测时序引擎-MetricStore 2.0
作者:徐昊(博澍) 背景 作为可观测场景使用频度最高的数据类型,Metrics 时序数据在可观测领域一直占有着重要地位,无论是从全局视角来观测系统整体状态,还是从大范围数据中定位某一个异常的位置࿰…...
从入门到精通【 MySQL】 数据库约束与设计
文章目录 📕1. 数据库约束✏️1.1 NOT NULL 非空约束✏️1.2 DEFAULT 默认值约束✏️1.3 UNIQUE 唯一约束✏️1.4 PRIMARY KEY 主键约束✏️1.5 FOREIGN KEY 外键约束✏️1.6 CHECK 约束 📕2. 数据库设计✏️2.1 第一范式✏️2.2 第二范式✏️2.3 第三范…...
使用LLaMAFactory微调Qwen大模型
一、环境配置与工具安装 1. 硬件要求 GPU:至少1块NVIDIA GPU(推荐RTX 4090/A100/H100,显存≥16GB)。内存:≥64GB系统内存。存储:≥100GB硬盘空间用于模型与数据集存储。2. 软件依赖 Python 3.8+:需安装CUDA支持的PyTorch版本(如torch==2.0.1+cu117)。 依赖库:通过以…...
Dubbo 通信流程 - 服务的调用
Dubbo 客户端的使用 在 Dubbo 应用中,往类成员注解 DubboReference,服务启动后便可以调用到远端: Component public class InvokeDemoFacade {AutowiredDubboReferenceprivate DemoFacade demoFacade;public String hello(String name){// …...
【数据结构】哈夫曼树
哈夫曼树 在学习哈夫曼树之前,先了解以下几个概念: 一:**路径长度:**在一棵树中,从一个节点到另一个节点所经过的“边”的数量,被我们称为两个节点之间的路径长度。 二:**树的路径长度…...
HCIP(TCP)(2)
1. TCP三次握手 SYN (同步序列编号) 报文: 客户端发送 SYN 报文,开始建立连接,并初始化序列号。 SYN-ACK (同步序列编号-确认) 报文: 服务器收到 SYN 报文后,回复 SYN-ACK 报文,确认连接请求,并初始化自己的序列号和确…...
VMware Ubuntu 网络配置全攻略:从断网到畅通无阻
一、网络连接模式选择(先搞懂原理) VMware提供三种网络模式,就像手机的不同网络套餐: 模式适用场景特点类比NAT个人上网/新手首选虚拟机共享主机IP,能上网但隐身家用WiFi桥接服务器/需要被局域网访问虚拟机会获得独立…...
基于Web的交互式智能成绩管理系统设计
目录 摘要 绪论 一、应用背景 二、行业发展现状 三、程序开发的重要意义 四、结语 1 代码 2 数据初始化模块 3 界面布局模块 4 核心功能模块 5 可视化子系统 6 扩展功能模块 7 架构设计亮点 功能总结 一、核心数据管理 二、智能分析体系 三、可视化系统 四、扩…...
第 12 章(番外)| Solidity 安全前沿趋势 × 审计生态 × 职业路径规划
🌐 第 12 章(番外)| Solidity 安全前沿趋势 审计生态 职业路径规划 ——做得了审计,也接得了项目,走进 Web3 安全工程师的职业实战地图 ✅ 本章导读 Solidity 安全,不只是代码安全、业务安全、审计安全…...
输出3行3列矩阵的鞍点
【问题描述】在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点。任意输入一个3行3列矩阵,请设计程序输出其鞍点。 【输入形式】每行3个数,输入3列 【输出形式】输出所有鞍点;如果没有…...
k8s日志管理
k8s日志管理 k8s查看日志查看集群中不是完全运行状态的pod查看deployment日志查看service日志进入pod的容器内查看日志 管理k8s组件日志kubectl logs查看日志原理 管理k8s应用日志收集k8s日志思路收集标准输出收集容器中日志文件 k8s查看节点状态失败k8s部署prometheus监控 k8s…...
【数据结构】顺序表-元素去重
数据元素 结点定义,复杂数据类型,可用作整体性的管理系统。如果单独研究某些数据,比如只看学号或成绩,那么直接使用int之类的简单数据类型亦可。对应修改:typedef int Elemtype; typedef struct student{ //定义学生…...
物理安全——问答
目录 1、计算机的物理安全包含哪些内容 1. 设备保护 2. 访问控制 3. 电力与环境安全 4. 数据存储保护 5. 硬件防护 6. 监控与审计 7. 灾难恢复与应急响应 8. 拆卸与维修安全 2、物理安全有哪些需要关注的问题 1、计算机的物理安全包含哪些内容 1. 设备保护 防止盗窃&…...
element-plus中,Loading 加载组件的使用
一.基本使用 给一个组件,如:table表格,加上v-loading"true"即可。 举例:复制如下代码。 <template><el-table v-loading"loading" :data"tableData" style"width: 100%"><…...
Mybatis_Plus中的常用注解
目录 1、TableName TableId TableId的type属性 TableField 1、TableName 经过以上的测试,在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在 Mapper接口继承BaseMapper时,设置了泛型User,而操…...
云数据库概念
1.云数据库概念 云数据库是部署和虚拟化在云计算环境中的数据库。云数据库是在云计算的大背景下发展起来的一种新兴的共享基础架构的方法,它极大地增强了数据库的存储能力,消除了人员、硬件、软件的重复配置,让软、硬件升级变得更加容易。云…...
高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系
一句话总结 在高并发金融系统中,审计方案设计需平衡"观测粒度"与"系统损耗",通过双AOP实现非侵入式采集,三表机制保障操作原子性,最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…...
UDP视频传输中的丢包和播放花屏处理方法
在处理UDP视频传输中的丢包和花屏问题时,需要结合编码优化、网络传输策略和接收端纠错技术。以下是分步骤的解决方案: 1. 前向纠错(FEC,Forward Error Correction) 原理:在发送数据时附加冗余包,接收方通过冗余信息恢复丢失的数据包。 实现方法: 使用Reed-Solomon、XO…...
