Files
Ypsilonkovo/generate_audio.py
T
2026-09-04 13:47:23 +02:00

106 lines
3.8 KiB
Python

import os
import asyncio
import edge_tts
# Zoznam všetkých unikátnych slov podľa aktualizovaného kánonu PSP
words = [
# B
"by", "aby", "byľ", "bystrý", "Bystrica", "Bytča", "byť", "nábytok", "bývať", "byt",
"bydlisko", "príbytok", "dobytok", "kobyla", "obyčaj", "býk", "bylina", "bydlo", "dobyť",
"odbyt", "byvol", "bytosť", "bývalý", "úbytok", "prebytok", "zbytočný",
# Votrelci B
"bič", "bicykel", "bitka", "biela",
# M
"my", "mykať sa", "mýliť sa", "myslieť", "myšlienka", "myseľ", "umývať sa", "mydlo",
"myš", "šmýkať sa", "hmyz", "žmýkať", "priemysel", "Myjava", "mýto", "mys", "zamykať",
"pomykov", "hmýriť sa", "šmyk", "priesmyk", "omyl", "zmysel", "pomyje",
# Votrelci M
"miska", "minúta", "milý", "minca",
# P
"pýcha", "pýšiť sa", "pyšný", "prepych", "pykať", "pýr", "pysk", "pytliak", "kopyto",
"pýtať sa", "opýtať sa", "pyžamo",
# Votrelci P
"pivo", "píšťalka", "pilot", "pieseň",
# R
"ryba", "rýchly", "rys", "ryť", "rýpať", "hrýzť", "kryť", "skryť", "koryto", "korytnačka",
"strýko", "ryža", "bryndza", "rýdzi", "rýľ", "ryčať", "ryha", "kryha", "poryv", "trýzniť",
# Votrelci R
"rieka", "ringloty", "rizoto", "ríbezľa",
# S
"syn", "syr", "sýty", "nasýtiť sa", "sypať", "sypký", "syseľ", "syčať", "sýkorka",
"sychravý", "osýpky", "vysychať", "sykať",
# Votrelci S
"sito", "sirup", "sivý", "silný",
# V
"vysoký", "zvyk", "vy", "vykať", "výr", "výskať", "vyť", "vy-", "vyžla", "vydra",
"vyhňa", "výsosť", "zvyšok", "výťah",
# Votrelci V
"vidly", "víla", "víťaz", "vietor",
# Z
"jazyk", "jazykový", "jazyčnica", "nazývať sa", "ozývať sa", "prezývať", "vyzývať", "pozývať",
# Votrelci Z
"zima", "zips", "zisk", "zrkadlo"
]
# Odstránenie duplicít so zachovaním poradia
unique_words = []
seen = set()
for w in words:
lower_w = w.strip().lower()
if lower_w not in seen:
seen.add(lower_w)
unique_words.append(w.strip())
output_dir = os.path.join("src", "Ypsilonkovo", "wwwroot", "audio", "words")
os.makedirs(output_dir, exist_ok=True)
VOICE = "sk-SK-ViktoriaNeural"
async def generate_word(word):
hex_name = word.lower().encode("utf-8").hex()
file_path = os.path.join(output_dir, f"{hex_name}.mp3")
# Špeciálna optimalizácia pre krátke slová ako "by"
# Ak pošleme text s bodkou, intonácia prirodzene spadne a znie ako krátke "by" a nie "bý"
spoken_text = word
rate = "-5%" # Jemne pomalšie a pokojnejšie pre deti
if word.lower() == "by":
spoken_text = "by."
rate = "+8%" # Krátke, úsečné a jasné 'by' namiesto dlhého 'bý'
elif word.lower() == "byť":
spoken_text = "byť."
rate = "+5%"
elif word.lower() == "vy-":
spoken_text = "predpona vy."
else:
spoken_text = f"{word}."
communicate = edge_tts.Communicate(spoken_text, VOICE, rate=rate)
await communicate.save(file_path)
print(f"Generated: {hex_name}.mp3")
async def generate_welcome():
welcome_path = os.path.join(output_dir, "welcome_female.mp3")
text = "Ahoj! Som víla Ypsilka, tvoja sprievodkyňa kráľovstvom Ypsilonkovo. Poďme sa spolu hravo naučiť vybrané slová!"
communicate = edge_tts.Communicate(text, VOICE, rate="-4%")
await communicate.save(welcome_path)
print("Generated: welcome_female.mp3 with Ypsilka")
async def main():
print(f"Generating {len(unique_words)} words with {VOICE}...")
for w in unique_words:
await generate_word(w)
await asyncio.sleep(0.05) # Jemný rozostup
await generate_welcome()
print("All audio files generated successfully!")
if __name__ == "__main__":
asyncio.run(main())