# Bàn giao — nhánh tiền huấn luyện Audio-JEPA trên tiếng nói

Ghi ngày 09/09/2026. Prompt khởi đầu cho hội thoại mới. Tự chứa.

Hai nhánh song song đã có: `viet-bai/` (đang viết bài cho SOICT 2026, hạn 16/9) và `toi-uu-ngoai-mien/`. **Không trộn.** Nhánh này không được đụng vào bộ số của nhánh viết bài — bài đó đã khoá số liệu.

---

## 0. Yêu cầu về giọng văn — đọc trước

Tác giả đã bác bỏ một bản thảo vì viết theo kiểu "đóng góp to tát". Nguyên văn yêu cầu:

> *"thứ tôi muốn chỉ là giới thiệu phương pháp mới và đưa ra kết quả thực nghiệm khả quan, giải thích cách bài toán vận hành và định hướng trong tương lai. chỉ đơn giản vậy thôi"*

Không thổi phồng, không ngôn ngữ phòng thủ. Kết quả âm thì báo cáo thẳng, một dòng, không dựng thành mục.

---

## 1. Câu hỏi của nhánh này

Audio-JEPA được tiền huấn luyện trên **AudioSet-2M** — âm thanh phổ quát: tiếng động vật, xe cộ, nhạc cụ, một phần tiếng nói. Khoảng **5 500 giờ**.

Mọi hệ ở nửa trên bảng xếp hạng Speech DF Arena đều dùng front-end tiền huấn luyện trên **tiếng nói quy mô lớn**:

| | giờ | miền |
|---|---|---|
| XLS-R *(5 hệ đứng đầu)* | 436 000 | tiếng nói, 128 ngôn ngữ |
| Whisper | 680 000 | tiếng nói |
| WavLM / HuBERT / wav2vec2 | 60–94 000 | tiếng nói |
| **Audio-JEPA** | **~5 500** | âm thanh phổ quát |

**Câu hỏi: bao nhiêu phần khoảng cách ngoài miền là do *miền tiền huấn luyện*, chứ không do quy mô mô hình hay biểu diễn đầu vào?**

Bài đang viết đã tách được biến **mục tiêu SSL** (JEPA so với AudioMAE, cùng xương sống, cùng AudioSet-2M, cùng công thức). Nhánh này tách biến **kho dữ liệu tiền huấn luyện**, giữ nguyên mục tiêu và kiến trúc.

---

## 2. Vì sao không có đường tắt — đã kiểm ngày 09/09/2026

**Không tồn tại checkpoint JEPA nào tiền huấn luyện trên tiếng nói, công khai.**

| bài | mã nguồn | trọng số |
|---|---|---|
| *Soft Clustering Anchors for SSL Speech in JEPA*, arXiv 2602.09040 | `github.com/gioannides/clustering-anchored-jepa` | **không** — repo chỉ có script chuyển checkpoint DeepSpeed, "No releases published" |
| *JEPA as a Neural Tokenizer*, arXiv 2512.07168 | cùng nhóm | không |
| *Echo: JEPA for Speaker Diarization and ASR*, arXiv 2606.01909 | proof-of-concept độc lập | không |

HuggingFace có 349 mô hình chứa chữ "jepa": thị giác, DNA, ECG, văn bản, video. **`ltuncay/Audio-JEPA` là checkpoint JEPA âm thanh duy nhất tồn tại.**

Nên muốn trả lời câu hỏi thì phải tự tiền huấn luyện.

---

## 3. Bằng chứng NGƯỢC — đọc kỹ trước khi tốn GPU

Đây là lý do mạnh nhất để hoài nghi, và nó đến từ chính dữ liệu của dự án. Notebook `v38`, ba seed mỗi ô, EER %:

| tập | chế độ | Audio-JEPA | AudioMAE | **khởi tạo ngẫu nhiên** |
|---|---|---|---|---|
| DFADD | đóng băng | 8,47 ± 0,35 | 11,04 ± 0,75 | **8,66 ± 2,25** |
| ASVspoof19 | đóng băng | 17,70 ± 1,44 | 25,25 ± 0,68 | **14,25 ± 1,48** |
| ASVspoof19 | fine-tune | 7,39 ± 0,69 | 13,25 ± 0,57 | 13,68 *(n=1)* |

Đọc ba dòng này cho kỹ:

