File size: 2,857 Bytes
755d2a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
79
80
81
82
83
import pandas as pd
import os
import librosa
import soundfile as sf
from tqdm import tqdm

# --- Configurações ---
TARGET_SR = 16000
TARGET_SUBSET = "TEDx Talks"

# Caminhos de entrada
BASE_DATA_PATH = '../data/coraa/'
METADATA_FILE = os.path.join(BASE_DATA_PATH, 'metadata_train_final.csv')

# Caminho de saída
OUTPUT_PATH = '../dataset_preparado/'
OUTPUT_BR_PATH = os.path.join(OUTPUT_PATH, 'pt_br')
OUTPUT_PT_PATH = os.path.join(OUTPUT_PATH, 'pt_pt')

# --- Mapeamento ---
PATH_MAP = {
    'pt_br': OUTPUT_BR_PATH,
    'pt_pt': OUTPUT_PT_PATH
}

def preprocess_coraa():
    print(f"Iniciando o pré-processamento do CORAA (filtrando por '{TARGET_SUBSET}')...")

    os.makedirs(OUTPUT_BR_PATH, exist_ok=True)
    os.makedirs(OUTPUT_PT_PATH, exist_ok=True)

    try:
        df = pd.read_csv(METADATA_FILE)
    except FileNotFoundError:
        print(f"Erro: Arquivo de metadados não encontrado em {METADATA_FILE}")
        return
        
    # --- Adicionado: Filtro para o subset TEDx Talks ---
    df = df[df['dataset'] == TARGET_SUBSET].copy()
    print(f"Encontradas {len(df)} amostras no subset '{TARGET_SUBSET}'.")

    df = df[['file_path', 'variety']].dropna()
    df = df[df['variety'].isin(['pt_br', 'pt_pt'])]
    df.rename(columns={'variety': 'label'}, inplace=True)
    
    print(f"Amostras encontradas por sotaque (antes do balanceamento):\n{df['label'].value_counts()}")

    # --- Lógica de Amostragem Aleatória e Balanceamento ---
    class_counts = df['label'].value_counts().to_dict()
    if not class_counts or len(class_counts) < 2:
        print("Erro: Não foram encontradas amostras suficientes de ambas as classes no subset TEDx para balancear.")
        return

    min_samples = min(class_counts.values())
    print(f"Classe minoritária tem {min_samples} amostras. Usando este valor para o balanceamento.")
    
    df = df.sample(frac=1).reset_index(drop=True)
    
    max_samples_per_class = min_samples
    counters = {'pt_br': 0, 'pt_pt': 0}

    for _, row in tqdm(df.iterrows(), total=df.shape[0], desc="Processando áudios"):
        label = row['label']
        
        if counters[label] >= max_samples_per_class:
            continue

        source_audio_path = os.path.join(BASE_DATA_PATH, row['file_path'])
        filename = os.path.basename(row['file_path'])
        dest_path = os.path.join(PATH_MAP[label], f"coraa_tedx_{filename}")

        try:
            audio, sr = librosa.load(source_audio_path, sr=TARGET_SR, mono=True)
            sf.write(dest_path, audio, TARGET_SR)
            counters[label] += 1
        except Exception as e:
            print(f"Aviso: Não foi possível processar {source_audio_path}. Erro: {e}")

    print("\nPré-processamento do CORAA (TEDx) concluído!")
    print(f"Amostras salvas (balanceado): {counters}")

if __name__ == '__main__':
    preprocess_coraa()