示例介绍

advanced_examples

1. algorithm
本例程的功能是在播放音乐的同时将麦克风收录的声音先进行回声消除,然后存储到 microSD 卡中。

本例程有两条管道,第一条管道读取 flash 中的 MP3 音乐文件并播放;第二条管道是录音的过程,读取到的数据经过 AEC、AGC、NS 算法处理,再编码成 WAV 格式,最后保存在 microSD 卡中。最后我们可以比较原始音频与录制的音频之间的差异。

  • 播放 MP3 的管道:
1
[flash] ---> mp3_decoder ---> filter ---> i2s_stream ---> [codec_chip]
  • 录制 WAV 的管道:
1
[codec_chip] ---> i2s_stream ---> filter ---> algorithm ---> wav_encoder ---> fatfs_stream ---> [sdcard]

2. audio_mixer_tone
此示例展示了如何使用 ADF 进行多路混音。

1
2
3
4
5
6
7
8
9
10
[sdcard] ---> file_mp3_reader ---> mp3_decoder ---+ 
|
[http] -----> http_mp3_reader ---> mp3_decoder-----|
|
|-------> Audio Mixer ----> i2s_stream_writer ---> [codec_chip] --->PA
[tone] -----> tone_aac_reader ---> aac_decoder-----| |
| |-----> Sdcard
[reorder] ----------> i2s read ------------------- | |
| |-----> Internet
[Others]

该例程中的控制命令有如下

序号 命令 描述或用法 关联函数
01 play 使用 esp_audio 播放单一音频通道。目前play只能播放一录,其他的可以使用 pmixer 播放 cli_play
02 stop 停止播放由 play 启动的音频播放 cli_stop
03 pmixer 播放单一音频通道。可以同时使用不同的槽位播放多个通道,做到混音的效果 cli_play_mixer
04 smixer 停止由 pmixer启动的播放 cli_replay_mixer
05 rpmixer 重新播放pmixer的音频。确保pmixer处于停止或完成的状态后再重新播放 cli_stop_mixer
06 dmixer 销毁pmixer,销毁后可以让被释放的槽位被其他通道重新使用 cli_destory_mixer
07 gmixer 设置相应槽位银牌的增益值 cli_mixer_gain_set
08 record 开始录音或者停止录音并同时播放出来或暂停, 可以模拟卡拉ok场景 recorder_fn

3. dlna
本例程演示了在 ESP-ADF 框架中运行 UPnP/DLNA 媒体渲染器的过程。
数字生活网络联盟 (Digital Living Network Alliance, DLNA) 旨在解决个人 PC、消费电器和移动设备在内的无线网络和有线网络的互联互通,目的是打通数字媒体和内容服务之间共享的一种解决的方案。

4. downmix_pipeline
本例程利用 ADF 多输入管道实现了多个音频文件向下混叠 (Down-mix) 的功能,多个管道结构如下图:

1
2
3
4
mp3 base input stream ---> resample ---> down-mix ---> I2S output stream ---> codec chip
^
|
mp3 new come input stream ---> resample ---

本例程使用的是双通道 44.1 kHz 采样率的 mp3 为基础音乐,单通道 16 kHz 采样率的 mp3 为混入音频。先对两首音频分别解码和重采样到 48 kHz,然后对 48 kHz 采样率的 PCM 进行了 Down-mix 的功能演示。

本例程的 Downmixing 过程如下图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     ^
gain|
|
|
|
| base music newcome music base music
0dB|————————————————————————— ————————————————————————————— —————————————————————————————>
| \ / \ /
| \ / \ /
| \/ \/
| /\ /\
| / \ / \
| newcome music / \ base music / \ newcome music
-10dB|------------------------- ————————————————————————————— ------------------------------
| |< t1 >| |< t2 >|
| TRANSMITTIME TRANSMITTIME
| |
| [mode-key event]
|
|----------------------------------------------------------------------------------------------------------->
| timeline
|

5. flexble_pipeline
此示例展示了如何使用 ADF 管道动态地播放不同的音频,涉及了 link、breakup、relink 等管道操作。

  1. 当播放或切换播放 AAC 格式的音频时,先暂停前一个 MP3 播放管道并分解掉 MP3 播放管道,然后重新连接组成新的 AAC 播放管道,组合完成后的 AAC 音频管道如下:
1
[sdcard] ---> file_aac_reader ---> aac_decoder ---> i2s_stream_writer ---> [codec_chip]
  1. 当播放或切换播放 MP3 格式的音频时,先暂停前一个 AAC 播放管道并分解掉 AAC 播放管道,然后重新连接组成新的 MP3 播放管道,组合完成后的 MP3 音频管道如下:
1
[sdcard] ---> file_mp3_reader ---> mp3_decoder ---> i2s_stream_writer ---> [codec_chip]

6. http_play_and_save_to_file
此示例演示了在HTTP 流的管道中使用 ADF 的多输出管道接口,实现一边播放网络歌曲,一边下载歌曲到 microSD 卡中的过程。

