Dự án này triển khai thuật toán DUET (Degenerate Unmixing Estimation Technique) cho bài toán Blind Source Separation (BSS) - Tách nguồn âm thanh mù. Các phương pháp được triển khai bao gồm:
- DUET gốc - Thuật toán DUET cơ bản
- DUET + Delay-and-Sum Beamformer - Kết hợp DUET với kỹ thuật beamforming Delay-and-Sum
- DUET + Hybrid Beamformer - Kết hợp DUET với Hybrid Beamformer (MVDR + Delay-and-Sum)
- Khoảng cách giữa 2 mic: 4.57 cm
- Tốc độ âm thanh: 343 m/s
- Speaker 1: 15 độ
- Speaker 2: 165 độ
- Sample rate mục tiêu: 16000 Hz
BSS_DUET/
├── 📂 Thư mục input/output
│ ├── newaudio/ # Thư mục chứa file audio đầu vào mới
│ ├── record/ # Thư mục chứa file ghi âm
│ ├── record2/ # Thư mục chứa file ghi âm (bản 2)
│ ├── new_record/ # Thư mục chứa file ghi âm mới
│ ├── reference/ # Thư mục chứa file tham chiếu (ground truth)
│ ├── output/ # Thư mục kết quả xử lý cơ bản
│ ├── output_comparison/ # Kết quả so sánh các phương pháp
│ ├── output_ratio_comparison/ # Kết quả so sánh các tỷ lệ MVDR/DS
│ └── results_duet/ # Kết quả DUET
│
├── 📄 File xử lý chính
├── 📄 File tiện ích
└── 📄 File hỗ trợ STFT
| File | Mô tả | Input | Output |
|---|---|---|---|
f1.m |
DUET + Delay-and-Sum Beamformer - Xử lý tín hiệu với DUET kết hợp Delay-and-Sum beamformer + Post-processing + SI-SDR Evaluation với PIT | newaudio/conversation_multi_ch0.wav, newaudio/conversation_multi_ch1.wav |
output_integrated2/, output/final_source*.wav, SI-SDR report |
f2.m |
DUET + Hybrid Beamformer (60% MVDR + 40% DS) - Xử lý tín hiệu với DUET kết hợp Hybrid beamformer + Post-processing + SI-SDR Evaluation | newaudio/conversation_multi_ch0.wav, newaudio/conversation_multi_ch1.wav |
output_integrated3/, output/final_source*.wav, SI-SDR report |
f2_compare_ratios.m |
So sánh nhiều tỷ lệ MVDR/DS - Thử nghiệm với 17 tỷ lệ khác nhau (10%-90% MVDR) để tìm cấu hình tốt nhất | newaudio/conversation_multi_no_noise_ch0.wav, newaudio/conversation_multi_no_noise_ch1.wav |
output_ratio_comparison/, CSV kết quả, biểu đồ so sánh |
| Đặc điểm | f1.m | f2.m |
|---|---|---|
| Beamformer | Delay-and-Sum thuần | Hybrid (60% MVDR + 40% DS) |
| MVDR Beamformer | ❌ Không có | ✅ Có - sử dụng ma trận hiệp phương sai nhiễu |
| Output folder | output_integrated2 |
output_integrated3 |
| File | Mô tả | Input | Output |
|---|---|---|---|
compare_methods.m |
So sánh DS vs Hybrid tại nhiều góc (15°, 30°, 45°, 60°, 75°) - Loop qua các thư mục góc khác nhau | record/[angle]/mic1.wav, record/[angle]/mic2.wav |
output_comparison/angle_[X]/source*_method*.wav, overlay plots |
compare_all_methods.m |
So sánh toàn diện 3 phương pháp: DUET gốc, DUET+DS, DUET+Hybrid(Proposed) - Energy plot (dB) | 2mix2src130ms/mic1.wav, 2mix2src130ms/mic2.wav |
output_comparison_all/, energy comparison plot |
| Đặc điểm | compare_methods.m | compare_all_methods.m |
|---|---|---|
| Số phương pháp so sánh | 2 (DS vs Hybrid) | 3 (DUET, DS, Hybrid) |
| Input folder | record/[angle]/ |
2mix2src130ms/ |
| Số góc thử nghiệm | 5 góc (15°-75°) | 1 góc cố định (15°, 165°) |
| Energy plot | ❌ | ✅ So sánh 4 đường (Mic, DUET, DS, Proposed) |
| File | Mô tả | Input | Output |
|---|---|---|---|
duet_delay_and_sum.m |
DUET + Delay-and-Sum standalone - Phiên bản độc lập với input từ record/ |
record/mic1.wav, record/mic2.wav |
output_integrated/final_source*.wav, energy plot |
duet_hybrid_beamformer.m |
DUET + Hybrid Beamformer standalone - Phiên bản độc lập với input từ 4/ |
4/mic1.wav, 4/mic2.wav |
output_integrated3/final_source*.wav, energy plot |
duet_hybrid_mvdr_ds.m |
DUET + Hybrid MVDR-DS - Tương tự duet_hybrid_beamformer.m |
(tương tự) | (tương tự) |
bss_duet_ds.m |
DUET + Delay-and-Sum - Input từ thư mục 4/ |
4/mic1.wav, 4/mic2.wav |
output_integrated2/, energy plot |
| File | Input folder | Output folder | Beamformer |
|---|---|---|---|
duet_delay_and_sum.m |
record/ |
output_integrated/ |
Delay-and-Sum |
bss_duet_ds.m |
4/ |
output_integrated2/ |
Delay-and-Sum |
duet_hybrid_beamformer.m |
4/ |
output_integrated3/ |
Hybrid (60% MVDR + 40% DS) |
| File | Mô tả | Input | Output |
|---|---|---|---|
run_beta_experiments.m |
Thử nghiệm với các giá trị β khác nhau (0.0, 0.2, 0.4, 0.6, 0.8, 1.0) - β là tỷ lệ MVDR trong Hybrid beamformer | record/mic1.wav, record/mic2.wav |
output_beta_experiments/beta_[X]/source*_beta*.wav |
- β = 0.0: 100% Delay-and-Sum (DS only)
- β = 0.2: 20% MVDR + 80% DS
- β = 0.4: 40% MVDR + 60% DS
- β = 0.6: 60% MVDR + 40% DS (cấu hình mặc định)
- β = 0.8: 80% MVDR + 20% DS
- β = 1.0: 100% MVDR (MVDR only)
| File | Mô tả | Sử dụng bởi |
|---|---|---|
tfanalysis.m |
Phân tích thời gian-tần số (STFT) - Chuyển tín hiệu miền thời gian sang miền thời gian-tần số | Tất cả file xử lý chính |
tfsynthesis.m |
Tổng hợp thời gian-tần số (Inverse STFT) - Tái tạo tín hiệu từ biểu diễn thời gian-tần số | Tất cả file xử lý chính |
twoDsmooth.m |
Làm mịn ma trận 2D - Sử dụng kernel trung bình để làm mịn histogram trong thuật toán DUET | Tất cả file xử lý chính |
| File | Mô tả | Input | Output |
|---|---|---|---|
si_sdr.m |
Tính SI-SDR (Scale-Invariant Signal-to-Distortion Ratio) - Metric đánh giá chất lượng tách nguồn. Bao gồm các hàm: si_sdr(), si_sdri(), si_sdr_batch(), si_sdr_pit() |
Estimated signal, Reference signal | SI-SDR value (dB) |
| Hàm | Mô tả |
|---|---|
si_sdr(estimated, reference) |
Tính SI-SDR giữa tín hiệu ước lượng và tín hiệu tham chiếu |
si_sdri(estimated, reference, mixture) |
Tính SI-SDR Improvement so với tín hiệu hỗn hợp |
si_sdr_batch(estimated_sources, reference_sources) |
Tính SI-SDR cho nhiều nguồn |
si_sdr_pit(estimated_sources, reference_sources) |
Tính SI-SDR với Permutation Invariant Training |
| File | Mô tả | Input | Output |
|---|---|---|---|
analyze_audio_signals.m |
Phân tích tín hiệu audio - Hiển thị waveform và spectrogram của 2 mic | 4/mic1.wav, 4/mic2.wav |
mic1_analysis.png, mic2_analysis.png |
analyze_audio_signals copy.m |
Bản copy của analyze_audio_signals.m |
(tương tự) | (tương tự) |
analyze_audio_signals3.m |
Phiên bản 3 của analyze_audio_signals.m |
(tương tự) | (tương tự) |
plot_mic_waveforms.m |
Vẽ waveform 2 mic - Hiển thị dạng sóng của mic1 và mic2 | record2/mic1.wav, record2/mic2.wav |
Figure display |
plot_two_audio_files.m |
Vẽ waveform 2 file audio bất kỳ - Quét thư mục và vẽ 2 file đầu tiên | Thư mục audio bất kỳ | Figure display |
| File | Mô tả | Input | Output |
|---|---|---|---|
mix_audio.py |
Trộn 2 file audio với khoảng nghỉ ở giữa. Tạo 3 file: mixture, reference_s1, reference_s2 cho mục đích đánh giá SI-SDR | newaudio/s1.wav, newaudio/s2.wav |
mixture.wav, reference_s1.wav, reference_s2.wav |
split_audio.py |
Tách file audio thành 2 phần dựa trên mốc thời gian. Phần 1 giữ audio trước mốc, phần 2 giữ audio sau mốc | newaudio/conversation_multi_ch0.wav |
*_first_[X]s.wav, *_after_[X]s.wav |
| File | Mô tả | Input | Output |
|---|---|---|---|
create_reference_signals.m |
Tạo tín hiệu tham chiếu (ground truth) - Cắt mic1.wav thành 2 phần: Speaker 1 (0-7s) và Speaker 2 (7.5s-hết) | record/mic1.wav |
reference/speaker1_reference.wav, reference/speaker2_reference.wav |
get_audio_durations.m |
Lấy thời lượng audio - In thời lượng của tất cả file audio trong các thư mục | Thư mục record2/ (mặc định) |
Console output |
save_audio_durations.m |
Lưu thời lượng audio - Lưu thời lượng của tất cả file audio vào file text | Thư mục new_record/ (mặc định) |
audio_durations.txt |
run_save_durations.m |
Script chạy save_audio_durations | - | - |
┌─────────────────────────────────────────────────────────────────┐
│ PREPROCESSING │
│ 1. Load audio từ 2 microphones │
│ 2. Resample về 16kHz │
│ 3. Convert stereo → mono │
│ 4. Pre-emphasis filter (α = 0.97) │
│ 5. Bandpass filter (250-4000 Hz, 6th order) │
│ 6. Normalize │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ STFT ANALYSIS │
│ Window: 1024 samples, Hop: 512 samples, FFT: 1024 points │
│ Window function: Hamming │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ DUET ALGORITHM │
│ 1. Tính tỷ lệ biên độ (α) và độ trễ pha (δ) │
│ 2. Tạo 2D histogram với weighted voting │
│ 3. Tìm 2 peaks tách biệt nhất (nguồn) │
│ 4. Tạo binary masks cho từng nguồn │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ BEAMFORMING │
│ Option 1: Delay-and-Sum │
│ Option 2: Hybrid (β × MVDR + (1-β) × DS), β mặc định = 0.6 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ POST-FILTERING │
│ 1. Wiener filtering với interference estimation │
│ 2. Soft binary masking │
│ 3. Spectral subtraction │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ POST-PROCESSING │
│ 1. De-emphasis filter (inverse của pre-emphasis) │
│ 2. Smoothing filter (moving average) │
│ 3. Noise gate (adaptive threshold) │
│ 4. High-frequency enhancement │
│ 5. Peak normalization (0.95) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ OUTPUT & EVALUATION │
│ 1. Lưu audio files (.wav) │
│ 2. Tính SI-SDR với PIT (Permutation Invariant Training) │
│ 3. Tạo visualization (waveform, energy plot) │
└─────────────────────────────────────────────────────────────────┘
% Đặt file audio đầu vào vào thư mục phù hợp
% Ví dụ: newaudio/conversation_multi_ch0.wav, newaudio/conversation_multi_ch1.wav% Sử dụng Delay-and-Sum beamformer
run('f1.m')
% Sử dụng Hybrid beamformer (60% MVDR + 40% DS)
run('f2.m')% So sánh toàn diện 3 phương pháp
run('compare_all_methods.m')
% Thử nghiệm các tỷ lệ MVDR/DS khác nhau
run('f2_compare_ratios.m')# Python: Trộn audio tạo mixture và reference
python mix_audio.py- Công thức: SI-SDR = 10 × log₁₀(||s_target||² / ||e_noise||²)
- Giá trị cao hơn = tốt hơn
- Sử dụng PIT để xử lý ambiguity về thứ tự nguồn
- SI-SDRi = SI-SDR(estimated, reference) - SI-SDR(mixture, reference)
- Đo lường mức cải thiện so với tín hiệu hỗn hợp ban đầu