**Với encoder đóng băng, tiền huấn luyện đóng góp gần như không gì.** Trên DFADD, ngẫu nhiên 8,66 so với JEPA 8,47 — chênh 0,19, nằm trong độ lệch 2,25 của chính nhánh ngẫu nhiên. Trên ASVspoof19, **ngẫu nhiên thắng JEPA 3,45 điểm, dải seed không chồng nhau.**

**Tiền huấn luyện chỉ có giá trị như điểm khởi đầu để fine-tune:** 7,39 so với 13,68.

**AudioMAE tệ hơn hoặc bằng khởi tạo ngẫu nhiên ở mọi nơi** — kém 11,00 điểm trên ASVspoof19 đóng băng.

Hệ quả cho nhánh này: nếu ở quy mô 86 M mà *có* tiền huấn luyện gần như không hơn *không* tiền huấn luyện khi dùng nguyên biểu diễn, thì đổi **miền** tiền huấn luyện cũng có thể đóng góp ít hơn kỳ vọng. Đừng giả định sẵn là sẽ ăn.

Ô ngẫu nhiên fine-tune mới **n=1**. Chạy thêm seed 2, 3 (~1,5 giờ) là việc đầu tiên nên làm, vì nó là mốc so sánh của cả nhánh.

---

## 4. Chi phí — đo từ chính các lượt chạy của dự án

Trên Colab T4:

| | đo được |
|---|---|
| dựng cache mel | 25 380 mẫu / 295 s ≈ **12 ms/mẫu** |
| fine-tune, 128 token | ~150 s/epoch trên 20 980 mẫu ≈ **7 ms/mẫu/epoch** |
| fine-tune, 256 token | ~290 s/epoch ≈ **14 ms/mẫu/epoch** |
| tiền huấn luyện JEPA | ước **1,5–2×** fine-tune cùng số token *(context encoder có gradient + target encoder không gradient + predictor)* |

Ví dụ LibriSpeech train-clean-100, 100 giờ, cắt clip 2,56 s ≈ **140 000 clip**, 128 token:

| | |
|---|---|
| dựng cache mel | ~30 phút, ~9 GB đĩa |
| một epoch | ~28 phút |
| 20 epoch | **~10 giờ** |
| huấn luyện lại bộ phát hiện, 3 seed | ~1,5 giờ |
| chấm lại 5 benchmark × 3 seed + cổng | ~4 giờ |

**Bắt buộc: lưu checkpoint lên Drive sau mỗi epoch.** Colab đã đứt ba lần trong ba đêm trong dự án này. Một lượt mười tiếng không có checkpoint trung gian là mất trắng.

---

## 5. Ba quyết định thiết kế phải chốt trước khi chạy

### 5.1 Quy cách mel nào

Xung đột thật, chưa có lời giải:

| | clip | hop | cửa sổ | f_max | patch |
|---|---|---|---|---|---|
| Audio-JEPA gốc *(`configs/data/audioset.yaml`)* | 10 s | 39,06 ms | 97,66 ms | 16 000 | (16,16) |
| cấu hình phát hiện của dự án | 2,56 s | 10 ms | 25 ms | 8 000 | (8,32) |

Đã thử dùng đúng quy cách gốc cho bài toán phát hiện: **tệ hơn** (ASVspoof19 9,41 so với 6,78). Nhưng tiền huấn luyện tiếp bằng quy cách phát hiện thì lệch khỏi thiết lập mà checkpoint gốc đã học.

Hai lựa chọn, mỗi cái một cái giá:

**(a) Tiền huấn luyện theo quy cách phát hiện** — không phải nội suy trọng số patch, đầu vào nhất quán từ đầu tới cuối. Nhưng bước đầu tiên sẽ là một cú sốc phân bố với checkpoint gốc.

**(b) Tiền huấn luyện theo quy cách gốc rồi mới nội suy sang (8,32)** — trung thành với thiết lập gốc, nhưng vẫn phải nội suy như hiện nay, và ta biết quy cách gốc kém cho phát hiện.

Tôi nghiêng về **(a)**, và ghi rõ đó là lệch chuẩn có chủ ý.

*Lưu ý về f_max:* arena nạp audio ở `sr=16000`, nên Nyquist thật là 8 kHz. `f_max=8000` của cấu hình phát hiện **không mất gì**; con số `SR_MODEL=32000` chỉ là hình thức vì mô hình tự nâng mẫu 16k→32k. Nếu tiền huấn luyện trên audio băng thông rộng hơn thì phải quyết định có giữ ràng buộc đó không.

