Page 1 of 1

ESP-ADF-FAQ

Posted: Thu Oct 17, 2024 3:42 am
by ESP_William
Before FAQ
我们整理并分析了 GitHub Issues 以及在开发过程中遇到的问题。这里总结了常见的 A&Q 供大家参考。该模块会持续更新,如果大家有任何建议,欢迎发起讨论,我们都会认真查看!



FAQ

1. A: ADF 编译出错 “Failed to resolve component 'xxx'.”该怎么解决?
Q: 把ESP-ADF git下来之后还需要更新子模块, 在 $ADF_PATH (ESP-ADF根目录)使用下述命令下载子模块。

Code: Select all

git submodule update --init --recursive
2. A:该怎样从 element 中读取或写入数据?
Q: 一共有三种方法进行 element 读写
(1) callback 函数读写
  1. audio_element_set_write_cb(i2s_writer_el, i2s_write_cb, (void *)Input_file);
  2. audio_element_set_read_cb(i2s_reader_el, i2s_read_cb, (void *)Output_file);
  3.    
  4.    
  5. static int i2s_write_cb(audio_element_handle_t self, char *buffer, int len, TickType_t ticks_to_wait, void *context)
  6. {
  7.     memcpy(buffer, YOUR CONTENT, LEN);
  8. }
  9.  
  10. static int i2s_read_cb(audio_element_handle_t self, char *buffer, int len, TickType_t ticks_to_wait, void *context)
  11. {
  12.     memcpy(YOUR NEED CONTENT, buffer, LEN);
  13. }
如果使用了 pipeline,只可以在第一个 element 加 write callback function最后一个element 加 read callback function
(2) ringbuf 读写
参考 element_wav_amr_sdcard
  1.     ESP_LOGI(TAG, "[3.3] Create a ringbuffer and insert it between i2s_stream_reader and wav_encoder");
  2.     ringbuf01 = rb_create(RING_BUFFER_SIZE, 1);
  3.     audio_element_set_output_ringbuf(i2s_stream_reader, ringbuf01);
  4.     audio_element_set_input_ringbuf(wav_encoder, ringbuf01);
  5.    
  6.     ESP_LOGI(TAG, "[3.4] Create a ringbuffer and insert it between wav_encoder and wav_fatfs_stream_writer");
  7.     ringbuf02 = rb_create(RING_BUFFER_SIZE, 1);
  8.     audio_element_set_output_ringbuf(wav_encoder, ringbuf02);
  9.     audio_element_set_input_ringbuf(wav_fatfs_stream_writer, ringbuf02);

(3) 直接读写
  1. static audio_element_handle_t create_i2s_stream(int sample_rates, int bits, int channels, audio_stream_type_t type)
  2. {
  3.     i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_DEFAULT_WITH_PARA(CODEC_ADC_I2S_PORT, sample_rates, bits, type);
  4.     audio_element_handle_t i2s_stream = i2s_stream_init(&i2s_cfg);
  5.     mem_assert(i2s_stream);
  6.     ....
  7.     return i2s_stream;
  8. }
  9.  
  10.  
  11. ESP_LOGI(TAG, "[ x ] Create and start input key service");
  12.     audio_board_handle_t board_handle = audio_board_init();
  13.     audio_hal_ctrl_codec(board_handle->audio_hal, AUDIO_HAL_CODEC_MODE_BOTH, AUDIO_HAL_CTRL_START);
  14.  
  15. ESP_LOGI(TAG, "[x] Create i2s stream to write data to codec chip");
  16. audio_element_handle_t i2s_stream_writer = create_i2s_stream(RATE, BITS, CHANNEL, AUDIO_STREAM_WRITER);
  17.  
  18. ESP_LOGI(TAG, "[x] Create i2s stream to read data from codec chip");
  19. audio_element_handle_t i2s_stream_reader = create_i2s_stream(RATE, BITS, CHANNEL, AUDIO_STREAM_READER);
  20.  
  21. int read_bytes = audio_element_input(i2s_stream_reader, (void *)block_buffer, size * sizeof(int16_t));
  22.  
  23. int write_bytes = audio_element_output(i2s_stream_writer, (void *)block_buffer, size * sizeof(int16_t));

