File size: 4,447 Bytes
fb0011a | 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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | 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() |