File size: 5,121 Bytes
98b6d67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
124
125
126
127
128
129
130
# app/utils/translit.py

def lotin_to_kirill(text: str) -> str:
    """

    Lotin alifbosidagi matnni Kirill alifbosiga o'giradigan funksiya.

    Bu funksiya hech qanday tashqi kutubxonaga bog'liq emas.

    """
    # Almashtirish qoidalari.
    # Ikki belgili harflar bir belgili harflardan OLDIN turishi juda muhim!
    rules = [
        ("sh", "ш"), ("ch", "ч"), ("o'", "ў"), ("g'", "ғ"),
        ("Sh", "Ш"), ("Ch", "Ч"), ("O'", "Ў"), ("G'", "Ғ"),
        ('ts', 'ц'), ('Ts', 'Ц'),
        ('ye', 'е'), ('Ye', 'Е'),
        ('yo', 'ё'), ('Yo', 'Ё'),
        ('yu', 'ю'), ('Yu', 'Ю'),
        ('ya', 'я'), ('Ya', 'Я'),
        # Oddiy harflar
        ('a', 'а'), ('b', 'б'), ('d', 'д'), ('e', 'е'), ('f', 'ф'),
        ('g', 'г'), ('h', 'ҳ'), ('i', 'и'), ('j', 'ж'), ('k', 'к'),
        ('l', 'л'), ('m', 'м'), ('n', 'н'), ('o', 'о'), ('p', 'п'),
        ('q', 'қ'), ('r', 'р'), ('s', 'с'), ('t', 'т'), ('u', 'у'),
        ('v', 'в'), ('x', 'х'), ('y', 'й'), ('z', 'з'), ("'", "ъ"),
        # Bosh harflar
        ('A', 'А'), ('B', 'Б'), ('D', 'Д'), ('E', 'Е'), ('F', 'Ф'),
        ('G', 'Г'), ('H', 'Ҳ'), ('I', 'И'), ('J', 'Ж'), ('K', 'К'),
        ('L', 'Л'), ('M', 'М'), ('N', 'Н'), ('O', 'О'), ('P', 'П'),
        ('Q', 'Қ'), ('R', 'Р'), ('S', 'С'), ('T', 'Т'), ('U', 'У'),
        ('V', 'В'), ('X', 'Х'), ('Y', 'Й'), ('Z', 'З'),
    ]

    # So'z boshidagi 'E' harfini 'Э' ga almashtirish
    words = text.split(' ')
    processed_words = []
    for word in words:
        if word.startswith('E'):
            word = 'Э' + word[1:]
        elif word.startswith('e'):
            word = 'э' + word[1:]
        processed_words.append(word)
    text = ' '.join(processed_words)

    # Qolgan barcha qoidalarni qo'llash
    for lotin, kirill in rules:
        text = text.replace(lotin, kirill)

    return text


def clean_cyrillic_text(text: str) -> str:
    """

    Matnni faqat o'zbek/rus kirill harflari, raqamlar va 

    bo'sh joy qoldirib tozalaydi.

    

    TTS modeliga yuborishdan oldin ishlatiladi.

    

    YANGILANGAN: Rus va o'zbek kirill harflarini qo'llab-quvvatlaydi

    

    Args:

        text: Tozalanadigan matn

        

    Returns:

        Tozalangan matn (faqat kirill, raqamlar va tinish belgilari)

    """
    # O'zbek va rus kirill harflarini qo'shish
    # O'zbek maxsus harflari: ў, қ, ғ, ҳ
    # Rus harflari: standard 33 ta harf (а-я)
    allowed_chars = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяўқғҳ "
    allowed_chars += allowed_chars.upper()  # Bosh harflarni ham qo'shamiz
    allowed_chars += "0123456789.,!?-:"     # Tinish belgilari va raqamlar

    cleaned_text = "".join(filter(lambda char: char in allowed_chars, text))
    return cleaned_text



def russian_latin_to_cyrillic(text: str) -> str:
    """

    RUSCHA lotin alifbosidagi matnni Kirill alifbosiga o'giradi.

    

    Misol:

        "u menya bolit golova" → "у меня болит голова"

        "privet" → "привет"

        "spasibo" → "спасибо"

    

    Args:

        text: Ruscha matn (lotin alifbosida)

        

    Returns:

        Ruscha matn (kirill alifbosida)

    """
    # Ruscha lotin → kirill konvertatsiya jadvali
    # MUHIM: Ikki harfli kombinatsiyalar birinchi bo'lishi kerak!
    rules = [
        # Ikki harfli kombinatsiyalar (uzun kombinatsiyalar avval)
        ('shch', 'щ'), ('Shch', 'Щ'), ('SHCH', 'Щ'),
        ('sh', 'ш'), ('Sh', 'Ш'), ('SH', 'Ш'),
        ('ch', 'ч'), ('Ch', 'Ч'), ('CH', 'Ч'),
        ('zh', 'ж'), ('Zh', 'Ж'), ('ZH', 'Ж'),
        ('yo', 'ё'), ('Yo', 'Ё'), ('YO', 'Ё'),
        ('yu', 'ю'), ('Yu', 'Ю'), ('YU', 'Ю'),
        ('ya', 'я'), ('Ya', 'Я'), ('YA', 'Я'),
        ('ts', 'ц'), ('Ts', 'Ц'), ('TS', 'Ц'),
        ('ye', 'е'), ('Ye', 'Е'), ('YE', 'Е'),
        ('kh', 'х'), ('Kh', 'Х'), ('KH', 'Х'),
        
        # Bir harfli (kichik harflar)
        ('a', 'а'), ('b', 'б'), ('v', 'в'), ('g', 'г'), ('d', 'д'),
        ('e', 'е'), ('z', 'з'), ('i', 'и'), ('j', 'й'), ('k', 'к'),
        ('l', 'л'), ('m', 'м'), ('n', 'н'), ('o', 'о'), ('p', 'п'),
        ('r', 'р'), ('s', 'с'), ('t', 'т'), ('u', 'у'), ('f', 'ф'),
        ('h', 'х'), ('c', 'к'), ('y', 'ы'), ('w', 'в'),
        
        # Bir harfli (bosh harflar)
        ('A', 'А'), ('B', 'Б'), ('V', 'В'), ('G', 'Г'), ('D', 'Д'),
        ('E', 'Е'), ('Z', 'З'), ('I', 'И'), ('J', 'Й'), ('K', 'К'),
        ('L', 'Л'), ('M', 'М'), ('N', 'Н'), ('O', 'О'), ('P', 'П'),
        ('R', 'Р'), ('S', 'С'), ('T', 'Т'), ('U', 'У'), ('F', 'Ф'),
        ('H', 'Х'), ('C', 'К'), ('Y', 'Ы'), ('W', 'В'),
        
        # Maxsus belgilar
        ("'", 'ь'),  # Yumshatish belgisi
        ('"', 'ъ'),  # Qattiqlik belgisi
    ]
    
    # Qoidalarni qo'llash (ketma-ketlik muhim!)
    for latin, cyrillic in rules:
        text = text.replace(latin, cyrillic)
    
    return text