ESP32的ADF详解:5. Streams的API
一、算法流 (algorithm stream)
1. 初始化与配置
algo_stream_init()
config->algo_mask
选择算法组合config->sample_rate
设置采样率(默认16kHz)config->partition_label
指定模型分区ALGORITHM_STREAM_CFG_DEFAULT()
2. 算法控制
algo_stream_set_delay()
delay_ms
推荐0-10msringbuf
需关联参考信号缓冲区algorithm_mono_fix()
3. 音频处理配置
| 配置结构体 algorithm_stream_cfg_t
关键字段:
input_type
TYPE1
:单I2S双声道输入(左=参考,右=麦克风)TYPE2
:独立信号输入rec_linear_factor
agc_mode
AFE_AGC_OFF
/AFE_AGC_FIXED
/AFE_AGC_ADAPTIVE
ADAPTIVE
debug_input
4. 算法掩码选项
通过 algo_mask
组合启用算法:
// 示例:同时启用AEC和NSconfig.algo_mask = ALGORITHM_STREAM_USE_AEC | ALGORITHM_STREAM_USE_NS;
ALGORITHM_STREAM_USE_AEC
ALGORITHM_STREAM_USE_AGC
ALGORITHM_STREAM_USE_NS
ALGORITHM_STREAM_USE_VAD
5. 典型调用流程
-
初始化算法流
algorithm_stream_cfg_t algo_cfg = ALGORITHM_STREAM_CFG_DEFAULT();algo_cfg.algo_mask = ALGORITHM_STREAM_USE_AEC | ALGORITHM_STREAM_USE_NS;algo_cfg.sample_rate = 16000;audio_element_handle_t algo_stream = algo_stream_init(&algo_cfg);
-
集成到流水线
audio_pipeline_register(pipeline, algo_stream, \"algo\");audio_pipeline_link(pipeline, (const char*[]){\"i2s_reader\", \"algo\", \"vad\"}, 3);
-
调试延迟(Type2模式)
ringbuf_handle_t ref_rb = rb_create(2048);algo_stream_set_delay(algo_stream, ref_rb, 5); // 设置5ms延迟
6. 注意事项
-
内存占用
- 启用AEC约消耗50KB RAM,建议使用ESP32-S3/WROVER等大内存芯片
- 外部PSRAM可设置
stack_in_ext=true
-
性能调优
- 采样率推荐16kHz,更高采样率会增加计算负担
- AGC目标电平(
target_level_dbfs
)通常设为-3dBFS
-
硬件连接
- Type1模式:需硬件支持I2S双声道(左声道接扬声器参考信号)
- Type2模式:需用户自行同步参考信号与麦克风信号
二、FatFS流
1. 初始化与配置
fatfs_stream_init()
type
: AUDIO_STREAM_READER
/WRITER
write_header
: 是否写入AMR头2. 结构体
/** * @brief FATFS 流配置结构体,用于配置 FATFS 流的参数。 * 如果任何条目为零,则配置将设置为默认值。 */struct fatfs_stream_cfg_t { audio_stream_type_t type; ///< 流类型 int buf_sz; ///< 音频元素缓冲区大小 int out_rb_size; ///< 输出环形缓冲区大小 int task_stack; ///< 任务栈大小 int task_core; ///< 任务运行的核心(0 或 1) int task_prio; ///< 任务优先级(基于 FreeRTOS 优先级) bool ext_stack; ///< 是否在外部 RAM 中分配栈 bool write_header; ///< 是否在 FATFS 中写入 AMRNB/AMRWB 头(true 或 false,true 表示选择写入 AMRNB 头)};
三、HTTP流
1. 初始化与基础控制
http_stream_init()
config->type
: 指定读/写模式config->enable_playlist_parser
: 启用HLS播放列表解析http_stream_restart()
el
: HTTP流句柄http_stream_fetch_again()
el
: HTTP流句柄2. 播放列表控制
http_stream_next_track()
HTTP_STREAM_FINISH_TRACK
事件回调中调用http_stream_event_msg_t
event_id
和http_client
指针3. 安全认证
http_stream_set_server_cert()
cert
: PEM格式证书字符串crt_bundle_attach
(配置项)ESP_CERT_BUNDLE
4. 事件回调类型
HTTP_STREAM_PRE_REQUEST
HTTP_STREAM_FINISH_TRACK
next_track()
切换HTTP_STREAM_ON_RESPONSE
5. 关键配置参数
结构体
/** * @brief HTTP 流事件消息结构体,用于传递 HTTP 流相关的事件信息。 */struct http_stream_event_msg_t { http_stream_event_id_t event_id; ///< 事件 ID,标识具体的事件类型 void *http_client; ///< 指向使用此 HTTP 流的 HTTP 客户端的引用 void *buffer; ///< 指向音频元素使用的缓冲区的引用 int buffer_len; ///< 缓冲区的长度 void *user_data; ///< 用户数据上下文,来自 http_stream_cfg_t audio_element_handle_t el; ///< 音频元素上下文};/** * @brief HTTP 流配置结构体,用于配置 HTTP 流的各种参数。 * 如果任何条目为零,则使用默认值。 */struct http_stream_cfg_t { audio_stream_type_t type; ///< 流类型 int out_rb_size; ///< 输出环形缓冲区的大小 int task_stack; ///< 任务栈大小 int task_core; ///< 任务运行的核心(0 或 1) int task_prio; ///< 任务优先级(基于 FreeRTOS 优先级) bool stack_in_ext; ///< 尝试在外部内存中分配栈 http_stream_event_handle_t event_handle; ///< HTTP 流事件的钩子函数 void *user_data; ///< 用户数据上下文 bool auto_connect_next_track; ///< 是否自动连接下一首曲目,无需打开/关闭 bool enable_playlist_parser; ///< 是否启用播放列表解析器 int multi_out_num; ///< 多输出数量 const char *cert_pem; ///< SSL 服务器证书,PEM 格式的字符串,如果客户端需要验证服务器 esp_err_t (*crt_bundle_attach)(void *conf); ///< 指向 esp_crt_bundle_attach 的函数指针,启用证书捆绑以进行服务器验证,必须在 menuconfig 中启用 int request_size; ///< 每次从 HTTP 客户端请求的数据大小,默认使用 DEFAULT_ELEMENT_BUFFER_LENGTH 如果设置为 0,如果音频帧大小较小且需要低延迟播放,需要小心此设置 int request_range_size; ///< 头部范围大小设置,范围:字节=起始-结束,如果设置为 0,请求资源的完整范围,建议范围大小大于请求大小 const char *user_agent; ///< 发送 HTTP 请求时使用的 User Agent 字符串};
宏定义
#define HTTP_STREAM_CFG_DEFAULT() // 默认配置(8KB环形缓冲区)#define HTTP_STREAM_RINGBUFFER_SIZE // 可覆盖默认缓冲区大小
6. 典型调用流程
HLS直播流播放
// 1. 初始化配置http_stream_cfg_t cfg = HTTP_STREAM_CFG_DEFAULT();cfg.type = AUDIO_STREAM_READER;cfg.enable_playlist_parser = true;cfg.event_handle = _hls_event_handler;// 2. 创建实例audio_element_handle_t http_stream = http_stream_init(&cfg);// 3. 事件处理回调static int _hls_event_handler(http_stream_event_msg_t *msg) { if (msg->event_id == HTTP_STREAM_FINISH_TRACK) { http_stream_next_track(msg->el); // 自动切换分片 } return 0;}
HTTPS音频流播放
// 设置SSL证书http_stream_set_server_cert(http_stream, \"-----BEGIN CERTIFICATE-----\\n\" \"MIIDx...\\n\" // 证书内容 \"-----END CERTIFICATE-----\");
注意事项
- 内存管理
- 每个HTTP流实例默认占用~6KB任务栈,建议启用
stack_in_ext
使用外部RAM
- 每个HTTP流实例默认占用~6KB任务栈,建议启用
- 直播流优化
- 设置
request_range_size > request_size
避免频繁请求
- 设置
- 错误处理
- 监听
HTTP_STREAM_FINISH_PLAYLIST
事件处理播放列表结束
- 监听
- 多输出支持
- 通过
multi_out_num
配置多路输出环形缓冲区
- 通过
四、I2S流
1. 初始化与配置
i2s_stream_init()
config
: 配置结构体i2s_stream_set_channel_type()
config
: 配置结构体type
: 通道格式类型ESP_OK
或ESP_ERR_INVALID_ARG
I2S_STREAM_CFG_DEFAULT()
I2S_STREAM_CFG_DEFAULT_WITH_PARA()
port
: I2S端口rate
: 采样率bits
: 位宽stream_type
: 流类型I2S_STREAM_CFG_DEFAULT_WITH_TYLE_AND_CH()
port
: I2S端口rate
: 采样率bits
: 位宽stream_type
: 流类型channel
: 通道类型2. 时钟控制
i2s_stream_set_clk()
i2s_stream
: 元素句柄rate
: 采样率(Hz)bits
: 位宽(8/16/24/32)ch
: 通道数ESP_OK
或ESP_FAIL
3. 音量控制(ALC)
i2s_alc_volume_set()
i2s_stream
: 元素句柄volume
: 音量值(-64~63dB)ESP_OK
或ESP_FAIL
i2s_alc_volume_get()
i2s_stream
: 元素句柄volume
: 存储音量值的指针ESP_OK
或ESP_FAIL
4. 同步控制
i2s_stream_sync_delay()
i2s_stream
: 元素句柄delay_ms
: 延迟时间(ms)ESP_OK
或ESP_FAIL
5. 结构体
i2s_stream_cfg_t
/** * @brief I2S 流配置结构体,用于配置 I2S 流的各种参数。 * 如果任何条目为零,则使用默认值。 */struct i2s_stream_cfg_t { audio_stream_type_t type; ///< 流类型 i2s_comm_mode_t transmit_mode; ///< I2S 传输模式 i2s_chan_config_t chan_cfg; ///< I2S 控制器通道配置 i2s_std_config_t std_cfg; ///< I2S 标准模式主要配置,包括时钟/槽位/GPIO 配置 bool use_alc; ///< ALC 标志。如果使用 ALC,值为 true,否则为 false int volume; ///< 音频输入数据的音量设置 int out_rb_size; ///< 输出环形缓冲区大小 int task_stack; ///< 任务栈大小 int task_core; ///< 任务运行的核心(0 或 1) int task_prio; ///< 任务优先级(基于 FreeRTOS 优先级) bool stack_in_ext; ///< 尝试在外部内存中分配栈 int multi_out_num; ///< 多输出数量 bool uninstall_drv; ///< 是否在流销毁时卸载 I2S 驱动 bool need_expand; ///< 是否扩展 I2S 数据 i2s_data_bit_width_t expand_src_bits; ///< 扩展时的源每样本位数 int buffer_len; ///< 用于元素的缓冲区长度。注意:当 \'bits_per_sample\' 为 24 位时,缓冲区长度必须是 3 的倍数。推荐值为 3600};
6. 枚举类型
i2s_channel_type_t
I2S_CHANNEL_TYPE_RIGHT_LEFT
I2S_CHANNEL_TYPE_ALL_RIGHT
I2S_CHANNEL_TYPE_ALL_LEFT
I2S_CHANNEL_TYPE_ONLY_RIGHT
I2S_CHANNEL_TYPE_ONLY_LEFT
五、RAW流
1. 初始化与配置
raw_stream_init()
cfg
: 配置结构体RAW_STREAM_CFG_DEFAULT()
2. 数据读写操作
raw_stream_read()
pipeline
: 管道句柄buffer
: 数据缓冲区buf_size
: 最大读取字节数raw_stream_write()
pipeline
: 管道句柄buffer
: 数据缓冲区buf_size
: 要写入的字节数3. 结构体
raw_stream_cfg_t
type
audio_stream_type_t
out_rb_size
int
4. 宏定义
RAW_STREAM_RINGBUFFER_SIZE
5. 应用模式说明
[i2s] → [codec-amr] → [raw]
六、TCP流
1. 初始化与配置
tcp_stream_init()
config
: 配置结构体 (tcp_stream_cfg_t
)TCP_STREAM_CFG_DEFAULT()
2. 结构体
/** * @brief TCP 流事件消息结构体,用于传递 TCP 流相关的事件信息。 */struct tcp_stream_event_msg { void *source; ///< 元素句柄 void *data; ///< 输入/输出的数据 int data_len; ///< 输入/输出的数据长度 esp_transport_handle_t sock_fd; ///< 套接字句柄};/** * @brief TCP 流配置结构体,用于配置 TCP 流的各种参数。 * 如果任何条目为零,则使用默认值。 */struct tcp_stream_cfg_t { audio_stream_type_t type; ///< 流类型 int timeout_ms; ///< 读写超时时间(毫秒) int port;///< TCP 端口号 char *host; ///< TCP 主机地址 int task_stack; ///< 任务栈大小 int task_core; ///< 任务运行的核心(0 或 1) int task_prio; ///< 任务优先级(基于 FreeRTOS 优先级) bool ext_stack; ///< 是否在外部 RAM 中分配栈空间 tcp_stream_event_handle_cb event_handler; ///< TCP 流事件回调函数 void *event_ctx; ///< 用户上下文};
3. 事件回调与状态
tcp_stream_event_handle_cb
-
msg
: 事件消息 (tcp_stream_event_msg_t
)-
state
: 连接状态 (tcp_stream_status_t
)-
event_ctx
: 用户上下文tcp_stream_status_t
-
TCP_STREAM_STATE_NONE
(未连接)-
TCP_STREAM_STATE_CONNECTED
(已连接)4. 宏定义
TCP_STREAM_DEFAULT_PORT
TCP_STREAM_TASK_STACK
TCP_STREAM_BUF_SIZE
TCP_STREAM_TASK_PRIO
TCP_STREAM_TASK_CORE
TCP_SERVER_DEFAULT_RESPONSE_LENGTH
5. 典型数据流向
AUDIO_STREAM_READER
)[tcp_client] → [decoder] → [i2s]
AUDIO_STREAM_WRITER
)[i2s] → [encoder] → [tcp_client]
6. 注意事项
- 连接管理:需通过回调函数
event_handler
监控连接状态(如断开重连)。 - 超时设置:
timeout_ms
影响网络操作的阻塞时间。 - 资源分配:若启用
ext_stack
,需确保外部 RAM 可用。
七、TONE流
1. 初始化与配置
tone_stream_init()
AUDIO_STREAM_READER
类型,从 Flash 读取音频数据)config
: 配置结构体 (tone_stream_cfg_t
)TONE_STREAM_CFG_DEFAULT()
2. 结构体
tone_stream_cfg_t
/** * @brief TONE 流配置结构体,用于配置 TONE 流的各种参数。 * 如果任何条目为零,则使用默认值。 */struct tone_stream_cfg_t { audio_stream_type_t type; ///< 流类型 int buf_sz; ///< 音频元素缓冲区大小 int out_rb_size; ///< 输出环形缓冲区大小 int task_stack; ///< 任务栈大小 int task_core; ///< 任务运行的核心(0 或 1) int task_prio; ///< 任务优先级(基于 FreeRTOS 优先级) const char *label; ///< 存储在闪存中的音调标签。默认值为 flash_tone bool extern_stack; ///< 任务栈是否在外部 RAM 中分配 bool use_delegate; ///< 是否使用 esp_delegate 读取音调分区。如果任务栈在外部 RAM 中,则必须为 TRUE};
3. 宏定义
TONE_STREAM_BUF_SIZE
TONE_STREAM_TASK_STACK
TONE_STREAM_TASK_CORE
TONE_STREAM_TASK_PRIO
TONE_STREAM_RINGBUFFER_SIZE
TONE_STREAM_EXT_STACK
TONE_STREAM_USE_DELEGATE
esp_delegate
读取 Flash4. 功能限制与说明
AUDIO_STREAM_READER
类型,不可用于写入。tools/audio_tone/mk_audio_tone.py
生成二进制数据并烧录至 Flash 的指定分区(标签通过 label
指定)。extern_stack
,需确保外部 RAM 可用且 use_delegate=true
。5. 典型数据流向
[Flash 提示音数据] → [tone_stream] → [下游音频元素(如 I2S)]
6. 注意事项
- Flash 数据格式:提示音数据需通过
mk_audio_tone.py
工具生成,确保格式兼容。 - 资源分配:若使用外部堆栈(
extern_stack=true
),必须同时启用use_delegate
。 - 实时性:提示音流适用于短时音频播放(如系统提示音),不适用于长时间流媒体。
八、TTS流
1. 初始化与配置
tts_stream_init()
AUDIO_STREAM_READER
类型,从 esp_tts_voice
获取数据)config
: 配置结构体 (tts_stream_cfg_t
)TTS_STREAM_CFG_DEFAULT()
2. 语音合成控制
tts_stream_set_strings()
el
: 音频元素句柄strings
: 待合成的文本字符串指针ESP_OK
或 ESP_FAIL
tts_stream_set_speed()
el
: 音频元素句柄speed
: 速度值(tts_voice_speed_t
枚举类型)ESP_OK
或 ESP_FAIL
tts_stream_get_speed()
el
: 音频元素句柄speed
: 返回速度值的指针ESP_OK
或 ESP_FAIL
3. 结构体
tts_stream_cfg_t
/** * @brief TTS 流配置结构体,用于配置 TTS 流的各种参数。 * 如果任何条目为零,则使用默认值。 */struct tts_stream_cfg_t { audio_stream_type_t type; ///< 流类型 int buf_sz; ///< 音频元素缓冲区大小 int out_rb_size; ///< 输出环形缓冲区大小 int task_stack; ///< 任务栈大小 int task_core; ///< 任务运行的核心(0 或 1) int task_prio; ///< 任务优先级(基于 FreeRTOS 优先级) bool ext_stack; ///< 是否在外部 RAM 中分配任务栈};
4. 宏定义
TTS_STREAM_BUF_SIZE
TTS_STREAM_TASK_STACK
TTS_STREAM_TASK_CORE
TTS_STREAM_TASK_PRIO
TTS_STREAM_RINGBUFFER_SIZE
5. 枚举类型 (tts_voice_speed_t
)
TTS_VOICE_SPEED_0
TTS_VOICE_SPEED_1
TTS_VOICE_SPEED_2
TTS_VOICE_SPEED_3
TTS_VOICE_SPEED_4
TTS_VOICE_SPEED_5
TTS_VOICE_SPEED_MAX
6. 功能限制与说明
AUDIO_STREAM_READER
类型,不可用于写入。esp-sr
组件以提供 esp_tts_voice
语音合成功能。7. 典型数据流向
[esp_tts_voice 合成数据] → [tts_stream] → [下游音频元素(如 I2S)]