### 5.2 Kho dữ liệu nào — cẩn thận rò rỉ

| kho | giờ | rủi ro |
|---|---|---|
| LibriSpeech | 100 / 360 / 960 | **LibriSeVoc dựng trên LibriTTS**, cùng nguồn LibriVox. Cải thiện ở đó sẽ là in-domain chứ không phải tổng quát hoá |
| VoxPopuli | tới 400 k | đa ngôn ngữ, nhiễu nghị trường, khá trung tính |
| Common Voice | lớn | đọc bởi tình nguyện viên, kênh truyền rất đa dạng |
| VCTK | 44 | **trùng nguồn với ASVspoof19 và DFADD** — tuyệt đối không dùng, sẽ làm hỏng cả bảng |

Chọn kho nào thì phải **khai báo quan hệ của nó với từng benchmark đánh giá**. Đây là chỗ dễ tự lừa nhất của cả nhánh.

### 5.3 Sụp đổ biểu diễn

Chế độ hỏng đã biết của cả họ JEPA. Bài CoJEPA (arXiv 2608.30974) mở đầu bằng đúng điều đó: JEPA dựa vào teacher–student với EMA để ổn định, và *"can tend to yield uninformative representations"*.

Checkpoint `JEPA.ckpt` chứa đủ ba nhánh, **nhánh này cần cả ba** (nhánh phát hiện chỉ dùng `encoder`):

| nhánh | số tensor |
|---|---|
| `encoder` | 149 |
| `target_encoder` | 149 |
| `predictor` | 80 — `predictor_embed` 768→384, `predictor_pos_embed` (1,128,384), `mask_token` |

Phải có chỉ số phát hiện sụp đổ **trong lúc chạy**, không đợi tới lúc fine-tune xong mới biết. Ví dụ: độ lệch chuẩn theo chiều đặc trưng của biểu diễn, hoặc hạng hiệu dụng của ma trận biểu diễn trên một batch cố định, in mỗi epoch. Sụp đổ thì các chỉ số đó tiến về 0.

Cấu hình gốc nằm trong repo `github.com/LudovicTuncay/Audio-JEPA` — lịch EMA, chiến lược che, learning rate. Bắt đầu từ đó, đừng tự chế.

---

## 6. Số liệu hiện có, dùng làm mốc

EER %, thấp là tốt. Đường ống Speech DF Arena.

| tập | giọng thật | JEPA đóng băng | JEPA fine-tune | AASIST *(ta chạy)* | tốt nhất công bố |
|---|---|---|---|---|---|
| **DFADD** | VCTK | **8,47 ± 0,35** | 10,75 ± 3,48 | 39,05 | 7,54 |
| ASVspoof2019 LA | VCTK *(tập train)* | 17,70 ± 1,44 | **7,39 ± 0,69** | 0,83 | 0,12 |
| ADD22 Track 1 | tiếng Trung | — | 44,10 ± 2,04 | 47,92 | 31,04 |
| LibriSeVoc | LibriTTS | 47,38 ± 4,19 | 41,96 ± 2,93 | 37,95 | 1,72 |
| In-the-Wild | YouTube | 47,55 ± 8,55 | 52,00 *(1 seed)* | 43,02 | 6,70 |

**Ba tập cuối là mục tiêu.** Ngưỡng tối thiểu để gọi là tiến bộ: thắng AASIST — 47,92 · 37,95 · 43,02.

Huấn luyện: ASVspoof2019 LA train, 25 380 mẫu (2 580 thật / 22 800 giả), giữ attack A05 làm holdout **chỉ để theo dõi**. 6 epoch, batch 32, AdamW, OneCycle, lr encoder 3e-5, head 1e-3, weight decay 0,05, SpecAugment. Ba seed: 1234, 2, 3.

Back-end: trọng số softmax học được trên 13 biểu diễn tầng → gộp thống kê chú ý (mean+std, 1536 chiều) → LayerNorm → 1536→256 → GELU → Dropout 0,2 → 256→2. ~0,5 M tham số.

---

## 7. ĐÃ THỬ VÀ THẤT BẠI — đừng lặp lại

