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()