3. A: 麦克风增益怎么调?
Q:
  1. #define BOARD_PA_GAIN             (20)    //board_def.h
  2.  
  3. audio_hal_set_volume(board_audio_hal, 85);  //local volume control
如果蓝牙连接则使用AVRC协议,参考pipeline_a2dp_sink_stream


4. A: SR 模型在唤醒词改名后搜索不到?
Q: 请在 $ADF_PATH/components/esp-sr/model/pack_model.py 中打包唤醒词。之后,请在 Kconfig 中添加相应的选项,并在编译前确保在 menuconfig 中选中它。

5. A: 如何在 ESP32-S3-LCD-EVB2 开发板上运行(master)ESP-ADF?
Q: 请参考 issues 1215

6. A:关于VOIP AEC效果,如何可以让AEC质量变得更好?
Q: 上保证喇叭的声音只有正向的一个路径到mic,喇叭内腔 和mic 是完全隔离的结构,同时mic 加胶圈防振动。你可以把原始音频、参考音频、mic音频存下来分析一下。

7. A: 读写sdcard文件时报错 "No such file or directory"?
Q: 尝试设定

Code: Select all

menuconfig > Component config > FAT Filesystem support > Long filename support
可能会解决问题。

8. A: 怎么在案例中增加按键功能?
Q: 请参考issues 1245

9. A: ESP32 LyraT 4.3 运行VoIP在挂断后没有声音?
Q: 请检查是否将tone下载到Flash, 参考voip

10. A: 怎样在ESP-BOX-S3开发板esp-box\examples中,整合添加ADF中esp-adf\examples\的模块功能?
Q: 您可以直接用ADF里面的demo,我们已经支持了ESP32-S3-BOX,在

Code: Select all

menuconfig>Audio HAL>Audio board >ESP32-S3-BOX
选中。

11. A:如何在小度的日常使用中使用音频提示音?
Q: 请参考 issues 1264

12. A: 在ESP-ADF编译时遇到问题怎么解决?
Q: 先尝试指令

Code: Select all

idf.py fullclean 
或rm -rf build
,如果还是failed就删除 ~/.espressif/python_env 文件夹,重新在 $IDF_PATH 和 $ADF_PATH 使用命令

Code: Select all

./install.sh
. ./export.sh

14. A: 运行VOIP 例程提示i2c: CONFLICT! driver_ng is not allowed to be used with this old driver ,怎么解决?
Q: 参考issues 1274

15. A: 如何在ESP32-Lyrat v4.3 board 配置外接mic?
Q: 参考issues 1282

16. A: examples\player\pipeline_a2dp_source_stream 和 pipeline_bt_source 有何异同?
Q: pipeline_a2dp_xxx 使用 a2dp_stream_init 做初始化,在配置上更加灵活,play_bt_music_example中的 esp_bt_controlleresp_bluedroid 都能够进行是否选择使用;
pipeline_bt_xxx 使用 bluetooth_service_create_stream 做初始化, 直接将bt和上面选择性使用的函数都直接激活完成。

17. A: 如何在Arduino上使用ESP-ADF?
Q: 目前我们还没做该支持。

18. A: 使用 ESP-ADF 的 VoIP 功能时,手机和 ESP32 设备进行通话如何消除回音?
Q:
  • 乐鑫提供基于 ESP32、ESP32-S3 芯片的回声消除 (Acoustic Echo Cancelation, AEC) 算法,可以参考 算法例程
  • 需要注意,AEC 的效果不仅仅依赖于软件参数配置和调试,还依赖于硬件设计,例如播放不能失真、录音不能有杂音以及回升参考信号没有问题等等,此部分推荐参考乐鑫 ESP32-Lyrat-Mini 开发板 以及 ESP32-S3-Korvo-2 开发板 的设计。
