esp-webrtc-solution hỗ trợ ba audio codec: Opus, G.711A (alaw), và G.711U (ulaw). Mỗi codec có trade-off khác nhau về chất lượng, latency, và CPU. Bài này phân tích thực tế để bạn chọn đúng từ đầu.
Ba Codec Trong esp-webrtc
// Cấu hình trong esp_webrtc_cfg_t
typedef enum {
ESP_WEBRTC_AUDIO_CODEC_OPUS = 0, // Opus
ESP_WEBRTC_AUDIO_CODEC_G711A = 1, // G.711 A-law (PCM 8kHz)
ESP_WEBRTC_AUDIO_CODEC_G711U = 2, // G.711 μ-law (PCM 8kHz)
} esp_webrtc_audio_codec_t;
G.711: Đơn Giản, Latency Thấp
G.711 là codec điện thoại cổ điển từ thập niên 1970 — nhưng vẫn được WebRTC hỗ trợ vì một lý do chính: cực kỳ nhẹ.
Cách hoạt động
G.711 compand (compress+expand) 16-bit PCM xuống 8-bit bằng logarithmic encoding:
- A-law (G.711A): chuẩn châu Âu
- μ-law (G.711U): chuẩn Bắc Mỹ/Nhật
Sample rate cố định 8kHz, bitrate 64kbps. Chất lượng tương đương điện thoại analog.
Benchmark Trên ESP32
| Metric | G.711A | G.711U |
|---|---|---|
| CPU | ~0.5% | ~0.5% |
| RAM | ~2KB | ~2KB |
| Latency | ~20ms | ~20ms |
| Bitrate | 64kbps | 64kbps |
| Chất lượng | Thoại rõ | Thoại rõ |
| MOS Score | ~4.1/5 | ~4.1/5 |
G.711 encode/decode dùng lookup table — không cần DSP, không cần FPU. Chạy tốt ngay cả trên ESP32 ở 80MHz.
Khi nào dùng G.711: ứng dụng thoại đơn giản (intercom, doorbell), cần latency thấp nhất, ESP32 đang busy với video encode.
Opus: Chất Lượng Cao, Linh Hoạt
Opus là codec hiện đại (2012) được thiết kế cho WebRTC. Hỗ trợ:
- Sample rate: 8kHz đến 48kHz
- Bitrate: 6kbps đến 510kbps (adaptive)
- Chế độ: SILK (thoại) và CELT (nhạc) — tự chuyển đổi
Benchmark Trên ESP32
| Metric | Opus (8kHz) | Opus (16kHz) | Opus (48kHz) |
|---|---|---|---|
| CPU encode | ~8% | ~12% | ~20% |
| CPU decode | ~5% | ~8% | ~14% |
| RAM | ~80KB | ~80KB | ~80KB |
| Latency | ~40ms | ~40ms | ~40ms |
| Bitrate | ~16kbps | ~24kbps | ~40kbps |
| Chất lượng | Tốt | Rất tốt | Xuất sắc |
📷 [Hình minh hoạ: Biểu đồ so sánh CPU load của Opus vs G.711 theo bitrate]
Lưu Ý RAM
Opus cần ~80KB RAM cho encoder + decoder. Với ESP32-S3 (8MB PSRAM) không vấn đề gì. Với ESP32 chip thuần (520KB SRAM) cần cẩn thận khi chạy cùng Wi-Fi stack.
Khi nào dùng Opus:
- Voice assistant (OpenAI Realtime API yêu cầu Opus 24kHz)
- Hội thoại âm thanh rõ trong môi trường ồn
- Cần adaptive bitrate (Opus tự giảm bitrate khi mạng yếu)
So Sánh Thực Tế
| Tiêu Chí | G.711A/U | Opus |
|---|---|---|
| CPU trên ESP32-P4 | Không đáng kể | 8–20% tùy config |
| CPU trên ESP32-S3 | Không đáng kể | 10–25% tùy config |
| Latency | ~20ms | ~40ms (có thể tune xuống ~20ms) |
| Bandwidth | 64kbps (cố định) | 6–40kbps (adaptive) |
| Chất lượng thoại | Tương đương điện thoại | Vượt trội rõ ràng |
| Yêu cầu RAM | ~2KB | ~80KB |
| Hỗ trợ browser | Đầy đủ | Đầy đủ |
| OpenAI Realtime | Không | Bắt buộc Opus |
Cấu Hình Trong Code
esp_webrtc_cfg_t cfg = {
// Dùng Opus 16kHz — cân bằng tốt giữa chất lượng và CPU
.audio_codec = ESP_WEBRTC_AUDIO_CODEC_OPUS,
.audio_sample_rate = 16000,
.audio_bitrate = 24000, // 24kbps — thoại rõ, tiết kiệm bandwidth
// Hoặc G.711 cho latency thấp nhất
// .audio_codec = ESP_WEBRTC_AUDIO_CODEC_G711A,
};
Với OpenAI Realtime API (bài 12), bắt buộc dùng Opus 24kHz — API không nhận G.711.
Opus Latency Tuning
Mặc định Opus dùng frame size 20ms. Giảm xuống 10ms để latency thấp hơn:
// Trong esp_capture config
.audio_frame_ms = 10, // 10ms frames thay vì 20ms mặc định
Đánh đổi: frame nhỏ hơn → overhead/packet tăng → CPU tăng ~15%.
Kết Luận
- Doorbell / intercom đơn giản → G.711A, CPU gần như zero
- Voice assistant với OpenAI → Opus 24kHz, bắt buộc
- Ứng dụng thoại chất lượng cao → Opus 16kHz, cân bằng tốt
- ESP32-P4 với video nặng → G.711 để tiết kiệm CPU cho video encode
Bài tiếp theo: Video H.264 Hardware Encode Trên ESP32-P4 — Hiệu Năng Thực Tế


