VietSpeech Fusion SER — Nhận diện cảm xúc tiếng Việt (đa phương thức)
Mô hình nhận diện cảm xúc qua giọng nói tiếng Việt, kết hợp âm thanh (wav2vec2) và văn bản (PhoBERT) theo kiến trúc late-fusion. Mô hình phân loại lời nói tiếng Việt thành 5 lớp cảm xúc.
Các lớp cảm xúc
| ID | Lớp | Gộp từ |
|---|---|---|
| 0 | Enjoyment (vui) | Enjoyment / happy |
| 1 | Sadness (buồn) | Sadness + Fear / sad + fearful |
| 2 | Anger (giận) | Anger + Disgust / angry + disgusted |
| 3 | Surprise (ngạc nhiên) | Surprise / surprised |
| 4 | Other (khác/trung tính) | Other / neutral |
Kiến trúc
audio ──→ wav2vec2-base-vietnamese-250h (+LoRA) ──→ mean-pool ─┐
├─→ concat → MLP → 5 lớp
text ──→ PhoBERT-base (+LoRA) ──→ [CLS] ─────────────────────┘
- Audio encoder:
nguyenvulebinh/wav2vec2-base-vietnamese-250h, fine-tune bằng LoRA (r=16). - Text encoder:
vinai/phobert-base, fine-tune bằng LoRA (r=16). - Fusion: nối hai embedding (768+768) → MLP (hidden 256, ReLU, dropout 0.3) → 5 lớp.
- Class weights dùng để xử lý mất cân bằng lớp.
Kết quả (trên test set VietSpeech, nhãn pseudo-label)
| Chỉ số | Giá trị |
|---|---|
| Accuracy | 0.743 |
| Macro-F1 | 0.613 |
F1 từng lớp: Enjoyment 0.75 · Other 0.81 · Surprise 0.54 · Anger 0.52 · Sadness 0.45.
⚠️ Lưu ý quan trọng về dữ liệu (pseudo-label)
Nhãn cảm xúc của tập huấn luyện KHÔNG do người gán. Chúng được sinh tự động
bằng mô hình iic/emotion2vec_plus_large (pseudo-labeling) trên dữ liệu giọng nói
NhutP/VietSpeech (vốn không có nhãn cảm xúc). Vì vậy:
- Nhãn là nhãn yếu (weak labels), có thể chứa lỗi (ví dụ một câu nội dung tiêu cực nhưng giọng nhẹ nhàng có thể bị gán "happy").
- Các con số đánh giá ở trên đo trên chính nhãn pseudo-label, nên phản ánh mức độ khớp với emotion2vec, chưa phải hiệu năng trên nhãn người gán thật.
- Phân bố lớp lệch: Other/Enjoyment chiếm đa số; Sadness/Anger hiếm hơn nhiều.
Để đánh giá khách quan, nên dùng một tập test có nhãn do người gán.
Cách dùng
Đây là kiến trúc tùy biến (không phải lớp model chuẩn của Transformers), cần dựng lại
MultimodalSER rồi nạp trọng số:
import torch
from huggingface_hub import hf_hub_download
# ... định nghĩa lại class MultimodalSER như khi train ...
path = hf_hub_download("qdovan03/vietspeech-fusion-ser", "best_fusion.pt")
model = MultimodalSER(num_labels=5)
state = torch.load(path, map_location="cpu")
state = {k.replace("module.", "", 1): v for k, v in state.items()}
model.load_state_dict(state)
model.eval()
Xem fusion_config.json trong repo để biết các siêu tham số.
Dữ liệu & nguồn
- Audio gốc:
NhutP/VietSpeech(Apache-2.0) - Mô hình gán nhãn:
iic/emotion2vec_plus_large - Dataset đã gán nhãn:
qdovan03/vietspeech-emo
Hạn chế
- Nhãn pseudo-label nên có nhiễu; chưa đánh giá trên nhãn người gán.
- Hai lớp Sadness và Anger thiếu dữ liệu (do nguồn VietSpeech ít các cảm xúc này), nên F1 hai lớp này thấp hơn.
- Mô hình huấn luyện trên giọng đọc/xã hội, có thể kém hơn trên giọng biểu cảm mạnh hoặc miền âm thanh khác.
Model tree for qdovan03/vietspeech-fusion-ser
Base model
nguyenvulebinh/wav2vec2-base-vietnamese-250h