IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP-WebRTC: Opus vs G.711 — Chọn Codec Âm Thanh Phù Hợp Cho ESP32

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

MetricG.711AG.711U
CPU~0.5%~0.5%
RAM~2KB~2KB
Latency~20ms~20ms
Bitrate64kbps64kbps
Chất lượngThoạ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

MetricOpus (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ượngTốtRất tốtXuấ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/UOpus
CPU trên ESP32-P4Không đáng kể8–20% tùy config
CPU trên ESP32-S3Không đáng kể10–25% tùy config
Latency~20ms~40ms (có thể tune xuống ~20ms)
Bandwidth64kbps (cố định)6–40kbps (adaptive)
Chất lượng thoạiTương đương điện thoạiVượt trội rõ ràng
Yêu cầu RAM~2KB~80KB
Hỗ trợ browserĐầy đủĐầy đủ
OpenAI RealtimeKhôngBắ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ế