多输出管道的结构如下图所示:

1
2
3
4
http_stream_reader ---> mp3_decoder ---> i2s_stream ---> codec chip
|
v
raw_stream ---> fatfs_stream ---> SD card

在第一个管道中,http_stream_reader 从网络获取 MP3 歌曲。然后数据经过 MP3 解码器解码,解码后数据通过 I2S 流传输到 codec_chip。最后,PA 驱动扬声器播放音乐。

另一个管道的前端是 raw_stream,它通过多输出管道接口连接到 http_stream_reader,读取到的数据最终由 fatfs_stream 写入到 microSD 卡中存储。

通过使用 ADF 的多输出管道接口,我们连接了两条管道,不仅完成了网络音频的播放,同时也完成了网络音频下载到 microSD 卡中的操作。

7. multi-room
ESP Multi-Room Music 是一种基于 Wi-Fi 的多扬声器互联共享音乐通信协议。该协议连接多个音箱并组建成群组,群组的音箱可以同步播放和控制音乐,能够方便的实现影院级立体声环绕系统。

8. nvs_dispatcher
ADF 在外部 PSRAM 中创建和使用了较多堆栈任务,任务运行时候禁止进行 flash 操作。
此示例演示了 ADF 此类任务如何使用 esp_dispatchernvs_action 两种方式进行 NVS 的写入和读取的操作。

9. wifi_bt_ble_coex
本例程创建了几个 GATT 服务并启动了 ADV,ADV 名称为 BLUFI_DEVICE,然后等待连接,可以将设备配置为连接 Wi-Fi 和 BluFi 服务。当 Wi-Fi 连接时,例程将演示如何创建 HTTP STREAM 模块,它可以播放带有 HTTP URI 的音乐。
本例程的经典蓝牙部分实现了 A2DP SINK 部分。程序启动后,智能手机等蓝牙设备可以发现名为 ESP_ADF_COEX_EXAMPLE 的设备,建立连接后,使用 AVRCP 配置文件控制蓝牙音乐状态。

audio_processing

1. pipeline_alc
本例程演示了 ADF 的自动电平控制 (automatic level control, ALC) 的使用方法,它通过检测语音信号的幅值来判断是否超过设定的 Max/Min 值。如果超过出范围,则根据设定增益来调整音频信号的幅值,使其介于一个合理的范围内,从而达到控制音量的目的。

ADF 当前提供了以下两种方法实现 ALC 设置音量。

  • 对于使能 USE_ALONE_ALC 的管道如下:

    1
    sdcard ---> fatfs_stream ---> wav_decoder ---> ALC ---> i2s_stream ---> codec_chip ---> speaker
  • 对于未使能 USE_ALONE_ALC 的管道如下:

    1
    sdcard ---> fatfs_stream ---> wav_decoder ---> i2s_stream ---> codec_chip ---> speaker

2. pipeline_audio_forge
此示例展示了如何使用 ESP-ADF 的多输入管道通过音频塑造 (audio forge) 处理播放多个音频文件。

音频塑造包含了重采样 (resample)、向下混叠 (downmix)、自动电平控制 (ALC)、均衡器 (equalizer)、变声 (sonic) 等处理过程,通过 audio_forge 的结构体成员 component_select 的掩码来组合这几个功能的选择。

此例程音频塑造的管道如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

---> fatfs_stream ---> wav_decoder ---> raw_stream --->
| |
[sdcard] ---> (NUMBER_SOURCE_FILE) ---> audio_forge ---> i2s_stream ---> [codec_chip]
| | ▲
---> fatfs_stream ---> wav_decoder ---> raw_stream ---> |
┌───────┴────────┐
│ resample │
│ downmix │
│ ALC │
│ equalizer │
│ sonic │
└────────────────┘

3. pipeline_equalizer
本例程演示了使用 ADF 的均衡器 (equalizer) 处理 WAV 音频文件播放的过程,其处理过程的管道数据流如下:

1
sdcard ---> fatfs_stream ---> wav_decoder ---> equalizer ---> i2s_stream ---> codec_chip

首先 fatfs_stream 读取位于 microSD 卡中的名为 test.wav 音频文件(此文件需用户自备,并预先放置于 microSD 卡中),然后 WAV 文件数据经过 wav_decoder 解码器解码,解码后的数据再经过均衡器处理,最后数据通过 I2S 发送到 codec 芯片播放出来。

4. pipeline_passthru
本例程演示了如何把 aux_in 端口接收到的音频透传到耳机或扬声器接口输出。
音频透传的应用场景:

  • 在启用新硬件设计时,从头到尾验证音频管道完整性。
  • 通过音频路径检查左右声道的一致性。
  • 与音频测试装置结合使用测量 THD+N,用于生产线测试或性能评估。

本例程透传的管道如下:

1
[codec_chip] ---> i2s_stream_reader ---> i2s_stream_writer ---> [codec_chip]

