Библиотека PCMFlow722 Танаки Масаюки позволяет реализовать (полудуплексную) двустороннюю HD-голосовую связь в реальном времени через ESP-NOW на платах ESP32 с динамиком и микрофоном, фактически превращая их в рации.
Библиотека реализует дополнительный широкополосный кодек G.722 для PCMFlow — легковесной библиотеки декодирования аудио и потока PCM для Arduino, которая уже поддерживает несжатый PCM, MP3 и FLAC. PCM и FLAC требуют слишком большой пропускной способности через ESP-NOW, а MP3 не подходит для аудио в реальном времени, поэтому был выбран устаревший кодек G.722.
Ключевое слово здесь — «HD-голос», поскольку двусторонняя аудиосвязь через ESP-NOW уже была реализована в таких проектах, как Atomic14’s esp32-walkie-talkie (5 лет назад) и более недавний хорошо документированный проект Adafruit ESP-NOW Walkie-Talkie project , но они обычно используют аудио более низкого качества G.711 или сжатое аудио.
Библиотека PCMFlowG722 и кодек G.722 обеспечивают HD-голос с «аудио 7 кГц при дискретизации 16 кГц, используя ту же пропускную способность 64 кбит/с, что и G.711 — те же размеры пакетов, но вдвое большую полосу пропускания аудио», как поясняет Танака. В таблице ниже сравниваются кодеки и библиотеки G.711, G.722 и Opus.
| PCMFlowG711 | PCMFlowG722 (this lib) | PCMFlowOpus | |
|---|---|---|---|
| Audio band | narrowband (8 kHz / ≤ 3.4 kHz) | wideband (16 kHz / ≤ 7 kHz) | narrow / wide / fullband (8–48 kHz) |
| Bitrate (voice) | 64 kbps fixed | 64 kbps fixed (Mode 1) | 16–32 kbps typical |
| Compression vs raw 16-bit PCM | 2× | 4× | 10–15× |
| Codec flash footprint | < 4 KB | ~10 KB | ~150–180 KB |
| Codec CPU | negligible | low | non-trivial on M0/M3-class MCUs |
| Patent / license complexity | none (1972 standard, expired) | none (1988 standard, expired); core is Public Domain | royalty-free patent grant, BSD-3-Clause source |
| Quality | toll-grade telephony | HD voice (wideband telephony) | wideband / fullband, far better |
Opus предлагает более низкую пропускную способность и полный диапазон аудио, но кодек G.722 менее сложен и требует меньше ресурсов (ЦП, памяти). Он также хорошо подходит для ESP-NOW, так как протокол передает полезные данные до 250 байт, а 20-мс голосовой кадр G.722 при 16 кГц дает 160 байт — столько же, сколько G.711, но с удвоенной полосой аудио, в то время как сырой 16-битный PCM 16 кГц в моно потребовал бы 640 байт (G.722 сжимает в 4 раза).
Библиотека реализует кодер G.722, сжимающий PCM 16 кГц в G.722, и декодер, выполняющий обратное преобразование. Если вы хотите попробовать это на своей плате, вам, вероятно, пригодится скетч Arduino EspNowTransceiver.ino Arduino sketch . Это полудуплексный приемопередатчик HD-голоса через ESP-NOW, и одна и та же прошивка работает как в режиме передатчика, так и приемника.
Она протестирована на платах M5Stack Core2 с SoC ESP32, 8 МБ PSRAM, 16 МБ SPI Flash, небольшим 2-дюймовым дисплеем, отображающим канал ESP-NOW, динамиком 1 Вт (1W-0928) и микрофоном SPM4123. Пока удерживается кнопка A, аудио передается через ESP-NOW на одно или несколько устройств Core2; во всех остальных случаях устройства работают как приемники аудио.
Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.


