initial impl
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
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())
|
||||
Reference in New Issue
Block a user