5. pipeline_resample
本例程演示了 ADF 的重采样 (resample) 使用方法,录音的时候把 48000 Hz、16 位、2 通道的音频数据重采样为 16000 Hz、16 位、1 通道的数据,然后编码为 WAV 格式并写入 microSD 卡中,回放的时候把 microSD 卡中的 16000 Hz、16 位、1 通道的 WAV 文件读出,重采样数据为 48000 Hz、16 位、2 通道,然后通过 I2S 外设把录音数据播放出来。

  1. 对于录音过程:
  • 设置 I2S 并以 48000 Hz、16 位、立体声的采样率获取音频。
  • 使用重采样过滤器转换数据为 16000 Hz、16 位、1 通道。
  • 使用 WAV 编码器进行数据编码。
  • 写入 microSD 卡。

录音的重采样并保存到 microSD 卡的管道如下:

1
mic ---> codec_chip ---> i2s_stream ---> resample_filter ---> wav_encoder ---> fatfs_stream ---> sdcard
  1. 对于录音回放过程:
  • 读取 microSD 卡录制的文件,采样率为 16000 Hz、16 位、1 通道。
  • 用 WAV 解码器解码文件数据。
  • 使用重采样过滤器转换数据为 48000 Hz、16 位、2 通道。
  • 将音频写入 I2S 外设。

读取 microSD 卡的文件重采样后通过 I2S 播放管道如下:

1
sdcard ---> fatfs_stream ---> wav_decoder ---> resample_filter ---> i2s_stream ---> codec_chip ---> speaker

6. pipeline_sonic
本例程演示了 ADF 变声器 (sonic) 的使用方法,例程创建了两个管道,一是录音管道,用于录制声音到 microSD 卡,触发条件是长按 [REC] 录音键,二是播放管道,用于读取并播放 microSD 卡中 rec.wav 文件,触发条件是释放长按的 [REC] 录音键。变声器可以通过 [Mode] 按键调整音频倍速和音高变化。

变声器可以通过下列参数来调整音频的输出效果:

  • 音频倍速
  • 音调

录音保存到 microSD 卡的管道如下:

1
2
[mic] ---> codec_chip ---> i2s_stream ---> wav_encoder ---> fatfs_stream ---> [sdcard]

读取 microSD 卡的 WAV 文件,然后经过变声器处理的播放管道如下:

1
2
[sdcard] ---> fatfs_stream ---> wav_decoder ---> sonic ---> i2s_stream ---> [codec_chip]

7. pipeline_spiffs_amr_resample
本例程演示了使用 ADF 的 SPIFFS 流保存录音文件并读取、播放音频文件的方法,录音时,I2S 参数为 48000 Hz、16 位、双通道,重采样为 8000 Hz、16 位、单通道的数据,然后将数据编码为 AMR-NB 格式并写入 SPIFFS 中。回放时,读取 SPIFFS 中的 8000 Hz、16 位、单通道的 AMR-NB 文件,数据解码重采样为 48000 Hz、16 位、双通道,然后通过 I2S 外设把录音数据播放出来。

  1. 对于录音过程:
  • 设置 I2S 并以 48000 Hz、16 位、立体声的采样率获取音频。
  • 使用重采样过滤器转换数据为 8000 Hz、16 位、单通道。
  • 使用 AMR-NB 编码器进行数据编码。
  • 写入 SPIFFS。

录音的重采样并保存到 SPIFFS 的管道如下:

1
[mic] ---> codec_chip ---> i2s_stream ---> resample_filter ---> amrnb_encoder ---> spiffs_stream ---> [flash]
  1. 对于录音回放过程:
  • 读取 SPIFFS 录制的文件,采样率为 8000 Hz、16 位、单通道。
  • 用 AMR-NB 解码器解码文件数据。
  • 使用重采样过滤器转换数据为 48000 Hz、16 位、双通道。
  • 将音频写入 I2S 外设播放。

读取 SPIFFS 的文件重采样后通过 I2S 播放管道如下:

1
[flash] ---> spiffs_stream ---> amrnb_decoder ---> resample_filter ---> i2s_stream ---> codec_chip ---> [speaker]

checks

1. check_board_buttons
ADF 定义了音频开发板常用的 6 种功能按键,即录音键 (Rec)、模式键 (Mode)、 播放键 (Play)、设置键 (Set)、音量减键 (Vol-)、音量加键 (Vol+),用户可以通过 input_key_service 来实现每个按键的短按下、短按下释放、长按下、长按下释放等 4 种按键事件。在不同的开发板上,六个按键实现按键检测的方式各有不同,有 ADC 模拟电压检测GPIO 中断输入电容触摸 等方式。

本例子程序调用 input_key_service 使用 6 种功能按键和 4 种按键事件,可用于对开发板按键进行调试和检测。

2. check_display_led
ADF 从功能角度为定义了一系列常见的 显示模式,在不同硬件环境下,用户可使用统一接口 display_service_set_pattern 设置显示模式。目前已添加的驱动 LED 方式有 PWMAW2013IS3xWS2812

