音频
C202 的 sdk中,关于1302音频的处理,头文件里有audio_player_stop_and_wait、audio_player_stop_speak和audio_player_raw_write_finish 这三个有什么区别?
- audio_player_raw_write_finish 这个是音频下发结束,数据流结束通知 (流式TTS结束)
- audio_player_stop_speak 快速响应异步停止请求(类似按键暂停)
- audio_player_stop_and_wait 强制停止并阻塞等待完成(唤醒打断)
在C202 的使用过程中,会出现这个报错,“ci13002_protocol:Deal recv frame too slow”,这个报错是什么原因?
当 xQueueSend 在 10ms 超时时间内无法将接收到的帧数据放入队列时,就会触发这个错误
表示 uart_buffer_queue 队列已满,通常有以下几种情况:
1、消费速度过慢: 在 ci1302.c 的 ci1302_deal_task() 函数中,从队列取数据并处理的速度跟不上串口接收速度
2、队列容量不足: 虽然代码中没有显示队列创建部分,但如果队列深度设置过小,在数据高峰期容易满
3、处理任务阻塞: 消费任务可能在某些操作上阻塞了(如文件操作、网络请求等),导致无法及时从队列取数据
4、串口数据突发: CI1302 芯片短时间内发送大量数据(如音频流、唤醒事件等),超过处理能力
如何将 AMR 格式的录音数据先缓存到 PSRAM,再根据实际情况写入到 SPI Flash?
可以使用 heap_caps_malloc(size, MALLOC_CAP_SPIRAM) 分配一块 PSRAM 缓冲区,先将 AMR 录音数据写入该缓冲区。
当录音结束,或者达到需要写入 Flash 的条件时,再将缓冲区中的数据一次性或分段写入 SPIFFS/Flash。这种方式可以有效减少频繁写 Flash 的次数,并优化录音存储流程。
C302 修改唤醒词后,上电播报“我是小明”如何取消?是否支持自定义唤醒词和声学模型升级?
如果需要取消上电播报,可参考 chat_notify_list.c。该文件中包含多个本地自带的音频标识,找到“你好小明”对应的那一句后,继续检查它对应的标识头在什么位置被调用,将相关调用屏蔽即可。
其中,chat_notify_audio_play() 是实际执行播放的函数。
关于唤醒词和模型部分,目前不能开放声学模型在线升级:
- 只能使用与当前方案对应的模型,模型部分无法通过 OTA 升级。
- 如果需要升级模型,只能通过串口自行升级。
- 如果采用串口升级方式,SDK 中也需要同步将
ota1302相关功能屏蔽掉。
如何将多个 MP3 文件打包为可直接存储至 Flash 的 .bin 文件,并在程序中按需播放指定音频?
可以参考 ESP-ADF 的 examples/player/pipeline_flash_tone 示例。该方案通过脚本将多个 MP3 文件打包为可烧录到 Flash 的 audio-esp.bin,并为每个音频文件分配固定的 Flash 访问路径,例如 flash://tone/0_Bt_Reconnect.mp3。
基本流程:
- 将源 MP3 文件放入
tone_mp3_folder目录。 - 执行
$ADF_PATH/tools/audio_tone/mk_audio_tone.py,指定源音频目录并生成打包文件。 - 脚本会生成
.c源文件、.h枚举头文件,以及可直接烧录的audio-esp.bin。 - 应用程序通过枚举索引引用对应音频路径,再结合 ESP-ADF Pipeline 解码并播放指定 MP3。
这种方式适合提示音、离线语音资源、按键音效等固定音频资源的集中管理。
ESP32-S3 模组是否可以不使用 AEC 硬件电路,而仅通过软件实现回声消除?
可以。只要软件侧能够提供正确的麦克风信号和播放参考信号,就可以不使用专用 AEC 硬件电路,而通过乐鑫的软件 AEC 算法实现回声消除。
但 AEC 效果不仅取决于软件算法,也与硬件设计和声学结构密切相关,例如:
- 扬声器失真
- 麦克风噪声
- 参考信号路径延迟
- 整机声腔和麦克风/扬声器布局
因此产品设计阶段仍需保证硬件布局与声学结构合理,否则即使使用软件 AEC,也可能出现回声残留或消除效果不稳定的问题。
volc_rtc 示例使用 Coze 方案时,如何修改智能体音色?
Coze 平台为不同音色提供对应的 voice_id。端侧请求需要携带该参数,但 volc_rtc 的默认实现不会将 voice_id 加入请求体,因此只在配置结构体中赋值还不能生效。
先在端侧请求配置中设置从 Coze 平台获取的 voice_id:
coze_http_req_config_t http_config = COZE_HTTP_DEFAULT_CONFIG();
http_config.voice_id = "your_voice_id";
然后修改 coze_http_request.c 中的 str_pkg_to_cjson_fmt(),将该字段加入请求体:
cJSON_AddStringToObject(root, "voice_id", cfg->voice_id);
完成这两处修改后,服务端才能收到指定的 voice_id 并使用对应音色。