Ez a szkript, a normaliser.py, magyar szövegek előfeldolgozására szolgál, fonetikailag explicitebb alakra konvertálva azokat. Ez a normalizált szöveg különösen alkalmas Text-to-Speech (TTS) rendszerek, például az F5-TTS bemeneteként, a szintetizált beszéd minőségének és természetességének javítása érdekében.
A szkript számos szövegnormalizálási feladatot hajt végre, beleértve a számok, dátumok, mozaikszavak és egyéb gyakori szöveges konvenciók kezelését, átalakítva azokat egy olyan formátumba, amelyet egy TTS motor könnyebben tud helyesen kiejteni magyarul.
A normaliser.py szkript a következő átalakításokat hajtja végre sorrendben:
- Római Számok Átalakítása (
replace_roman_numerals): Ponttal végződő római számokat (pl. "IV.") arab számokká alakít (pl. "4."). - Időformátumok Kezelése (
replace_times): Időpontokat (pl. "7:30-kor", "08:00", "22:15:30") beszélt magyar nyelvi alakra hoz. Véletlenszerűen választ az "óra perc perc" és "óra perc" formátumok között, ha nincs másodperc. Másodpercek esetén az "óra perc másodperc" formátumot használja. A "-kor" ragokat kezeli. - Kényszerített Cserék Alkalmazása (
apply_force_changes): Közvetlen rész-sztring cseréket hajt végre aforce_changes.csvfájl alapján. Ez lehetővé teszi a sztring-átalakítások finomhangolását, beleértve a szóközök hozzáadását a kicserélt kifejezés előtt vagy után. - Általános Cserék Alkalmazása (
apply_changes): Teljes szavas, kis- és nagybetűket nem megkülönböztető cseréket hajt végre achanges.csvfájl alapján. - Mozaikszavak Kiejtése (
replace_acronyms): Betűnként ejti ki a mozaikszavakat (két vagy több nagybetűből álló szavak, pl. "NATO" -> "en á té ó"). A római számok kivételt képeznek ez alól. - Alfanumerikus Szavak Kezelése (
replace_alphanumeric): Betűket és számokat egyaránt tartalmazó szavakat (pl. "B2", "K-9") dolgoz fel. A betűket betűnként ejti, a számokat pedig szavakká alakítja (pl. "bé kettő", "ká kilenc"). - Dátumformázás (
replace_dates): Különböző magyar dátumformátumokat (pl. "2025. június 1.", "2025. 06. 01.", "2025.VI.1.", "2021-05-20") egységes beszélt alakra hoz (pl. "kétezer-huszonöt június elseje"). Kezeli a teljes hónapneveket, rövidített hónapneveket, számos hónapokat és római számos hónapokat. - Sorszámnevek Átalakítása (
replace_ordinals): Ponttal végződő sorszámneveket (pl. "4.") magyar szavas alakra alakít (pl. "negyedik"). Ez a lépés kihagyja az évszámokat és a mondat végén, írásjel előtt álló számokat. - Tőszámnevek Átalakítása (
replace_numbers): Önállóan álló tőszámneveket (pl. "1234") szavakká alakít (pl. "ezerkétszázharmincnégy"). - Nem Kívánt Karakterek Eltávolítása (
remove_unwanted_characters): Eltávolít egy előre definiált speciális karakterkészletet (pl.*,",(,)) úgy, hogy szóközökkel helyettesíti őket. - Specifikus Kötőjeles Szavak Kezelése: Kezeli az olyan specifikus kötőjeles mintákat, mint "egy-egy", átalakítva azokat "egy egy"-re.
- Kötőjelek Eltávolítása: Eltávolítja a megmaradt kötőjeleket az összekapcsolt részek egyesítésével.
- Többszörös Szóközök Eltávolítása (
remove_duplicate_spaces): Összevonja a többszörös szóközöket egyetlen szóközzé, és eltávolítja a szöveg elejéről/végéről a felesleges szóközöket. - Előtag Hozzáadása (
add_prefix): Hozzáadja a "... " előtagot a feldolgozott szöveg elejéhez. - Kisbetűssé Alakítás (
convert_to_lowercase): Az egész szöveget kisbetűssé alakítja.
A normalizálási folyamat testreszabható két CSV fájl segítségével: changes.csv és force_changes.csv. Ezeknek a fájloknak ugyanabban a könyvtárban kell lenniük, mint a normaliser.py.
Ez a fájl általános, teljes szavas cserékhez használatos. A CSV fájl minden sora két, vesszővel elválasztott értéket kell, hogy tartalmazzon:
- Kulcs: A lecserélendő szó vagy kifejezés. Az illesztés nem különbözteti meg a kis- és nagybetűket, és csak teljes szavakra vonatkozik.
- Érték: A sztring, amely lecseréli a kulcsot.
Példa changes.csv bejegyzésre:
AI,mesterséges intelligencia
GPU,grafikus processzor
like,lájkEbben a példában minden "AI" egész szavas előfordulás (kis- és nagybetűtől függetlenül) "mesterséges intelligencia"-ra lesz cserélve.
Ez a fájl specifikusabb és "erőteljesebb" rész-sztring cseréket tesz lehetővé. Képes szavak részeit lecserélni, és szabályozni tudja a kicserélt érték körüli szóközöket. A CSV fájl minden sora négy, vesszővel elválasztott értéket kell, hogy tartalmazzon:
- Kulcs: A pontosan lecserélendő sztring. Az illesztés megkülönbözteti a kis- és nagybetűket, és a szöveg bármely részén előfordulhat (azaz rész-sztring egyezés).
- Érték: A sztring, amely lecseréli a kulcsot.
- Szóközök Előtte: Egy egész szám, amely meghatározza, hogy hány szóköz kerüljön az
Értékelé a csere után. - Szóközök Utána: Egy egész szám, amely meghatározza, hogy hány szóköz kerüljön az
Értékután a csere után.
Példa force_changes.csv bejegyzésre:
ninjutsu,nindzsucu,0,0
chips,csipsz,0,0
% , százalék ,0,0Ebben a példában:
- A "ninjutsu" "nindzsucu"-ra lesz cserélve, hozzáadott szóközök nélkül.
- A "chips" "csipsz"-re lesz cserélve, hozzáadott szóközök nélkül.
- A "% " " százalék "-ra lesz cserélve (figyeljük meg a szóközöket magában az értékben, ha szükséges, vagy a két utolsó oszlop által szabályozva).
Megjegyzés: A force_changes.csv szabályai a legtöbb egyéb normalizálási lépés előtt kerülnek alkalmazásra, beleértve a changes.csv-t, a mozaikszavak kezelését és a számok átalakítását. Ez lehetővé teszi számukra, hogy megelőzzenek vagy előkészítsenek szövegrészeket a későbbi szabályok számára.
A normalizáló használatához importálja a normalize függvényt a normaliser.py szkriptből, és adja át neki a magyar szöveget.
Python Példa:
from normaliser import normalize
text_to_normalize = "A NATO IV. közgyűlése 2024. máj. 1-jén lesz 10:00-kor. Ez egy v2 API."
normalized_text = normalize(text_to_normalize)
print(f"Eredeti: {text_to_normalize}")
print(f"Normalizált: {normalized_text}")
# Várható kimenet (az időformázásban lévő véletlenszerű választások miatt kissé eltérhet):
# Eredeti: A NATO IV. közgyűlése 2024. máj. 1-jén lesz 10:00-kor. Ez egy v2 API.
# Normalizált: ... a en á té ó negyedik közgyűlése kétezerhuszonnégy május elsején lesz tíz órakor ez egy vé kettő á pé íGyőződjön meg róla, hogy a normaliser.py, changes.csv, és force_changes.csv fájlok ugyanabban a könyvtárban vannak, vagy módosítsa a fájlútvonalakat a changes.csv és force_changes.csv betöltéséhez a normaliser.py szkripten belül, ha máshol helyezkednek el. A szkript jelenleg úgy van beállítva, hogy ezeket a CSV fájlokat a saját könyvtárában keresse.
A repository tartalmaz egy tesztszkriptet, normalizer_test.py, amely különböző teszteseteket tartalmaz a normalizáló funkcionalitásának bemutatására és ellenőrzésére.
A tesztek futtatásához hajtsa végre a szkriptet a terminálból:
python normalizer_test.pyEz kiírja több mintaszöveg eredeti és normalizált változatát, lehetővé téve a különböző normalizálási szabályok viselkedésének vizsgálatát.
A szkript a következő Python csomagra támaszkodik:
- num2words: Számok (tő- és sorszámnevek) magyar szavas megfelelőjévé alakítására használatos.
Telepítheti pip segítségével:
pip install num2words