本例程主要演示如何操作 LED 模式,以及验证所有 LED 是否正常工作,更多信息请参考 ADF 入门指南

cli

本例程演示了 ADF 的 periph_console 控制 esp_audio API 和其他系统 API 的方法。

在熟记命令的前提下,使用命令行接口 (command-line interface, CLI) 可以在 ADF 项目的快速 debug 分析和快速 feature 测试中有较大的优势。

当前支持的命令如下表:

序号 命令 描述或用法 关联函数
01 play 播放指定序号的音乐,命令为 “play [index or url] [byte_pos]”
1. “play”
2. 扫描后播放指定序号的音乐,命令为 “play index_number”
3. 从指定网址播放,命令为 “play url_path”
cli_play
02 pause 暂停播放音乐 cli_pause
03 resume 继续播放 cli_resume
04 stop 停止播放 cli_stop
05 setvol 设置音量 cli_set_vol
06 getvol 获取音量 cli_get_vol
07 getpos 获取位置,单位为秒 get_pos
08 seek 寻找位置,单位为秒 cli_seek
09 duration 获取音乐时长 cli_duration
10 tone 插入并播放提示音 cli_insert_tone
11 stone 定时关闭提示音 cli_stop_tone
12 setspeed 设置速度 cli_set_speed
13 getspeed 获取速度 cli_get_speed
14 join 作为 station 与 Wi-Fi AP 连接 wifi_set
15 wifi 获取已连接的 AP 信息 wifi_info
16 led Lyrat-MSC LED 灯带模式 led
17 scan 扫描 microSD 卡中的音乐文件,命令为 “scan [path]”,如 “scan /sdcard” playlist_sd_scan
18 list 显示扫描的播放列表 playlist_sd_show
19 next 播放下 x 个文件,命令为 “next [step]” playlist_sd_next
20 prev 播放上 x 个文件,命令为 “prev [step]” playlist_sd_prev
21 mode 设置自动播放模式,命令为 “mode [value]”, 0 表示仅播放一次,其他值表示列表内循环播放 playlist_set_mode
22 reboot 重启系统 sys_reset
23 free 获取系统空闲内存 show_free_mem
24 stat 显示所有 FreeRTOS 任务处理时间 run_time_stats
25 tasks 获取正在运行的任务信息 task_list
26 system 获取所有 FreeRTOS 任务状态信息 task_real_time_states

cloud_services

1. google_translate_device
这个应用程序演示了使用Google服务将一种语言的语音转换为另一种语言的语音。

按下[Rec]按钮,用中文说些什么,然后释放按钮。设备将使用三个Google服务执行以下操作:

  • Google云语音转文本 - 将录制的音频文件转换为中文文本 - 语言支持
  • Google翻译 - 将中文文本翻译成英文 - 语言支持
  • Google TTS - 将翻译后的文本转换为音频文件 - 支持的语音

最后,设备将播放包含以英语发音的接收到的音频文件。通过此演示,您可以通过定义语言代码来更改使用的语言,请参考上述支持的语言。

2. pipeline_aws_polly_mp3
此示例的目的是展示如何使用 ADF 播放由亚马逊 (Amazon) 在线语音合成服务 Amazon Polly 生成的 MP3 音频。本示例默认是英文文本,但也支持其他一些其他国家的语言,更多的技术细节可以参考 Amazon Polly 页面。

获取亚马逊在线语音合成 MP3 音频管道如下:

1
[amazon_polly_server] ---> http_stream ---> mp3_decoder ---> i2s_stream ---> [codec_chip]

3. pipeline_baidu_speech_mp3
此示例的目的是展示如何使用 ADF 播放由百度在线语音合成 (text-to-speech, TTS) 服务生成的音频。本示例默认是中文文本,但也支持其他一些语言,更多的技术细节可以参考 百度语音合成文档 页面。

获取百度在线语音合成 MP3 音频管道如下:

1
[baidu_tts_server] ---> http_stream ---> mp3_decoder ---> i2s_stream ---> [codec_chip]

display

1. lcd_camera
本例程演示调用 esp32-camera API 获取一张图片, 最终显示在 LCD 上。示例分辨率为 320 * 240。例程中有两种测试模式

  • 从 camera 中获取 YUV422 格式的图片, 然后转换成 RGB565 格式图片并显示在 LCD 上
    [camera YUV422] -> [color converted to RGB565] -> [display on LCD]
  • 从 camera 中获取 RGB565 格式的图片并显示在 LCD 上
    [camera RGB565] -> [display on LCD]

2. lcd_jpeg
本例程演示调用 esp_jpeg_dec API 解码 JPEG 图片,并显示在 LCD 上。示例图片分辨率为 320 * 244。

