[ 物联网篇 ] ESP32 开发板测试亚马逊语音助手Alexa
首先需要了解ESP32是什么?
ESP32 是一套 Wi-Fi (2.4 GHz) 和蓝牙 (4.2) 双模解决方案,集成了高性能的 CPU 内核、超低功耗协处理器和丰富的外设。ESP32 采用 40 nm 工艺制成,具有最佳的功耗性能、射频性能、稳定性、通用性和可靠性,适用于各种应用和不同功耗需求。
乐鑫为用户提供完整的软、硬件资源进行 ESP32 设备的开发。乐鑫所研发的软件开发环境 ESP-IDF 能够帮助用户快速开发物联网 (IoT) 应用,满足用户对于 Wi-Fi、蓝牙、低功耗等性能的需求。
ESP32靠着硬件成本低,模块性能稳定,在市场上占有率还是很高的,虽然ESP32只是一个模块,但是集成的Wi-Fi (2.4 GHz) 和蓝牙 (4.2) 双模的解决方案值得去学。里面涉及的Wi-Fi (2.4 GHz) 和蓝牙 (4.2)相关知识可以去深入了解。
目标
最近使用ESP32的目标主要是公司项目需求,需要评估一些方案,需要前期做一些调查。这里把调查过程中遇到的问题点记录下
开发环境搭建
ESP32的官方文档写的真的是是很详细,不得不配置,小白都可以入手了。
- 工具链搭建
ESP32并不是ARM内核,但是安装编译工具链的方法方法是一样的
解压之后,路径添加到环境变量中
export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"
- Github下载源码
git clone --recursive https://github.com/espressif/esp-idf.git
- 设置 ESP-IDF 路径
设置源代码的环境路径这步骤最重要,无法编译通过。
在 ~/.profile 文件中加入以下指令,创建 IDF_PATH:
export IDF_PATH=~/esp/esp-idf
- 编译示例代码
cp -r $IDF_PATH/examples/get-started/hello_world .
cd ~/esp/hello_world
// 配置方法和Linux Kernel 方法很像
make menuconfig
- 下载固件
make flash
详细步骤可以查看官方文档,这里只是记录的笔记/框架,望读者知晓。
另外一个目的主要是验证方案的可行性
Alexa方案验证
开发板的硬件资源:
-
ESP32-LyraTD-MSC 基于支支持蓝牙牙/Wi-Fi 双模的 ESP32-WROVER-B 模组和一一个数
字信号处理理器器 (DSP) 实现,具备一一个三⻨麦克⻛风阵列列,用用于降噪、回波消除等功能。 -
ESP32-WROVER-B 是通用型 Wi-Fi+BT+BLE MCU 模组,主要用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和 MP3 解码等。配置了 4 MB SPI flash 和 8 MB SPI PSRAM
-
模组采用 ESP32 系列的 ESP32-D0WD *。芯片具有可扩展、自适应的特点。两个 CPU 核可以被单独控制。CPU 时钟频率的调节范围为 80 MHz 到 240 MHz
-
集成了传统蓝牙、低功耗蓝牙(BLE) 和 Wi-Fi。支持极大范围的通信连接,也支持通过路由器直接连接互联网;而蓝牙可以让用户连接手机或者广播 BLE Beacon 以便于信号检测。
-
芯片的睡眠电流小于 5 μA。模组支持的数据传输速率高达 150 Mbps,天线输出功率达到 20 dBm。
-
ESP32 的操作系统是带有 LwIP(小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用) 的 freeRTOS,还内置了带有硬件加速功能的 TLS 1.2。芯片同时支持 OTA 加密升级
采用ESP32-LyraTD-MSC开发板跑通Amzeon Alexa 语音助手,并实际测试效果。
官方已经支持的功能,基本常用的功能已经支持。
Alexa:
- Basic Alexa conversation
- Alexa dialogues and multi-turn
- Audio Streaming and Playback: Saavn, Amazon music, TuneIn (Only limited stations are supported as of now)
- Audio Book Support: Kindle, Audible
- Volume control via Alexa command
- Seek support for Audible
- Alerts/Timers, Reminders, Notifications
主要代码已经在GitHub 开源,大概浏览了一下代码,发现其中Amzeon Alexa 主要是以库的方式提供的。这就限制了平台的拓展性,Alexa相关的部分只能以原厂更新为主,自己也改动不了,失望之一。
如下:
➜ esp-voice-assistant git:(master) tree
.
├── component.mk
├── include
│ ├── alerts.h
│ ├── alexa.h
│ ├── audio_player.h
│ ├── avs_config.h
│ ├── dialogflow.h
│ ├── equalizer_controller.h
│ ├── gva.h
│ ├── playback_controller.h
│ ├── speaker.h
│ ├── speech_recognizer.h
│ ├── tone.h
│ ├── voice_assistant_app_cb.h
│ └── voice_assistant.h
└── lib
├── libalexa.a // 亚马逊的Alexa
├── libdialogflow.a
└── libgva.a // 谷歌的语音助手
2 directories, 17 files
先下载源码,运行起来,看效果:
Clone all the repositories
$ git clone --recursive https://github.com/espressif/esp-idf.git
$ cd esp-idf; git checkout release/v3.1; cd ..
$ git clone https://github.com/espressif/esp-avs-sdk.git //文档中是这样的,
但是github官方仓库是esp-va-sdk,应该是文档没有来得及更新。
git clone https://github.com/espressif/esp-va-sdk.git
打补丁
$ cd esp-idf
$ git apply ../esp-avs-sdk/esp-idf-patches/memset-i2s-dma-buffers-zero.patch
$ git apply ../esp-avs-sdk/esp-idf-patches/esp-tls-Add-support-for-global-CA-store.-All-mbedtls.patch
详细看下补丁memset-i2s-dma-buffers-zero.patch的提交记录,应该是修复bug而已
memset(finish_desc->buf, 0, finish_desc->size);
重点的是这个esp-idf-patches/esp-tls-Add-support-for-global-CA-store.-All-mbedtls.patch补丁,
涉及CA加密通讯相关问题,
编译
cd esp-avs-sdk/examples/<example_board_directory> // 这里选择的是examples/lyratd_msc_sr/
$ export IDF_PATH=/path/to/esp-idf // 设置源码的环境变量
$ export ESPPORT=/dev/cu.SLAB_USBtoUART (or /dev/ttyUSB0 or /dev/ttyUSB1 on Linux or COMxx on MinGW)
$ make -j 8 flash VOICE_ASSISTANT=<alexa/gva/dialogflow> monitor // 通过编译时候的传参确定使用alexa还是gva
看到编译的Makefile
ifeq ("$(VOICE_ASSISTANT)","gva")
$(error GVA is not supported with lyratd_msc_sr app. Please use lyrat app.)
else ifeq ("$(VOICE_ASSISTANT)","dialogflow")
$(error DialogFlow is not supported with lyratd_msc_sr app. Please use lyrat app.)
else
PROJECT_NAME := alexa
CPPFLAGS += -DALEXA
endif
编译完成之后,生成的固件进行烧录:
├── [2.6M] alexa.bin
├── [ 22K] bootloader.bin
└── [3.0K] partitions.bin
烧录的时候注意: 长按开发板“Boot”键,同时按“RST”键进入入烧写模式
正常的烧录log :
Toolchain path: ESP32/Toolchain/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
Toolchain version: crosstool-ng-1.22.0-80-g6c4433a
Compiler version: 5.2.0
Python requirements from esp-idf/requirements.txt are satisfied.
App "alexa" version: ESP-VA-v1.0b1r7-2-g063d26f
esp-va-sdk/components/esp-voice-assistant/component.mk:7: warning: undefined variable 'VOICE_ASSISTANT'
esp-va-sdk/components/esp-voice-assistant/component.mk:9: warning: undefined variable 'VOICE_ASSISTANT'
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)...
esptool.py v2.6
Serial port /dev/ttyUSB0
Connecting......
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, BLK3 partially reserved, Coding Scheme 3/4
MAC: 30:ae:a4:cb:d5:c0
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 16MB
Flash params set to 0x024f
Compressed 26544 bytes to 15789...
Wrote 26544 bytes (15789 compressed) at 0x00001000 in 0.2 seconds (effective 912.0 kbit/s)...
Hash of data verified.
Compressed 2850816 bytes to 1925437...
Wrote 2850816 bytes (1925437 compressed) at 0x00010000 in 31.3 seconds (effective 729.7 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 105...
Wrote 3072 bytes (105 compressed) at 0x00008000 in 0.0 seconds (effective 9776.1 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
以上的步骤详细见文档 esp-va-sdk/README-Getting-Started.md
总结
-
ESP32官方提供的开发环境文档比较完善,开发环境同时也可以在Ubuntu 搭建起来,开发更便利。
-
ESP32提供的Amazon Alexa解决方案的的源码由esp-idf 和esp-va-sdk仓库构成。esp-idf为官方的IOT解决方案,esp-va-sdk为Alexa解决方案,两者有依赖关系,编译esp-va-sdk的时候回去调用esp-idf/components其中的一下库。
-
源码中 Amazon alexa部分并没有开源,以动态库的方式提供给开发商。个人觉得,亚马逊官方已经开源avs-device-sdk,之前详细介绍过从零开始,搭建 AI 音箱 Alexa 语音服务,这一套主要跑在Linux平台,硬件成本也高。这也是ESP8266的优势所在。
-
别人写的评估方案,值得一看 Amazon Alexa硬件方案选型
实际的测试效果和源码开发待续!!!