SFlowTTS / Data /dd.py
FashionFlora's picture
Upload full repo excluding dump_40, dump_100, precomputed_tokens, precomputed_data
fb0011a verified
Raw History Blame Contribute Delete
4.45 kB
import os
from phonemizer import backend
# Konfiguracja plik贸w
INPUT_FILE = 'train_3_filtered_dur.txt' # Plik wej艣ciowy
OUTPUT_FILE = 'train_3_filtered_dur_fixed.txt' # Plik wynikowy
# Zestaw znak贸w, kt贸rych obecno艣膰 w fonemach powoduje usuni臋cie linii
FORBIDDEN_CHARS = {'{', '}', '(', ')'}
def initialize_phonemizers():
"""
Inicjalizuje s艂ownik backend贸w espeak dla wymaganych j臋zyk贸w.
Zwraca s艂ownik { 'language_id': backend_instance }
"""
phonemizers = {}
print("Inicjalizacja phonemizer贸w (mo偶e to chwil臋 potrwa膰)...")
try:
# ID 0: Polski
phonemizers['0'] = backend.EspeakBackend(
language='pl',
preserve_punctuation=True,
with_stress=True
)
# ID 1: Angielski Brytyjski
phonemizers['1'] = backend.EspeakBackend(
language='en-gb',
preserve_punctuation=True,
with_stress=True
)
# ID 2: Hindi
phonemizers['2'] = backend.EspeakBackend(
language='hi',
preserve_punctuation=True,
with_stress=True
)
print("Phonemizery zainicjalizowane pomy艣lnie.")
return phonemizers
except Exception as e:
print(f"Krytyczny b艂膮d inicjalizacji phonemizer贸w: {e}")
print("Upewnij si臋, 偶e masz zainstalowany 'espeak-ng'.")
return None
def process_dataset():
# 1. Przygotuj phonemizery
phonemizers = initialize_phonemizers()
if not phonemizers:
return
if not os.path.exists(INPUT_FILE):
print(f"Nie znaleziono pliku: {INPUT_FILE}")
return
print(f"Rozpoczynam przetwarzanie pliku {INPUT_FILE}...")
processed_count = 0
skipped_count = 0
with open(INPUT_FILE, 'r', encoding='utf-8') as f_in, \
open(OUTPUT_FILE, 'w', encoding='utf-8') as f_out:
for line_num, line in enumerate(f_in, 1):
line = line.strip()
if not line:
continue
# 2. Split z limitem 4
parts = line.split('|', 4)
# Sprawdzenie poprawno艣ci struktury (musi by膰 5 kolumn)
if len(parts) < 5:
print(f"Ostrze偶enie: Linia {line_num} ma nieprawid艂owy format (pomini臋to).")
continue
# Wyci膮gamy potrzebne dane
# parts[1] = phonemes (to podmieniamy i sprawdzamy)
lang_id = parts[3]
raw_text = parts[4]
# Pobieramy odpowiedni phonemizer
current_backend = phonemizers.get(lang_id)
if current_backend:
try:
# Generowanie fonem贸w
phonemes_list = current_backend.phonemize([raw_text], strip=True)
if phonemes_list:
parts[1] = phonemes_list[0] # Aktualizacja fonem贸w
except Exception as e:
print(f"B艂膮d phonemizera w linii {line_num} (ID j臋z: {lang_id}): {e}")
# --- NOWA LOGIKA FILTROWANIA ---
current_phonemes = parts[1]
# Sprawdzamy czy w fonemach wyst臋puje kt贸ry艣 z zakazanych znak贸w
if any(char in current_phonemes for char in FORBIDDEN_CHARS):
skipped_count += 1
# Opcjonalnie: odkomentuj lini臋 poni偶ej, je艣li chcesz widzie膰, co jest usuwane
# print(f"Pomini臋to lini臋 {line_num}: znaleziono zakazany znak w fonemach: {current_phonemes}")
continue
# 3. Zapis do nowego pliku (tylko je艣li walidacja przesz艂a pomy艣lnie)
processed_count += 1
new_line = "|".join(parts)
f_out.write(new_line + '\n')
# Logowanie post臋pu co 100 linii
if processed_count > 0 and processed_count % 100 == 0:
print(f"Zapisano {processed_count} poprawnych linii...")
print("-" * 30)
print(f"Zako艅czono!")
print(f"Poprawnie przetworzono i zapisano: {processed_count}")
print(f"Usuni臋to (zawiera艂y '{{', '}}', '(', ')'): {skipped_count}")
print(f"Wynik zapisano w: {OUTPUT_FILE}")
if __name__ == "__main__":
process_dataset()