
针对ESP32-A1S的音频开发板ESP32-Audio-Kit,之前就写了一边如何实现离线语音控制LED灯的博文,但是之前的博文中所用到的模组中的音频编解码芯片是AC101,需要我们自己写驱动程序。为了适配乐鑫的SDK,模组中的编解码芯片也换成了ES8388,乐鑫已经写好了驱动程序,我们二次开发不需要重新写编解码程序,这让我们的移植变得更加简单。
DuerOS是百度度秘事业部在2017年1月CES展推出的对话式人工智能操作系统,它赋予硬件设备与人沟通的能力,真正的将语音对话这种新的交互方式融入到了人们的生活之中。
本文将通过对乐鑫ESP-ADF-SDK中的dueros 例程进行移植,在安信可ESP32-Audio-Kit开发板上实现在线语音对话功能。







这里下载下安信可维护的git 版本,如果使用linux 可直接使用此分支进行开发(具体使用可参考这里 【安信可ESP32语音开发板专题①】ESP32-A1S音频开发板之离线语音识别控制LED灯_安信可科技的博客-CSDN博客)
我这里用的是windows 所以需要后续操作
乐鑫官方adfGitHub - espressif/esp-adf: Espressif Audio Development Framework

gitmodules 像我这样更新下,然后cmd 执行下
git submodule update --init
然后环境变量指定下IDF_PATH ADF_PATH
然后cd到随便ADF目录下examples下随意一个工程,与之前一样idf.py build测试能否成功通过编译。
首先修改esp-adf\components\audio_board目录下的三个配置文件,如下:
1.1,CMakeLists.txt 添加内容如下:
- if (CONFIG_ESP_AI_THINKER_V2_2_BOARD)
- message(STATUS "Current board name is " CONFIG_ESP_AI_THINKER_V2_2_BOARD)
- list(APPEND COMPONENT_ADD_INCLUDEDIRS ./ai_thinker_audio_kit_v2_2)
- set(COMPONENT_SRCS
- ./ai_thinker_audio_kit_v2_2/board.c
- ./ai_thinker_audio_kit_v2_2/board_pins_config.c
- )
- endif()
-
1.2,compoment.mk 添加如下:
- ifdef CONFIG_ESP_AI_THINKER_V2_2_BOARD
- COMPONENT_ADD_INCLUDEDIRS += ./ai_thinker_audio_kit_v2_2
- COMPONENT_SRCDIRS += ./ai_thinker_audio_kit_v2_2
- endif
1.3,Kconfig.projbuild 修改如下
- choice AUDIO_BOARD
- prompt "Ai-Thinker Audio board"
- default ESP_AI_THINKER_V2_2_BOARD
- help
- Select an audio board to use with the ESP-ADF
- config AUDIO_BOARD_CUSTOM
- bool "Custom audio board"
- config ESP_LYRAT_V4_3_BOARD
- bool "ESP32-Lyrat V4.3"
- config ESP_LYRAT_V4_2_BOARD
- bool "ESP32-Lyrat V4.2"
- config ESP_LYRATD_MSC_V2_1_BOARD
- bool "ESP32-LyraTD-MSC V2.1"
- config ESP_LYRATD_MSC_V2_2_BOARD
- bool "ESP32-LyraTD-MSC V2.2"
- config ESP_LYRAT_MINI_V1_1_BOARD
- bool "ESP32-Lyrat-Mini V1.1"
- config ESP32_KORVO_DU1906_BOARD
- bool "ESP32_KORVO_DU1906"
- config ESP32_S2_KALUGA_1_V1_2_BOARD
- bool "ESP32-S2-Kaluga-1 v1.2"
- config ESP_AI_THINKER_V2_2_BOARD
- bool "ESP32-AiThinker-audio V2.2"
- endchoice
将第一步中的ai_thinker_audio_kit_v2_2文件夹copy到esp-adf\components\audio_board目录下.board.c是板子的初始化代码,board_def.h是对板子IO口的定义, board_pins_config.c是配置iis和iic的IO引脚的代码。
修改esp-adf\components\audio_hal文件夹下的CMakeLists.txt和compoment.mk
2.1 CMakeLists.txt 修改后如下

2.2 compoment.mk 添加以下内容:
- COMPONENT_ADD_INCLUDEDIRS += ./driver/ac101
- COMPONENT_SRCDIRS += ./driver/ac101
2.3 在driver 文件夹下复制过来第一步的ac101文件夹
至此移植完成,cmd 内 在相应工程目录下输入 idf.py menuconfig