| # | hướng | kết quả |
|---|---|---|
| 1 | back-end đồ thị AASIST thay gộp thống kê | ASVspoof19 8,76 *(vs 6,78)*; In-the-Wild **65,78** *(vs 52,00)*. Lý do: lưới thời gian chỉ 32 bước nên đồ thị thời gian gần rỗng |
| 2 | dùng đúng quy cách mel lúc tiền huấn luyện | A05 tốt lên 5× nhưng eval **tệ đi** (9,41 vs 6,78) |
| 3 | đóng băng encoder | thắng ở DFADD, thua ở LibriSeVoc và In-the-Wild. Không phải quy luật |
| 4 | giảm số epoch (2/3/4) | LibriSeVoc tốt nhất 40,82, vẫn thua AASIST |
| 5 | hợp nhất z-score ba seed | 7,17 vs 6,78 |
| 6 | dùng holdout A05 chọn siêu tham số | **nghịch chiều bốn lần**, Spearman −1,00. Chỉ dùng để theo dõi |
| 7 | quét learning rate lưới cũ | cực tiểu ở mép lưới, tối ưu khác nhau theo tập test |
| 8 | **thu nhỏ patch thời gian 80 ms → 40 ms** *(v40, 09/09)* | DFADD 9,72 ± 1,07 vs 10,75 ± 3,48 — **trong nhiễu**; LibriSeVoc **50,01 ± 0,61 vs 41,96 ± 2,93, tệ đi 8,05, dải không chồng**. Giả thuyết "dấu vết vocoder ở thang mili giây" **bị bác bỏ**. (8,32) là điểm tối ưu kinh nghiệm, không phải hệ quả cơ chế |
| 9 | ASVspoof2021 LA *(v39, 09/09)* | cổng `aasist` lệch: ta 8,15 vs công bố 11,46. Đã truy: cùng tập con, cùng nhãn, **khác bản audio**. JEPA fine-tune 30,76 ± 1,03 — cuối bảng. Không đưa vào bài |

Hướng 8 quan trọng với nhánh này: nó cho thấy **không sửa được giới hạn độ phân giải bằng cách đổi hình học patch**. Nếu độ phân giải là vấn đề thì phải giải bằng cách khác.

---

## 8. Quy tắc bắt buộc khi chạy thí nghiệm

**Luôn chạy `aasist` kèm làm cổng.** Giá trị đối chiếu — dùng số **của ta**, không dùng số công bố, vì bản audio HuggingFace khác bản arena dùng:

| tập | cổng của ta | arena công bố |
|---|---|---|
| ASVspoof19 | 0,83 | 0,82 |
| ADD22-T1 | 47,92 | 47,91 |
| In-the-Wild | 43,02 | 43,00 |
| LibriSeVoc | 37,95 | 37,65 |
| DFADD | **39,05** | 41,86 |

Chi tiết vì sao DFADD lệch: `chung/kiem-chung-cong-va-ban-audio.md`. Tóm tắt: cùng 3 755 tệp, cùng nhãn, khác bản chuyển đổi audio; đã chứng minh bằng cách tính lại EER từ file điểm arena công bố (ra 41,83 so với 41,86).

**Ba seed tối thiểu.** Đã ba lần một seed cho kết luận ngược với ba seed.

**Không dùng A05 chọn siêu tham số.**

**Kiểm va chạm tiền tố tên checkpoint** — arena tra file bằng `startswith`.

**Assert bằng số tuyệt đối, không theo tỉ lệ** — `len(x) >= 0.99*len(y)` lọt khi cả hai bằng 0.

**Lưu kết quả lên Drive sau mỗi hệ**, không đợi tới cuối vòng lặp.

Chín cạm bẫy kỹ thuật khác: `chung/cam-nang-duong-ong-arena.md`.

---

## 9. Hạ tầng dùng lại được

**Checkpoint trên Drive** `MyDrive/jepa_spoof/`:

| tên | cấu hình |
|---|---|
| `audio_jepa_s1/s2/s3` | fine-tune đầy đủ, mel cũ, 6 epoch — **hệ chính** |
| `audio_mae_s1/s2/s3` · `audio_rand_s1` | đối chứng mục tiêu SSL, fine-tune |
| `jfrz_s1/s2/s3` · `mfrz_s1..3` · `rfrz_s1..3` | ba nguồn, encoder đóng băng |
| `p432_s1/s2/s3` | patch (4,32), fine-tune — hướng đã loại |
| `jep_ep2/ep3/ep4` · `fix_e6/e2/frz` | quét epoch, quy cách mel gốc |

**Notebook mẫu** trong `notebook/`:

