• ESP32-A1S Audio kit 环境搭建


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

    原理图

    主模块

    输入输出及SD卡

    麦克风  我的是v2.1 MIC3 MIC4 没有贴片

     AMP 输出

     按键

     串口

     电源  V2.1 是阴影部分

    环境搭建

    1.download 安信可的githubGitHub - donny681/esp-adf: Espressif Audio Development Framework

    这里下载下安信可维护的git 版本,如果使用linux 可直接使用此分支进行开发(具体使用可参考这里 【安信可ESP32语音开发板专题①】ESP32-A1S音频开发板之离线语音识别控制LED灯_安信可科技的博客-CSDN博客)

    我这里用的是windows 所以需要后续操作

    2.git 下载 乐鑫的github

    乐鑫官方adfGitHub - espressif/esp-adf: Espressif Audio Development Framework

     

     gitmodules 像我这样更新下,然后cmd 执行下

    git submodule update --init

    然后环境变量指定下IDF_PATH  ADF_PATH

    然后cd到随便ADF目录下examples下随意一个工程,与之前一样idf.py build测试能否成功通过编译。

    3.适配ADF ESP32A1S

    首先修改esp-adf\components\audio_board目录下的三个配置文件,如下:

    1.1,CMakeLists.txt 添加内容如下:

    1. if (CONFIG_ESP_AI_THINKER_V2_2_BOARD)
    2. message(STATUS "Current board name is " CONFIG_ESP_AI_THINKER_V2_2_BOARD)
    3. list(APPEND COMPONENT_ADD_INCLUDEDIRS ./ai_thinker_audio_kit_v2_2)
    4. set(COMPONENT_SRCS
    5. ./ai_thinker_audio_kit_v2_2/board.c
    6. ./ai_thinker_audio_kit_v2_2/board_pins_config.c
    7. )
    8. endif()

    1.2,compoment.mk 添加如下:

    1. ifdef CONFIG_ESP_AI_THINKER_V2_2_BOARD
    2. COMPONENT_ADD_INCLUDEDIRS += ./ai_thinker_audio_kit_v2_2
    3. COMPONENT_SRCDIRS += ./ai_thinker_audio_kit_v2_2
    4. endif

    1.3,Kconfig.projbuild 修改如下

    1. choice AUDIO_BOARD
    2. prompt "Ai-Thinker Audio board"
    3. default ESP_AI_THINKER_V2_2_BOARD
    4. help
    5. Select an audio board to use with the ESP-ADF
    6. config AUDIO_BOARD_CUSTOM
    7. bool "Custom audio board"
    8. config ESP_LYRAT_V4_3_BOARD
    9. bool "ESP32-Lyrat V4.3"
    10. config ESP_LYRAT_V4_2_BOARD
    11. bool "ESP32-Lyrat V4.2"
    12. config ESP_LYRATD_MSC_V2_1_BOARD
    13. bool "ESP32-LyraTD-MSC V2.1"
    14. config ESP_LYRATD_MSC_V2_2_BOARD
    15. bool "ESP32-LyraTD-MSC V2.2"
    16. config ESP_LYRAT_MINI_V1_1_BOARD
    17. bool "ESP32-Lyrat-Mini V1.1"
    18. config ESP32_KORVO_DU1906_BOARD
    19. bool "ESP32_KORVO_DU1906"
    20. config ESP32_S2_KALUGA_1_V1_2_BOARD
    21. bool "ESP32-S2-Kaluga-1 v1.2"
    22. config ESP_AI_THINKER_V2_2_BOARD
    23. bool "ESP32-AiThinker-audio V2.2"
    24. 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引脚的代码。

    2. 添加音频驱动文件

    修改esp-adf\components\audio_hal文件夹下的CMakeLists.txt和compoment.mk

    2.1 CMakeLists.txt 修改后如下

    2.2 compoment.mk 添加以下内容:

    1. COMPONENT_ADD_INCLUDEDIRS += ./driver/ac101
    2. 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 方式或者自己进行硬件电阻的焊接进行适配

    1. /*
    2. * @Author: your name
    3. * @Date: 2020-01-26 10:13:06
    4. * @LastEditTime : 2020-01-28 19:24:42
    5. * @LastEditors : Please set LastEditors
    6. * @Description: In User Settings Edit
    7. * @FilePath: \esp-adf\components\audio_board\aithinker\board_def.h
    8. */
    9. /*
    10. * ESPRESSIF MIT License
    11. *
    12. * Copyright (c) 2019
    13. *
    14. * Permission is hereby granted for use on all ESPRESSIF SYSTEMS products, in which case,
    15. * it is free of charge, to any person obtaining a copy of this software and associated
    16. * documentation files (the "Software"), to deal in the Software without restriction, including
    17. * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
    18. * and/or sell copies of the Software, and to permit persons to whom the Software is furnished
    19. * to do so, subject to the following conditions:
    20. *
    21. * The above copyright notice and this permission notice shall be included in all copies or
    22. * substantial portions of the Software.
    23. *
    24. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    25. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
    26. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
    27. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
    28. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    29. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    30. *
    31. */
    32. #ifndef _AUDIO_BOARD_DEFINITION_H_
    33. #define _AUDIO_BOARD_DEFINITION_H_
    34. /* SD card related */
    35. #define SD_CARD_INTR_GPIO GPIO_NUM_34
    36. #define SD_CARD_INTR_SEL GPIO_SEL_34
    37. #define SD_CARD_OPEN_FILE_NUM_MAX 5
    38. #define HEADPHONE_DETECT GPIO_NUM_5
    39. #define PA_ENABLE_GPIO GPIO_NUM_21
    40. #define GREEN_LED_GPIO GPIO_NUM_22
    41. #define BLUE_LED_GPIO GPIO_NUM_19
    42. /* Touch pad related */
    43. #define TOUCH_SEL_SET GPIO_SEL_19
    44. #define TOUCH_SEL_PLAY GPIO_SEL_23
    45. #define TOUCH_SEL_VOLUP GPIO_SEL_18
    46. #define TOUCH_SEL_VOLDWN GPIO_SEL_5
    47. #define TOUCH_SET GPIO_NUM_19
    48. #define TOUCH_PLAY GPIO_NUM_23
    49. #define TOUCH_VOLUP GPIO_NUM_18
    50. #define TOUCH_VOLDWN GPIO_NUM_5
    51. extern audio_hal_func_t AUDIO_CODEC_AC101_CODEC_HANDLE;
    52. #define AUDIO_CODEC_DEFAULT_CONFIG() { \
    53. .adc_input = AUDIO_HAL_ADC_INPUT_LINE1, \
    54. .dac_output = AUDIO_HAL_DAC_OUTPUT_ALL, \
    55. .codec_mode = AUDIO_HAL_CODEC_MODE_BOTH, \
    56. .i2s_iface = { \
    57. .mode = AUDIO_HAL_MODE_SLAVE, \
    58. .fmt = AUDIO_HAL_I2S_NORMAL, \
    59. .samples = AUDIO_HAL_48K_SAMPLES, \
    60. .bits = AUDIO_HAL_BIT_LENGTH_16BITS, \
    61. }, \
    62. };
    63. /**
    64. * @brief Button Function Definition
    65. */
    66. #define FUNC_BUTTON_EN (1)
    67. #define ADC_DETECT_GPIO GPIO_NUM_36
    68. #define INPUT_KEY_NUM 6
    69. #if 1
    70. #define BUTTON_VOLUP_ID 18
    71. #define BUTTON_VOLDOWN_ID 5
    72. #define BUTTON_SET_ID 19
    73. #define BUTTON_PLAY_ID 23
    74. #define BUTTON_REC_ID GPIO_NUM_36
    75. #define BUTTON_MODE_ID GPIO_NUM_13
    76. #else
    77. #define BUTTON_VOLUP_ID 0
    78. #define BUTTON_VOLDOWN_ID 1
    79. #define BUTTON_SET_ID 2
    80. #define BUTTON_PLAY_ID 3
    81. #define BUTTON_REC_ID 4
    82. #define BUTTON_MODE_ID 5
    83. #endif
    84. #define INPUT_KEY_DEFAULT_INFO() { \
    85. { \
    86. .type = PERIPH_ID_ADC_BTN, \
    87. .user_id = INPUT_KEY_USER_ID_REC, \
    88. .act_id = BUTTON_REC_ID, \
    89. }, \
    90. { \
    91. .type = PERIPH_ID_ADC_BTN, \
    92. .user_id = INPUT_KEY_USER_ID_MODE, \
    93. .act_id = BUTTON_MODE_ID, \
    94. }, \
    95. { \
    96. .type = PERIPH_ID_ADC_BTN, \
    97. .user_id = INPUT_KEY_USER_ID_SET, \
    98. .act_id = BUTTON_SET_ID, \
    99. }, \
    100. { \
    101. .type = PERIPH_ID_ADC_BTN, \
    102. .user_id = INPUT_KEY_USER_ID_PLAY, \
    103. .act_id = BUTTON_PLAY_ID, \
    104. }, \
    105. { \
    106. .type = PERIPH_ID_ADC_BTN, \
    107. .user_id = INPUT_KEY_USER_ID_VOLUP, \
    108. .act_id = BUTTON_VOLUP_ID, \
    109. }, \
    110. { \
    111. .type = PERIPH_ID_ADC_BTN, \
    112. .user_id = INPUT_KEY_USER_ID_VOLDOWN, \
    113. .act_id = BUTTON_VOLDOWN_ID, \
    114. } \
    115. }
    116. #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

     

  • 相关阅读:
    无涯教程-JavaScript - ISODD函数
    mac电脑任务管理器 Things3 for Mac中文
    Java第5章 抽象类与接口
    分享一些实用的API接口
    [附源码]java毕业设计网络身份认证技术及方法
    【FPGA教程案例89】编译码2——使用vivado核实现RS信道编译码
    内存函数 memcpy,memmove ,memcmp
    基于Python实现的GN算法
    C++中将指针传递给函数
    leetcode Top100(16)缺失的第一个正数
  • 原文地址:https://blog.csdn.net/xinshuwei/article/details/126902062