106 lines
3.8 KiB
Python
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())
|