wavlm-dirosa / README.md
AutoReXz's picture
Upload project with bundled WavLM model
1a0e6e8 verified
|
Raw
History Blame Contribute Delete
14.7 kB
# Metode Penilaian Kemiripan Bacaan Al-Qur'an pada Pembelajaran DIROSA Menggunakan Representasi Audio WavLM dan Dynamic Time Warping
Repositori ini berisi implementasi dari penelitian skripsi berjudul **"Metode Penilaian Kemiripan Bacaan Al-Qur'an pada Pembelajaran DIROSA Menggunakan Representasi Audio WavLM dan Dynamic Time Warping"**.
Metode yang diajukan mengukur seberapa mirip bacaan Al-Qur'an seorang peserta DIROSA terhadap bacaan referensi, melalui pendekatan berbasis *deep audio representation learning*. Fitur audio diekstraksi menggunakan model pretrained **WavLM**, kemudian dibandingkan secara sekuensial menggunakan **Dynamic Time Warping (DTW)** untuk menghasilkan skor kemiripan.
---
## Daftar Isi
- [Gambaran Umum](#gambaran-umum)
- [Arsitektur Pipeline](#arsitektur-pipeline)
- [Struktur Direktori](#struktur-direktori)
- [Prasyarat](#prasyarat)
- [Instalasi](#instalasi)
- [Penggunaan](#penggunaan)
- [Antarmuka Web (Streamlit)](#antarmuka-web-streamlit)
- [Command Line Interface](#command-line-interface)
- [Dataset Audio](#dataset-audio)
- [Penjelasan Modul](#penjelasan-modul)
- [Konfigurasi dan Parameter](#konfigurasi-dan-parameter)
- [Analisis Korelasi](#analisis-korelasi)
- [Lisensi](#lisensi)
---
## Gambaran Umum
Metode ini membandingkan dua rekaman audio bacaan Al-Qur'an dan menghasilkan skor kemiripan pada skala 0--100. Pipeline pemrosesan meliputi empat tahap utama:
1. **Pemuatan dan pra-pemrosesan audio** -- resampling ke 16 kHz, konversi mono, VAD endpoint trimming, dan normalisasi amplitudo.
2. **Ekstraksi fitur** -- menggunakan model pretrained WavLM Base Plus (tersimpan lokal di folder `wavlm-base-plus/`) untuk menghasilkan representasi frame-level dari 12 layer transformer.
3. **Pencocokan sekuens** -- Dynamic Time Warping dengan jarak cosine dan batasan Sakoe-Chiba band.
4. **Penilaian** -- konversi jarak DTW ternormalisasi ke skor 0--100 melalui pemetaan logistik (sigmoid) yang telah dikalibrasi.
---
## Arsitektur Pipeline
```
Audio WAV (Peserta) ──┐
├──> AudioLoader ──> WavLMEncoder ──> DTWSimilarity ──> SimilarityScorer
Audio WAV (Referensi) ─┘ (16 kHz, (frame-level (cosine DTW, (sigmoid score
mono, VAD, features, Sakoe-Chiba) 0-100)
normalisasi) layer 1-12)
```
---
## Struktur Direktori
```
kode_inti_yudisium/
|
|-- app.py # Antarmuka web Streamlit (single, batch, korelasi)
|-- run_similarity.py # CLI untuk single/batch processing
|-- scoring.py # Orchestrator pipeline end-to-end
|-- wavlm_encoder.py # Ekstraksi fitur WavLM (frozen, multi-layer)
|-- dtw_similarity.py # DTW dengan Sakoe-Chiba band dan konversi skor
|-- audio_loader.py # Pemuatan audio, VAD trimming, normalisasi
|-- correlation_analysis.py # Analisis korelasi Spearman/Pearson dan visualisasi
|-- create_dataset.py # Skrip pembuatan dataset final (merge skor + rating)
|-- dataset_final.csv # Dataset gabungan skor sistem dan rating Ustadz
|-- requirements.txt # Daftar dependensi Python
|
|-- audio referensi/ # 20 file WAV bacaan referensi (Pertemuan 1-20)
|-- audio peserta/ # Rekaman peserta, terorganisir per subfolder
| |-- peserta 1/
| |-- peserta 2/
| |-- peserta 3/
| |-- peserta 4/
| |-- peserta 5/
|
|-- README.md
```
---
## Prasyarat
- **Python** 3.9 atau lebih baru
- **PyTorch** dengan dukungan CUDA (opsional, untuk akselerasi GPU)
- Koneksi internet diperlukan saat pertama kali menjalankan program untuk mengunduh model WavLM dari HuggingFace Hub
> Model WavLM secara otomatis berjalan di GPU jika PyTorch CUDA tersedia.
> Jika tidak, sistem akan fallback ke CPU secara transparan.
---
## Instalasi
1. Clone atau unduh repositori ini.
2. Buat virtual environment (direkomendasikan):
```bash
python -m venv venv
# Windows
venv\Scripts\activate
# Linux / macOS
source venv/bin/activate
```
3. Install dependensi:
```bash
pip install -r requirements.txt
```
Dependensi utama:
| Paket | Versi | Fungsi |
|--------------------|----------|---------------------------------------------|
| `torch` | 2.12.0 | Backend deep learning, komputasi tensor |
| `torchaudio` | 2.11.0 | Pemuatan dan resampling audio |
| `transformers` | 4.57.3 | Model WavLM dari HuggingFace |
| `numpy` | 2.3.5 | Operasi numerik dan array |
| `scipy` | 1.16.3 | Uji statistik (Spearman, Pearson) |
| `pandas` | 2.3.3 | Manipulasi data tabular |
| `soundfile` | 0.13.1 | Pembacaan file audio WAV (fallback loader) |
| `webrtcvad-wheels` | 2.0.14 | Voice Activity Detection (endpoint trimming)|
| `streamlit` | 1.52.2 | Antarmuka web interaktif |
| `matplotlib` | 3.10.8 | Visualisasi grafik dan plot |
---
## Penggunaan
### Antarmuka Web (Streamlit)
Jalankan aplikasi web interaktif:
```bash
streamlit run app.py
```
Aplikasi menyediakan tiga tab utama:
| Tab | Fungsi |
|----------------------------------|----------------------------------------------------------------------------------------|
| **Single Processing** | Upload dua file audio (referensi dan peserta), pilih layer, lihat skor dan visualisasi |
| **Batch Processing (Folder)** | Proses seluruh folder `audio peserta/` terhadap `audio referensi/`, ekspor CSV |
| **Analisis Korelasi (Overview)** | Visualisasi hubungan skor sistem vs rating Ustadz (Spearman, Pearson, heatmap) |
Fitur antarmuka:
- Preview waveform sebelum dan sesudah pra-pemrosesan (VAD + normalisasi)
- Pemilihan layer WavLM (1--12) secara individual atau seluruhnya
- Visualisasi alignment path DTW dan cost matrix heatmap
- Diagnostik internal DTW (opsional)
- Interpretasi skor otomatis (Sangat Mirip, Mirip, Cukup Mirip, Kurang Mirip)
### Command Line Interface
**Mode Single** -- bandingkan dua file audio:
```bash
python run_similarity.py audio_peserta.wav audio_referensi.wav
```
Opsi tambahan:
```bash
python run_similarity.py audio1.wav audio2.wav --detailed --json
```
**Mode Batch** -- proses seluruh folder:
```bash
python run_similarity.py \
--participant-dir "audio peserta" \
--reference-dir "audio referensi" \
--recursive \
--output hasil_batch.csv
```
Parameter CLI yang tersedia:
| Parameter | Default | Keterangan |
|----------------------|-------------------------------|--------------------------------------------------|
| `--model` | `./wavlm-base-plus` | Model WavLM (path lokal, sudah tersedia di repo) |
| `--device` | auto-detect | Device komputasi (`cuda` / `cpu`) |
| `--distance` | `cosine` | Metrik jarak DTW (`cosine` / `euclidean`) |
| `--no-normalize` | _disabled_ | Nonaktifkan normalisasi jarak DTW |
| `--detailed` | _disabled_ | Tampilkan metrik detail (single mode) |
| `--json` | _disabled_ | Output dalam format JSON |
| `--recursive` | _disabled_ | Cari file WAV secara rekursif (batch mode) |
| `--output` | `similarity_results.csv` | Path output batch (`.csv` / `.xlsx`) |
---
## Dataset Audio
Dataset audio yang digunakan dalam penelitian ini terdiri dari 20 frasa bacaan DIROSA (Pertemuan 1--20) yang dibacakan oleh 5 peserta, masing-masing dibandingkan terhadap satu audio referensi per frasa.
**Unduh dataset audio:**
[https://drive.google.com/drive/folders/1wO7WvfKn4bnWfLxaVSHSOqn0psosf8oB?usp=sharing](https://drive.google.com/drive/folders/1wO7WvfKn4bnWfLxaVSHSOqn0psosf8oB?usp=sharing)
Setelah diunduh, letakkan isi folder sesuai struktur berikut:
```
kode_inti_yudisium/
|-- audio referensi/
| |-- Dirosa Pertemuan 1.wav
| |-- Dirosa Pertemuan 2.wav
| |-- ...
| |-- Dirosa Pertemuan 20.wav
|
|-- audio peserta/
| |-- peserta 1/
| | |-- Dirosa Pertemuan 1.wav
| | |-- Dirosa Pertemuan 2.wav
| | |-- ...
| |-- peserta 2/
| |-- ...
```
Format audio: **WAV, mono, 16-bit PCM**. Audio akan di-resample ke 16 kHz secara otomatis jika diperlukan.
---
## Penjelasan Modul
### `audio_loader.py` -- AudioLoader
Bertanggung jawab atas seluruh tahap pra-pemrosesan audio:
- **Pemuatan audio**: menggunakan `soundfile` sebagai loader utama (tanpa dependensi FFmpeg), dengan fallback ke `torchaudio`.
- **Resampling**: konversi otomatis ke 16 kHz (target sample rate WavLM).
- **Konversi mono**: audio stereo dirata-ratakan menjadi satu kanal.
- **VAD Endpoint Trimming**: menggunakan WebRTC VAD dengan mekanisme hysteresis (onset/offset) untuk menghapus segmen hening di awal dan akhir tanpa memotong jeda internal.
- **Energy Refinement**: pemangkasan berbasis RMS envelope untuk menghilangkan sisa noise atau napas yang lolos dari VAD.
- **Normalisasi amplitudo**: penskalaan waveform ke rentang [-1, 1].
### `wavlm_encoder.py` -- WavLMEncoder
Mengekstraksi fitur frame-level menggunakan model pretrained WavLM (frozen, tanpa fine-tuning):
- Mendukung ekstraksi dari satu layer tertentu atau beberapa layer sekaligus.
- Model berjalan di GPU secara otomatis jika CUDA tersedia.
- Pipeline PyTorch-only (TensorFlow/Flax dinonaktifkan secara eksplisit).
### `dtw_similarity.py` -- DTWSimilarity
Modul inti pencocokan sekuens:
- **Cost matrix**: jarak cosine atau Euclidean (vectorised).
- **DTW dengan Sakoe-Chiba band**: membatasi jalur warping untuk efisiensi dan menghindari alignment yang tidak realistis.
- **Backtracking**: rekonstruksi optimal warping path.
- **Konversi skor**: pemetaan logistik (sigmoid) dari jarak ternormalisasi ke skala 0--100.
Kalibrasi default (midpoint=0.3, steepness=10.0):
| Jarak (d) | Skor | Interpretasi |
|--------------|----------|---------------------|
| ~ 0.05 | ~ 92 | Sangat mirip |
| ~ 0.15 | ~ 82 | Mirip |
| ~ 0.30 | = 50 | Borderline |
| ~ 0.35 | ~ 38 | Kurang mirip |
| > 0.50 | < 12 | Sangat berbeda |
### `scoring.py` -- SimilarityScorer
Orchestrator yang menghubungkan seluruh komponen pipeline:
- `compute_similarity()` -- mengembalikan jarak DTW mentah.
- `compute_similarity_score_normalized()` -- mengembalikan skor 0--100.
- `compute_detailed_similarity()` -- mengembalikan hasil lengkap per layer termasuk warping path, cost matrix, diagnostik, dan waveform.
### `correlation_analysis.py`
Modul analisis statistik untuk validasi metode:
- Korelasi **Spearman** (monotonic) dan **Pearson** (linear) antara skor sistem dan rating Ustadz.
- Visualisasi: bar chart, scatter plot, heatmap, dan diagram pasangan frasa.
### `create_dataset.py`
Skrip utilitas untuk menggabungkan hasil batch processing (skor per layer) dengan rating manual Ustadz menjadi satu dataset (`dataset_final.csv`).
### `run_similarity.py`
CLI entry point yang mendukung mode single (dua file) dan batch (dua folder), dengan output CSV/XLSX.
### `app.py`
Antarmuka web berbasis Streamlit yang menyatukan seluruh fungsionalitas pipeline dalam tampilan interaktif.
---
## Konfigurasi dan Parameter
Parameter utama pipeline dikonfigurasi melalui `SimilarityScorer`:
| Parameter | Default | Keterangan |
|----------------------|-------------------------------|-----------------------------------------------------------|
| `model_name` | `./wavlm-base-plus` | Model WavLM (path lokal, sudah tersedia di repo) |
| `distance_metric` | `cosine` | Metrik jarak untuk DTW |
| `sakoe_chiba_ratio` | `0.1` | Lebar band Sakoe-Chiba (fraksi dari panjang sekuens) |
| `normalize_dtw` | `True` | Normalisasi jarak DTW berdasarkan panjang warping path |
| `score_midpoint` | `0.3` | Titik tengah sigmoid (jarak yang menghasilkan skor 50) |
| `score_steepness` | `10.0` | Ketajaman transisi sigmoid |
Parameter VAD (dikonfigurasi melalui `AudioLoader`):
| Parameter | Default | Keterangan |
|--------------------------|---------|-----------------------------------------------------------------|
| `vad_mode` | `1` | Agresivitas WebRTC VAD (0--3, 1--2 direkomendasikan) |
| `vad_frame_ms` | `10` | Panjang frame VAD dalam milidetik (10, 20, atau 30) |
| `vad_onset_frames` | `2` | Jumlah frame voiced berturut-turut untuk mendeteksi onset |
| `vad_offset_frames` | `4` | Jumlah frame unvoiced berturut-turut untuk mendeteksi offset |
| `energy_trim_threshold` | `0.06` | Threshold energi untuk pemangkasan tambahan pasca-VAD |
---
## Analisis Korelasi
File `dataset_final.csv` berisi 101 pasangan data (5 peserta x ~20 frasa) dengan kolom:
| Kolom | Keterangan |
|-----------------|-----------------------------------------------------|
| `ID_Pasangan` | Identifier unik pasangan peserta-frasa |
| `ID_Peserta` | ID peserta (1--5) |
| `ID_Frasa` | Nama file frasa (Dirosa Pertemuan X.wav) |
| `Score L1`--`Score L12` | Skor kemiripan dari masing-masing layer WavLM |
| `rating` | Penilaian manual Ustadz (ground truth) |
Analisis korelasi Spearman digunakan untuk mengidentifikasi layer WavLM yang paling berkorelasi dengan penilaian manusia, sehingga dapat dipilih representasi yang paling relevan secara perseptual.
---
## Lisensi
Proyek ini dikembangkan untuk keperluan akademis (skripsi). Model WavLM Base Plus (`wavlm-base-plus/`) bersumber dari [microsoft/wavlm-base-plus](https://huggingface.co/microsoft/wavlm-base-plus) dan mengikuti lisensi yang ditetapkan oleh Microsoft Research.