| | dùng để |
|---|---|
| `v38_ablation_dongbang_dfadd` | mẫu tốt nhất: đổi encoder, đóng băng, chấm, lưu Drive từng bước |
| `v40_quet_patch_thoi_gian` | mẫu fine-tune + chấm nhiều tập, tự nhận patch từ checkpoint |
| `v34_chon_bang_chuot` | chấm một tập bất kỳ, chọn bằng dropdown |
| `v37_dongbang_ngoai_mien` | chấm nhiều tập bằng checkpoint có sẵn |

**Nguồn dữ liệu:** tổ chức `SpeechAntiSpoofingBenchmarks` trên HuggingFace đóng gói ~24 tập anti-spoofing dạng parquet, schema chung (`path`, `audio` 16 kHz, `label`), nhanh gấp ~30 lần Zenodo.

**Gói điểm arena công bố:** `gdown --id 1pI-tvCZt4U__gGGLsCQMdZqLv_QBe4NW` — 14 tập × 11 hệ, dùng để kiểm cổng mà không cần GPU.

---

## 10. Thứ tự việc đề xuất

**1. Seed 2 và 3 cho khởi tạo ngẫu nhiên fine-tune** *(~1,5 giờ)*. Mốc so sánh của cả nhánh hiện mới n=1. Làm trước mọi thứ.

**2. Chỉ số phát hiện sụp đổ** *(không cần GPU)*. Viết hàm đo và kiểm nó trên checkpoint gốc để biết giá trị "khoẻ mạnh" là bao nhiêu.

**3. Một lượt tiền huấn luyện tiếp ngắn** *(~3 giờ, 5 epoch trên 100 giờ)*. Không kỳ vọng cải thiện — mục đích là kiểm đường ống chạy được, không sụp, và checkpoint lưu đúng.

**4. Lượt đầy đủ** *(~10 giờ, 20 epoch)*, rồi fine-tune 3 seed và chấm 5 benchmark.

**5. Nếu ăn:** quét quy mô dữ liệu — 100 / 360 / 960 giờ — để có đường cong thay vì một điểm. Đó mới là thứ đáng công bố.

---

## 11. Kết quả thế nào thì đáng công bố

**Đáng:** một đường cong hiệu năng theo lượng dữ liệu tiếng nói tiền huấn luyện, trên các tập ngoài miền, với mục tiêu và kiến trúc giữ nguyên. Kể cả đường cong phẳng cũng đáng — nó trả lời được câu hỏi mà bảng xếp hạng không trả lời được, vì mọi hệ trên đó khác nhau cùng lúc ở ba chiều.

**Không đáng:** một con số tốt hơn trên một tập, không có đối chứng khởi tạo ngẫu nhiên, không có ba seed.

**Cần nhớ về quy mô:** 100 giờ so với 436 nghìn giờ của XLS-R là 0,02 %. Kết quả thực tế nhiều khả năng là "encoder quen tiếng nói hơn ở tầng thấp", không phải "thu hẹp khoảng cách với XLS-R". Viết đúng mức đó.

---

## 12. Tài liệu tham khảo trong thư mục này

| tệp | nội dung |
|---|---|
| `01-ba-quyet-dinh-thiet-ke.md` | **chốt mục 5** — quy cách mel, kho dữ liệu, chống sụp đổ; kèm năm cái bẫy trong mã nguồn gốc và ngân sách sửa lại |
| `02-preflight-ket-qua.md` | năm cái bẫy đã chạy thật và xác nhận, kèm số đo |
| `collapse_metrics.py` | bốn chỉ số sụp đổ + cổng dừng, có tự kiểm |
| `../notebook/audio_jepa_v41_preflight_tien_huan_luyen.ipynb` | **bảy cổng preflight, chạy hết trước khi cam kết 33 giờ GPU** |
| `../00-BAT-DAU-TU-DAY.md` | tổng quan dự án, ba điều dễ hiểu sai |
| `../chung/cam-nang-duong-ong-arena.md` | chín cạm bẫy đường ống, ba cổng kiểm chứng |
| `../chung/kiem-chung-cong-va-ban-audio.md` | vì sao cổng DFADD và ASVspoof21 LA lệch, và quy trình ba bước để truy |
| `../chung/lich-su-thay-doi-va-tuyen-bo-da-rut.md` | các tuyên bố đã rút và lý do |
| `../toi-uu-ngoai-mien/00-DOC-TRUOC-toi-uu.md` | bảy hướng đã loại, chẩn đoán thất bại ngoài miền |
| `../viet-bai/00-DOC-TRUOC-viet-bai.md` | nhánh viết bài — **chỉ đọc, không sửa số** |