3. led_pixels
例程演示了通过 ESP32-C3 获取音频数据,再经过 FFT 或响度计算后输出到 LED 像素矩阵/灯环进行显示的过程。例程中实现了部分样式,可在 main.c 用 cnv_set_cur_pattern 进行配置。LED 驱动支持了 WS2812,可使用 SPI、RMT 输出。

注意:《ESP32-C3 物联网工程开发实战》中 ESP32-C3 的默认固件为当声音有效值超过 default_rms_min 时,LED 随着音乐律动,否则为流水灯效果。 default_rms_min 可通过 menuconfig -> Example Configuration -> Min audio rms threshold 配置。

4. music_player
本例程使用 LVGL 图形库绘制了一个音乐播放器的界面,支持触摸屏控制。本例程参考 LVGL 原始 lv_demo_music 工程。

dueros

本例程主要功能是连接百度 DuerOS 3.2 云端并进行语音交互,可以适用于智能音箱产品、智能玩具、语音控制设备等。此示例是一个综合性较强的例程,使用了 ADF 提供的高封装简易实用接口。建议用户构建项目时,优先使用 ADF 提供的高封装接口,可快速简便地构建项目。

其中,esp audio 处理音频播放,wifi service 接口管理配网和连接 Wi-Fi,audio recorder 负责唤醒和语音数据管理,display service 管理系统指示灯,Dueros service 连接 DuerOS,esp_periph_set_register_callback 管理按键事件,也可以使用 Key service 按键服务来管理按键。

此外,本例程需要预先在 百度 DuerOS 开放平台 申请 DuerOS 的 profile,并替换 ADF_PATH/components/dueros_service/duer_profile 中的空文件。

get-started

1. pipeline_a2dp_sink_and_hfp
本例程是 A2DP sink 和 HFP 例程,使用经典蓝牙的 A2DP 协议进行音频流分发接收,使用 AVRCP 协议进行媒体信息通知控制,还可以作为 HFP Hands Free Unit 设备接收呼入的电话。

此例程完整管道如下:

1
[Bluetooth] ---> bt_stream_reader ---> i2s_stream_writer ---> codec_chip ---> speaker

2. pipeline_tcp_client
本例程在 ADF 框架下实现在线 TCP 流的 MP3 音频播放演示。

本例程的管道如下图:

1
[tcp_server] ---> tcp_stream ---> mp3_decoder ---> i2s_stream ---> [codec_chip]

3. play_mp3_control
本例程介绍了 mp3 和 I2S 两个 element 实现 MP3 音乐的播放。mp3 element 调用函数回调 read_cb 读取 flash 中的音乐文件,解码后用 I2S element 输出音乐。

同时支持了按键控制功能,如:Play 按键支持开始、暂停、恢复播放; Vol+ 音量加和 Vol- 音量减;以及 MODE/FUNC 按键实现切换不同码率(8000 Hz, 22050 Hz, 44100 Hz)的音频播放,set 键结束示例。

korvo_du1906

本例程演示了使用 ESP32-Korvo-DU1906 开发板与度家 - AIOT 语音平台协作的过程。开发板支持以下功能:

  • ASR、TTS 和 NLP
  • 蓝牙音乐
  • 低功耗蓝牙 Wi-Fi 配网
  • OTA
  • Mesh 和红外控制器

开发板与平台协作,让智能扬声器或是 AIOT 设备的开发更加便捷。

ota

本例程在 ADF 框架下演示配置空中升级服务 (OTA Service) 更新应用 (app) 和数据 (data) 分区的例子。

此例程可以配置从 microSD 卡中升级数据分区,例程演示了从 microSD 卡升级语音提示音数据分区。此外,此例程也演示了从 HTTP 服务器获取应用二进制固件更新升级的操作。

player

1. pipeline_a2dp_sink_stream
本例程是 A2DP SINK 例程,使用经典蓝牙的 A2DP 协议进行音频流分发接收,使用 AVRCP 协议进行媒体信息通知控制。蓝牙音箱或者蓝牙耳机等应用可以用此示例作为基本功能参考。

A2DP SINK 的完整管道如下:

1
aadp_source ---> aadp_sink_stream ---> i2s_stream_writer ---> codec_chip ---> speaker

本例程作为 A2DP 的 SINK 角色,需要和 A2DP SOURCE(一般可以是手机)配对连接,用来播放 A2DP SOURCE 下发的音频。

2. pipeline_a2dp_source_stream
本例程是 A2DP SOURCE 例程,使用经典蓝牙的 A2DP SOURCE 角色进行音频流分发,应用程序可以利用这个例子来实现便携式音频播放器或麦克风应用,将音频流传输到 A2DP SINK 接收设备。

A2DP SOURCE 的完整管道如下:

1
sdcard ---> fatfs_stream ---> mp3_decoder ---> bt_stream ---> aadp_source

本例程作为 A2DP 的 SOURCE 角色,需要和 A2DP SINK(一般是蓝牙音箱)配对连接,用来播放下发的音频。

