# 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.