File size: 2,965 Bytes
4d3248c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import json
import random
import os
import shutil
from pathlib import Path

# --- CONFIG ---
input_manifest = "thai_processed_data/manifest_clustered.jsonl"
output_dir = "check_clusters"  # Where we will copy files for you to listen
samples_to_check = 5           # How many groups to check
files_per_group = 3            # How many audio files per group to copy
# --------------

def main():
    print(f"Reading {input_manifest}...")
    
    # 1. Load and Group Data
    clusters = {}
    with open(input_manifest, 'r', encoding='utf-8') as f:
        for line in f:
            data = json.loads(line)
            speaker_id = data['speaker']
            audio_path = data['audio_path']
            
            if speaker_id not in clusters:
                clusters[speaker_id] = []
            clusters[speaker_id].append(audio_path)

    # Filter for groups that actually have pairs (size > 1)
    valid_clusters = [k for k, v in clusters.items() if len(v) >= 2]
    
    print(f"Found {len(clusters)} total groups.")
    print(f"Found {len(valid_clusters)} groups with at least 2 files (valid for pairing).")

    if not valid_clusters:
        print("Error: No valid clusters found! Did you run the clustering script?")
        return

    # 2. Pick Random Groups to Audit
    selected_speakers = random.sample(valid_clusters, min(samples_to_check, len(valid_clusters)))

    # 3. Copy Files for Manual Checking
    if os.path.exists(output_dir):
        shutil.rmtree(output_dir)
    os.makedirs(output_dir)

    print(f"\n--- GENERATING SAMPLES IN '{output_dir}' ---")
    
    for i, spk_id in enumerate(selected_speakers):
        # Create a subfolder for this speaker
        folder_name = f"Group_{i+1}_{spk_id}"
        folder_path = os.path.join(output_dir, folder_name)
        os.makedirs(folder_path)
        
        # Get random files from this speaker
        files = clusters[spk_id]
        selected_files = random.sample(files, min(files_per_group, len(files)))
        
        print(f"\nGroup {i+1} (ID: {spk_id}):")
        
        for src_path in selected_files:
            # Handle path logic (in case paths are relative)
            if not os.path.exists(src_path):
                # Try prepending 'thaitts_emilia_dataset' or common roots if not found
                # But usually manifest paths are relative to where you ran preprocess
                print(f"  [WARNING] File not found: {src_path}")
                continue
                
            file_name = os.path.basename(src_path)
            dst_path = os.path.join(folder_path, file_name)
            shutil.copy2(src_path, dst_path)
            print(f"  - Copied: {file_name}")

    print(f"\nDONE! Go open the folder '{output_dir}' and listen to the files.")
    print("If files in 'Group_1' sound like the same person, the clustering worked!")

if __name__ == "__main__":
    main()