3. pipeline_bt_sink
本例程演示了 ADF 的经典蓝牙接收端 (sink) 的使用方法,将手机 (source) 播放的歌曲通过蓝牙传输到开发板播放出来。

开发板接收语音数据并解码播放的管道如下:

1
[Bluetooth] ---> bt_stream_reader ---> i2s_stream_writer ---> [codec_chip]

4. pipeline_bt_source
本例程演示了 ADF 的经典蓝牙发送端 (source) 的使用方法,此例开发板作为经典蓝牙发送端 (source) 角色,通过连接 Wi-Fi 获取 HTTP 服务器上的 MP3 音频文件,音频解码后通过经典蓝牙的 A2DP 协议发送给另一块开发板蓝牙接收端 (sink)。

开发板获取 HTTP 服务器上的 MP3 文件并解码发送的管道如下:

1
[http_server] ---> http_stream ---> mp3_decoder ---> bt_stream_writer ---> [Bluetooth]

5. pipeline_embed_flash_tone
本例程演示了 ADF 使用音频管道 API 播放存储在嵌入 flash 二进制数据中的 MP3 文件,一般可在项目中作为系统提示音使用。

开发板获取嵌入 flash 二进制数据中存储的 MP3 文件并解码播放的管道如下:

1
[flash] ---> embed_stream ---> mp3_decoder ---> i2s_stream ---> [codec_chip]

6. pipeline_flash_tone
本例程演示了 ADF 使用音频管道 API 播放存储在 flash 中的 MP3 文件,一般可在项目中作为系统提示音使用。

开发板获取 flash 中存储的 MP3 文件并解码播放的管道如下:

1
[flash] ---> tone_stream ---> mp3_decoder ---> i2s_stream ---> [codec_chip]

7. pipeline_hfp_stream
本例程演示了免提配置文件 (Hands Free Profile, HFP) 在 ADF 框架下接收和发送音频流的 API 的过程。

本例程的管道如下图:

1
[Bluetooth] ---> hfp_in_stream ---> i2s_stream_writer ---> [codec_chip]

8. pipeline_http_mp3
本例程在 ADF 框架下实现在线 HTTP 的 MP3 音频流的播放演示。

本例程的管道如下图:

1
[http_server] ---> http_stream ---> mp3_decoder ---> i2s_stream ---> [codec_chip]

9. pipeline_http_select_decoder
本例可以选择播放从 HTTP 下载的 AAC、AMR、FLAC、MP3、OGG、OPUS 或 WAV 等格式的音频文件。

完整 HTTP 下载,解码器解码播放的管道如下:

1
2
3
4
5
6
7
8
9
10
11
[Music_file_on_HTTP_server] ---> http_stream ---> music_decoder ---> i2s_stream ---> codec_chip ---> [Speaker]

┌───────┴────────┐
│ AAC_DECODER │
│ AMR_DECODER │
│ FLAC_DECODER │
│ MP3_DECODER │
│ OGG_DECODER │
│ OPUS_DECODER │
│ WAV_DECODER │
└────────────────┘

http_stream 从网络上下载程序选定的音频文件,然后由选定的解码器解码,解码后的数据通过 I2S 传输给 codec 芯片播放。

10. pipeline_living_stream
本例程在 ADF 框架下使用 HTTP 直播流协议 (HTTP Live Streaming, HLS) 直播网络电台节目。

本例程的管道如下图:

1
[living_server] ---> http_stream ---> aac_decoder ---> i2s_stream ---> [codec_chip]

11. pipeline_loop_playback_without_gap
本例程介绍了使用两路 Pipeline 解码从 microSD 卡中读取名为 “test” 的音乐,并实现无间隙循环播放。这两路 Pipeline 可以解码相同格式音频,也可以解码不同格式音频。本例支持 MP3、WAV、AAC 音频格式,默认选择 MP3 音乐格式。

12. pipeline_play_mp3_with_dac_or_pwm
本例使用 MP3 解码器的回调函数 mp3_music_read_cb 读取嵌入在 flash 中的 MP3 文件,数据经过解码器解码处理后,最终通过 PWM 方式输出音乐。

需要说明,对于 ESP32 的 I2S-DAC 输出,只有 GPIO25,GPIO26 两个管脚可使用; 对于 PWM 方式输出,只需要 GPIO 是具有输出功能的管脚即可。

13. pipeline_play_sdcard_music
本例程介绍了使用 FatFs 元素读取 microSD 卡中不同格式的音乐,然后经过 decoder 元素解码,解码后数据用 I2S 元素输出音乐。

本例支持 MP3、OPUS、OGG、FLAC、AAC、M4A、TS、MP4、AMRNB、AMRWB 音频格式,默认选择 MP3 音乐格式。

例程中引用的音源可以通过 音频样例或短样例 来获取并下载到 microSD 卡中。

下表列出本例程支持的音乐格式:

序号 音乐格式 文件名
1 MP3 test.mp3
2 AMRNB test.amr
3 AMRWB test.Wamr
4 OPUS test.opus
5 FLAC test.flac
6 WAV test.wav
7 AAC test.aac
8 M4A test.m4a
9 TS test.ts
10 MP4 test.mp4

14. pipeline_sdcard_mp3_control
该演示使用音频管道接口播放存储在 microSD 卡上的 MP3 文件。例程首先扫描 microSD 卡中的 MP3 文件,并把扫描结果以播放列 (playlist) 的形式保存在 microSD 卡中。

用户可以开始、停止、暂停、恢复播放和前进到下一首歌曲以及调节音量。播放时,上一音乐文件播放完毕后,应用程序会自动前进到下一首歌曲。

本例程的管道如下图:

1
[sdcard] ---> fatfs_stream ---> mp3_decoder ---> resample ---> i2s_stream ---> [codec_chip]

15. pipeline_spiffs_mp3
本例程在 ADF 框架下实现 SPIFFS 文件系统中 MP3 音频文件的播放演示。

本例程的管道如下图:

1
[flash] ---> spiffs_stream ---> mp3_decoder ---> i2s_stream ---> [codec_chip]

16. pipeline_tts_stream
这个例子演示了如何将中文文本转换为中文语音。如果输入的是中英文混杂的文本,英文部分将会被逐字母读出。若需要英语文本转语音版本,请发送电子邮件到我们的业务支持团队,团队将会为您进行私人定制。

protocols

1. esp-rtc
ESP RTC 是一个基于标准 SIP 协议的视频通话客户端,可以用于音视频通话等场景。

2. esp-rtsp
ESP RTSP 是一个基于标准 RSTP 协议的客户端和服务器。

  1. 支持作为 RTSP 服务器,使用 VLC/Potplayer/Kmplayer/FFMPEG 等播放器输入串流地址即可播放 RTSP 流。

    • 串口输入: start 0
  2. 支持作为 RTSP Pusher,同时支持 TCP/UDP 推送到本地/公网 RTSP 服务器(比如 EasyDarwin),并使用其它客户端来播放直播流。

    • 串口输入: start 1 rtsp://192.168.1.1:554/live
  3. 支持作为 RTSP Player,将服务器的 RTSP 流拉下来进行播放。

    • 串口输入: start 2 rtsp://192.168.1.1:554/live

3. rtmp
RTMP 广泛应用于直播领域,通过服务器转发实现一对多的直播支持。本例程展示了如何在开发板上实现推流、拉流、服务器应用等 RTMP 的常用场景,以及 esp_rtmp 的基本用法。

  • 推流应用 将从麦克风和摄像头采集到的音视频数据发送给 RTMP 服务器。应用支持对视频分辨率、是否采用软件编码、视频帧率、音频采样率、音频声道、音频格式等进行配置。
  • 拉流应用 将从 RTMP 服务器获取到的音视频数据存储到 FLV 格式的文件中,方便离线浏览或者后续扩展为本地播放。
  • 服务器应用 将在本地搭建 RTMP 服务器,处理客户端的连接请求,将推流发送的媒体数据广播给拉流客户端。

其中,推流应用和服务器应用可以同时运行,用以搭建本地直播服务器。
esp_rtmp 支持的音视频编码格式见下表:

esp_rtmp 支持 标准协议支持 说明
PCM Y Y
G711 alaw Y Y
G711 ulaw Y Y
AAC Y Y
MP3 Y Y
H264 Y Y
MJPEG Y N 使用 CodecID 1 传输 MJPEG

如需在 PC 上播放 RTMP 直播流或者存储的 FLV 文件,请参考 功能和用法

4. voip
ESP VoIP 是一个基于标准 SIP 协议的电话客户端,可以用于点对点通话和音频会议等场景。

recorder

1. av_muxer_sdcard
本例程将摄像头输入的视频以及麦克风输入的音频保存到文件中存储,以演示 esp_muxer 模块的基础用法。例程中分别录制了 MP4、FLV、TS 三种视频,每种格式总时长由 MUXER_FILE_DURATION 指定。视频采用摄像头编码的 JPEG 格式,分辨率默认为 HVGA。音频为小端字节序 PCM 格式,16 比特位宽,2 声道。视频的分辨率和音频的采样率均可以修改。esp_muxer 支持的音视频编码格式见下表:

MP4 TS FLV
PCM Y N Y
AAC Y Y Y
MP3 Y Y Y
H264 Y Y Y
MJPEG Y Y Y

如需在 PC 上播放录制的视频,请参考 功能和用法

2. element_cb_sdcard_amr
本例程使用回调函数方式录制 10 秒的 AMR 音频文件,然后写入 microSD 卡中。此外,也可以使用消息队列处理事件,如 pipeline_recording_to_sdcard 示例。

AMR 支持 AMR-NB、AMR-WB 两种种音频编码器。默认选择 AMR-NB 编码器录制音频,并保存在 microSD 卡中。

AMR 录音例程的管道如下所示:

1
2
3
4
5
6
[mic] ---> codec_chip ---> i2s_stream_reader ---> ringbuf1 ---> amr_encoder ---> ringbuf2 ---> fatfs_stream_writer ---> [amr_file]

┌───────┴────────┐
│ AMRNB_ENCODER │
│ AMRWB_ENCODER │
└────────────────┘

3. element_wav_amr_sdcard
本例程使用元素 API 灵活组建了一路 I2S 输入和 2 路文件输出的音频数据流,功能是同时录制 10 秒的 AMR 和 WAV 音频文件,然后保存到 microSD 卡中。例程中,audio_element_set_input_ringbufaudio_element_set_output_ringbuf 把 ringbuf 插入到元素中间,完成数据的拷贝分发和流转搬运,audio_element_set_event_callback 负责注册元素事件,audio_element_runaudio_element_resume 控制开启数据传输。

AMR 支持 AMR-NB、AMR-WB 两种种音频编码器。默认选择 AMR-NB 编码器录制音频保存在 microSD 卡中。

录音例程的管道如下所示:

1
2
3
4
5
6
7
8
9
10
                                                ---> ringbuf01 ---> wav_encoder ---> ringbuf02 ---> fatfs_stream_writer ---> [wav_file]
|
[mic] ---> codec_chip ---> i2s_stream_reader --
|
---> ringbuf10 ---> amr_encoder ---> ringbuf12 ---> fatfs_stream_writer ---> [amr_file]

┌───────┴────────┐
│ AMRNB_ENCODER │
│ AMRWB_ENCODER │
└────────────────┘

4. pipeline_raw_http
本例程演示了使用 HTTP 流上传语音数据到 Python 创建的 HTTP 服务器并保存为 WAV 文件的过程。

开发板和 HTTP 服务器正确运行后,当按下音频板上的 [Rec] 按键时,将录制语音数据并通过 HTTP 流上传数据到 HTTP 服务器,当释放 [Rec] 按键时,停止录音。同时 PC 端 HTTP 服务器将收到的数据写入以接收时间为名称的 WAV 文件中。

本例程的完整的管道如下:

1
mic ---> codec_chip ---> i2s_stream ---> http_stream >>>> [Wi-Fi] >>>> http_server ---> wav_file

5. pipeline_recording_to_sdcard
本例程使用 stream element 和 codec element 组成 pipeline,把音频数据流从 i2s stream 中读取,经过 encoder 编码,最后由 fatfs stream 写入 microSD card 中。 encoder 可以通过 menuconfig 配置为 WAV、OPUS、AMRNB、AMRWB。

此例支持 WAV、OPUS、AMRNB、AMRWB 四种音频编码器。默认选择 WAV 编码器来编码录音,录音文件保存在 microSD card 中。

6. pipeline_wav_amr_sdcard
本例程使用管道 API 建立了 1 路 I2S 输入和 2 路文件输出的音频数据流,功能是同时录制 10 秒的 AMR 和 WAV 音频文件,然后保存到 microSD 卡中。使用元素 API 例程请参考 element_wav_amr_sdcard

其中,AMR 支持 AMR-NB、AMR-WB 两种种音频编码器。默认选择 AMR-NB 编码器录制音频保存在 microSD 卡中。

录音例程的管道如下所示:

1
2
3
4
5
6
7
8
[mic] ---> codec_chip ---> i2s_stream ---> wav_encoder ---> fatfs_stream ---> [sdcard]
|
---> raw_stream ---> amr_encoder ---> fatfs_stream ---> [sdcard]

┌───────┴────────┐
│ AMR-NB_ENCODER │
│ AMR-WB_EMCODER │
└────────────────┘

speech_recognition

1. vad
本例程演示了从麦克风读取环境声音数据,经过 VAD 处理分析,最后 VAD 输出是噪声还是人声的判定结果。

管道的数据流向,如下所示:

1
mic ---> codec_chip ---> i2s_stream ---> filter ---> raw ---> vad_process ---> output

2. wwe
本例程演示了从麦克风读取环境声音数据,经过声学前端 (audio front-end, AFE) 算法和 MultiNet 模型处理分析,最后输出唤醒状态或者命令词索引。

管道的数据流向,如下图所示:

1
mic ---> codec_chip ---> i2s_driver ---> afe ---> multinet ---> audio_recorder ---> output

system

1. battery
本例程在演示了 ADF 框架下配置电池服务,在使用电池的应用场景中,通过注册 battery_service_cb 回调函数,可以获得电池满电、亏电、阈值报警等事件推送的示例。

2. coredump
本例程演示了如何在 ADF 框架下配置核心转储(core dump)服务。通过引用一个不存在的汇编指令制造一个 crash,把核心转储的数据上传到 HTTP 服务器上,并由 HTTP 服务器接收并解析这些核心转储信息。

3. wpa2_enterprise
本例程在演示了 ADF 框架下如何配置 ESP32 连接到 WPA2 企业级加密的路由器演示例程。