在Audio Hal 内选择安信可的版本
board_def.h 我做了稍微修改,我用ADF 2.4.1 版本会编译报错,改动记录
1.sdcard init 需要添加mode 参数
2.button define 定义
3.发现我的2.1版本未进行ADC 电阻焊接,所以无法使用adc 检测按键输入,这里可使用安信可的例程中的touchpad 方式或者自己进行硬件电阻的焊接进行适配
- /*
- * @Author: your name
- * @Date: 2020-01-26 10:13:06
- * @LastEditTime : 2020-01-28 19:24:42
- * @LastEditors : Please set LastEditors
- * @Description: In User Settings Edit
- * @FilePath: \esp-adf\components\audio_board\aithinker\board_def.h
- */
- /*
- * ESPRESSIF MIT License
- *
- * Copyright (c) 2019
- *
- * Permission is hereby granted for use on all ESPRESSIF SYSTEMS products, in which case,
- * it is free of charge, to any person obtaining a copy of this software and associated
- * documentation files (the "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the Software is furnished
- * to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all copies or
- * substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
- #ifndef _AUDIO_BOARD_DEFINITION_H_
- #define _AUDIO_BOARD_DEFINITION_H_
-
- /* SD card related */
- #define SD_CARD_INTR_GPIO GPIO_NUM_34
- #define SD_CARD_INTR_SEL GPIO_SEL_34
- #define SD_CARD_OPEN_FILE_NUM_MAX 5
-
- #define HEADPHONE_DETECT GPIO_NUM_5
- #define PA_ENABLE_GPIO GPIO_NUM_21
-
- #define GREEN_LED_GPIO GPIO_NUM_22
- #define BLUE_LED_GPIO GPIO_NUM_19
-
-
-
- /* Touch pad related */
- #define TOUCH_SEL_SET GPIO_SEL_19
- #define TOUCH_SEL_PLAY GPIO_SEL_23
- #define TOUCH_SEL_VOLUP GPIO_SEL_18
- #define TOUCH_SEL_VOLDWN GPIO_SEL_5
-
- #define TOUCH_SET GPIO_NUM_19
- #define TOUCH_PLAY GPIO_NUM_23
- #define TOUCH_VOLUP GPIO_NUM_18
- #define TOUCH_VOLDWN GPIO_NUM_5
-
- extern audio_hal_func_t AUDIO_CODEC_AC101_CODEC_HANDLE;
-
- #define AUDIO_CODEC_DEFAULT_CONFIG() { \
- .adc_input = AUDIO_HAL_ADC_INPUT_LINE1, \
- .dac_output = AUDIO_HAL_DAC_OUTPUT_ALL, \
- .codec_mode = AUDIO_HAL_CODEC_MODE_BOTH, \
- .i2s_iface = { \
- .mode = AUDIO_HAL_MODE_SLAVE, \
- .fmt = AUDIO_HAL_I2S_NORMAL, \
- .samples = AUDIO_HAL_48K_SAMPLES, \
- .bits = AUDIO_HAL_BIT_LENGTH_16BITS, \
- }, \
- };
-
- /**
- * @brief Button Function Definition
- */
- #define FUNC_BUTTON_EN (1)
- #define ADC_DETECT_GPIO GPIO_NUM_36
- #define INPUT_KEY_NUM 6
- #if 1
- #define BUTTON_VOLUP_ID 18
- #define BUTTON_VOLDOWN_ID 5
- #define BUTTON_SET_ID 19
- #define BUTTON_PLAY_ID 23
- #define BUTTON_REC_ID GPIO_NUM_36
- #define BUTTON_MODE_ID GPIO_NUM_13
- #else
- #define BUTTON_VOLUP_ID 0
- #define BUTTON_VOLDOWN_ID 1
- #define BUTTON_SET_ID 2
- #define BUTTON_PLAY_ID 3
- #define BUTTON_REC_ID 4
- #define BUTTON_MODE_ID 5
- #endif
-
- #define INPUT_KEY_DEFAULT_INFO() { \
- { \
- .type = PERIPH_ID_ADC_BTN, \
- .user_id = INPUT_KEY_USER_ID_REC, \
- .act_id = BUTTON_REC_ID, \
- }, \
- { \
- .type = PERIPH_ID_ADC_BTN, \
- .user_id = INPUT_KEY_USER_ID_MODE, \
- .act_id = BUTTON_MODE_ID, \
- }, \
- { \
- .type = PERIPH_ID_ADC_BTN, \
- .user_id = INPUT_KEY_USER_ID_SET, \
- .act_id = BUTTON_SET_ID, \
- }, \
- { \
- .type = PERIPH_ID_ADC_BTN, \
- .user_id = INPUT_KEY_USER_ID_PLAY, \
- .act_id = BUTTON_PLAY_ID, \
- }, \
- { \
- .type = PERIPH_ID_ADC_BTN, \
- .user_id = INPUT_KEY_USER_ID_VOLUP, \
- .act_id = BUTTON_VOLUP_ID, \
- }, \
- { \
- .type = PERIPH_ID_ADC_BTN, \
- .user_id = INPUT_KEY_USER_ID_VOLDOWN, \
- .act_id = BUTTON_VOLDOWN_ID, \
- } \
- }
- #endif
然后进行idf.py build
若无错会出现
![]()
然后进行idf.py -p COM3 flash (COM3 为我的串口号)
也可采用vscode 方式开发,集成ide
参考
1.https://blog.csdn.net/xh870189248/article/details/104160104
2.[004] [ESP32开发笔记] 音频开发框架ADF环境搭建——基于ESP-IDF_柯西的彷徨的博客-CSDN博客_esp32音频开发
3.ESP32 ADF windows开发环境搭建 适配ADF到ESP32A1S_killer-p的博客-CSDN博客_esp32-a1s
4.GitHub - ZYQ-FEIYUE/feiyue_ESP32: 本仓库主要开源ESP32系列的项目
5.ESP32-A1S模组开发从入坑到放弃-1_w1an的博客-CSDN博客_esp32-a1s