19. A: 有接入百度语音或大模型的参考例程吗?
Q:请参考 dueros 例程

20. A: 乐鑫官网提供的网络电话例程是否支持 RTP?
Q:
  • ESP-ADF 当前默认提供的网络电话协议是基于 SIP 实现的 VoIP,协议部分有用到 RTP。
21. A: 我想在 ESP32-LyraT 的 I2C 接一个传感器使用,请问有如何读取 I2C 设备数据的例程吗?
Q: 请参考 i2c 例程

22. A: 如何输出 32 位的 I2S 音频数据?
Q: 参考以下代码
  1. i2s_stream_cfg_t i2s_writer_cfg = I2S_STREAM_CFG_DEFAULT();
  2. i2s_writer_cfg.type = AUDIO_STREAM_WRITER;
  3. i2s_writer_cfg.stack_in_ext = true;
  4. i2s_writer_cfg.task_core = 1;
  5. i2s_writer_cfg.need_expand = true;
  6. i2s_writer_cfg.expand_src_bits = 16;
  7. i2s_writer = i2s_stream_init(&i2s_writer_cfg);
23. A: 请问在哪里可以查看 ESP-ADF 版本支持的 ESP-IDF 版本情况?
Q: 请参考 ESP-ADF 下支持的 ESP-IDF 版本

24. A: 加入 DuerOS 是否会将 ESP32-LyraT 开发板的录音功能全程占用?
Q: 目前的设计是全程占用录音数据。但是您可以通过使能 I2S_streammulti_output 功能,让录音的数据通过这个通道输出到想要的地方。

25. A: 乐鑫的语音唤醒方案对环境噪声是否有一定的要求?
Q: 当前乐鑫的语音方案可以满足信噪比 5 dB 以内的环境要求,对于一些固定的噪音场景还可以做到 0 dB 以内(需要针对实际产品进行优化)。

26. A: ESP32 的 AI 开发板上有 AUX 输入,MIC 就无法拾音了吗?
Q:
  • ESP-ADF 开发框架可以选择多种方式拾音,有 MIC 输入和 Line-in。
  • 拾音方式选择如下:
  1. typedef enum {
  2.   AUDIO_HAL_CODEC_MODE_ENCODE = 1, /*! <select adc */      // MIC pickup
  3.   AUDIO_HAL_CODEC_MODE_DECODE, /*! <select dac*/
  4.   AUDIO_HAL_CODEC_MODE_BOTH, /*! <select both adc and dac */   //  MIC + speaker
  5.   AUDIO_HAL_CODEC_MODE_LINE_IN, /*! <set adc channel */,             // microphone pickup
  6. } Audio_hal_codec_mode_t;
  • 拾音方式配置如下:
  1. audio_board_handle_t board_handle = audio_board_init();
  2. audio_hal_ctrl_codec(board_handle->audio_hal, AUDIO_HAL_CODEC_MODE_DECODE, AUDIO_HAL_CTRL_START);     //若要 MIC 拾音,修改这个配置选项。
27. A: ESP32 如何连接麦克风?
Q:
  • ESP32 支持 DAC 模拟音频输出,可以使用它播放提示音等简单音频。
  • ESP32 支持 PWM 模拟音频输出,相比 DAC 效果稍好,演示代码:esp-iot-solution
  • ESP32 同时支持 I2S 数字音频输出,I2S 可配置引脚可以查看 《ESP32 技术规格书》 外设接口和传感器章节。
28. A: ESP32 芯片支持哪些音频格式?
Q: ESP32 支持的音频格式有 MP3、AAC、FLAC、WAV、OGG、OPUS、AMR、G.711 等,可参考 ESP-ADF SDK 下的说明。

29. A: ESP32 是否支持在线语音识别?
Q: 支持。可参考例程 dueros 例程speech_recognition 例程

30. A: Wi-Fi 和 FFT 可以同时使用吗?
Q: Wi-Fi 和 FFT 可同时使用。例如,可以在包含 FFT 功能的 律动灯示例 上直接添加 Wi-Fi 功能。