我们整理并分析了 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
Q: 一共有三种方法进行 element 读写
(1) callback 函数读写
- audio_element_set_write_cb(i2s_writer_el, i2s_write_cb, (void *)Input_file);
- audio_element_set_read_cb(i2s_reader_el, i2s_read_cb, (void *)Output_file);
- static int i2s_write_cb(audio_element_handle_t self, char *buffer, int len, TickType_t ticks_to_wait, void *context)
- {
- memcpy(buffer, YOUR CONTENT, LEN);
- }
- static int i2s_read_cb(audio_element_handle_t self, char *buffer, int len, TickType_t ticks_to_wait, void *context)
- {
- memcpy(YOUR NEED CONTENT, buffer, LEN);
- }
(2) ringbuf 读写
参考 element_wav_amr_sdcard
- ESP_LOGI(TAG, "[3.3] Create a ringbuffer and insert it between i2s_stream_reader and wav_encoder");
- ringbuf01 = rb_create(RING_BUFFER_SIZE, 1);
- audio_element_set_output_ringbuf(i2s_stream_reader, ringbuf01);
- audio_element_set_input_ringbuf(wav_encoder, ringbuf01);
- ESP_LOGI(TAG, "[3.4] Create a ringbuffer and insert it between wav_encoder and wav_fatfs_stream_writer");
- ringbuf02 = rb_create(RING_BUFFER_SIZE, 1);
- audio_element_set_output_ringbuf(wav_encoder, ringbuf02);
- audio_element_set_input_ringbuf(wav_fatfs_stream_writer, ringbuf02);
(3) 直接读写
- static audio_element_handle_t create_i2s_stream(int sample_rates, int bits, int channels, audio_stream_type_t type)
- {
- i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_DEFAULT_WITH_PARA(CODEC_ADC_I2S_PORT, sample_rates, bits, type);
- audio_element_handle_t i2s_stream = i2s_stream_init(&i2s_cfg);
- mem_assert(i2s_stream);
- ....
- return i2s_stream;
- }
- ESP_LOGI(TAG, "[ x ] Create and start input key service");
- audio_board_handle_t board_handle = audio_board_init();
- audio_hal_ctrl_codec(board_handle->audio_hal, AUDIO_HAL_CODEC_MODE_BOTH, AUDIO_HAL_CTRL_START);
- ESP_LOGI(TAG, "[x] Create i2s stream to write data to codec chip");
- audio_element_handle_t i2s_stream_writer = create_i2s_stream(RATE, BITS, CHANNEL, AUDIO_STREAM_WRITER);
- ESP_LOGI(TAG, "[x] Create i2s stream to read data from codec chip");
- audio_element_handle_t i2s_stream_reader = create_i2s_stream(RATE, BITS, CHANNEL, AUDIO_STREAM_READER);
- int read_bytes = audio_element_input(i2s_stream_reader, (void *)block_buffer, size * sizeof(int16_t));
- int write_bytes = audio_element_output(i2s_stream_writer, (void *)block_buffer, size * sizeof(int16_t));
3. A: 麦克风增益怎么调?
Q:
- #define BOARD_PA_GAIN (20) //board_def.h
- audio_hal_set_volume(board_audio_hal, 85); //local volume control
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
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_controller 和 esp_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 开发板 的设计。
Q:请参考 dueros 例程。
20. A: 乐鑫官网提供的网络电话例程是否支持 RTP?
Q:
- ESP-ADF 当前默认提供的网络电话协议是基于 SIP 实现的 VoIP,协议部分有用到 RTP。
- 可使用 Espressif SDK ESP-ADF 下的 VoIP 例程。
Q: 请参考 i2c 例程。
22. A: 如何输出 32 位的 I2S 音频数据?
Q: 参考以下代码
- i2s_stream_cfg_t i2s_writer_cfg = I2S_STREAM_CFG_DEFAULT();
- i2s_writer_cfg.type = AUDIO_STREAM_WRITER;
- i2s_writer_cfg.stack_in_ext = true;
- i2s_writer_cfg.task_core = 1;
- i2s_writer_cfg.need_expand = true;
- i2s_writer_cfg.expand_src_bits = 16;
- i2s_writer = i2s_stream_init(&i2s_writer_cfg);
Q: 请参考 ESP-ADF 下支持的 ESP-IDF 版本。
24. A: 加入 DuerOS 是否会将 ESP32-LyraT 开发板的录音功能全程占用?
Q: 目前的设计是全程占用录音数据。但是您可以通过使能 I2S_stream 的 multi_output 功能,让录音的数据通过这个通道输出到想要的地方。
25. A: 乐鑫的语音唤醒方案对环境噪声是否有一定的要求?
Q: 当前乐鑫的语音方案可以满足信噪比 5 dB 以内的环境要求,对于一些固定的噪音场景还可以做到 0 dB 以内(需要针对实际产品进行优化)。
26. A: ESP32 的 AI 开发板上有 AUX 输入,MIC 就无法拾音了吗?
Q:
- ESP-ADF 开发框架可以选择多种方式拾音,有 MIC 输入和 Line-in。
- 拾音方式选择如下:
- typedef enum {
- AUDIO_HAL_CODEC_MODE_ENCODE = 1, /*! <select adc */ // MIC pickup
- AUDIO_HAL_CODEC_MODE_DECODE, /*! <select dac*/
- AUDIO_HAL_CODEC_MODE_BOTH, /*! <select both adc and dac */ // MIC + speaker
- AUDIO_HAL_CODEC_MODE_LINE_IN, /*! <set adc channel */, // microphone pickup
- } Audio_hal_codec_mode_t;
- 拾音方式配置如下:
- audio_board_handle_t board_handle = audio_board_init();
- audio_hal_ctrl_codec(board_handle->audio_hal, AUDIO_HAL_CODEC_MODE_DECODE, AUDIO_HAL_CTRL_START); //若要 MIC 拾音,修改这个配置选项。
Q:
- ESP32 支持 DAC 模拟音频输出,可以使用它播放提示音等简单音频。
- ESP32 支持 PWM 模拟音频输出,相比 DAC 效果稍好,演示代码:esp-iot-solution。
- ESP32 同时支持 I2S 数字音频输出,I2S 可配置引脚可以查看 《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 功能。