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