Hromadné zpracování celého adresáře

Pro posun na další strany použijte kurzorové šipky

Ⓒ Tomáš Bořil
borilt@gmail.com, 30. 3. 2015

Problémy

V praxi se setkáváme s velkým množstvím souborů v adresáři, které potřebujeme naráz zpracovat. Často vznikají rozřezáním např. dlouhých dialogů na jednotlivé nádechové úseky.

Výpis do Praat Info je pomalý

Čím více řádků vypisujeme, tím pomalejší je výpis dalších řádků. Zatímco zpracování jednoho rozsahu dat může trvat 2 minuty, zpracování desetinásobného rozsahu může trvat už dlouhé hodiny, není zde tedy přímá úměra.

Řešení: výsledky vypisovat do textového souboru a Praat Info nepoužívat. Úspora času je natolik rapidní, že se skutečně vyplatí skript modifikovat. Navíc se takový .txt soubor bude snadno importovat do jiných programů pro následné, např. statistické zpracování.

Problémy

Počet ručně načtených objektů v Praat Objects je omezený

Ruční načítání souborů může vést k lidskému omylu, počet objektů je navíc omezený.

Řešení: hromadné zpracování celého adresáře soubor po souboru. Z hlediska reprodukovatelnosti postupu je tento přístup výrazně výhodnější. Navíc skript zapneme a můžeme odejít, vše pracuje samo.

Výstup do textového souboru

Na začátku skriptu je dobré definovat si proměnnou s názvem výstupního souboru.

Místo printline používáme funkce writeFileLine pro vytvoření prvního řádku souboru a appendFileLine pro přidávání dalších řádků. Položky oddělujeme čárkami, text píšeme do uvozovek, proměnné bez apostrofů.

souborVystup$ = "d:\AKU\vysledky1.txt"

# writeFileLine buď vytvoří nový soubor, a nebo přemaže starý
# dobré pro tvorbu hlavičky tabulky
writeFileLine(souborVystup$, "osobaID", tab$, "Vokál", tab$, "F1", tab$, "F2")

for cyklus
    ...
    # přidání řádku např. s hodnotami proměnných či jakýmkoliv textem
    appendFileLine(souborVystup$, osobaID$, tab$, vokal$, tab$, f1, tab$, f2)
endfor

Zpracování všech souborů v adresáři

# vstupní adresář s textgridy a wavy ke zpracování (přípony .TextGrid a .wav)
# pozor na velikost písmen, musí být správně!
vstupniAdresar$ = "d:\AKU\data\"

# všechny TextGrid soubory v adresáři
seznamSouboru = Create Strings as file list... list 'vstupniAdresar$'*.TextGrid
pocetSouboru = Get number of strings

Takto získáme seznam všech souborů .TextGrid, následovat bude for cyklus zpracovávající každý soubor.

Zpracování všech souborů v adresáři

for indSoubor to pocetSouboru
    select seznamSouboru
    souborTG$ = Get string... indSoubor
    # odříznutí posledních 9 znaků, tedy přípony .TextGrid
    souborJmeno$ = left$(souborTG$, length(souborTG$) - 9)
    souborWav$ = souborJmeno$ + ".wav"
    printline Zpracovávám 'souborTG$' a 'souborWav$'
    textID = Read from file... 'vstupniAdresar$''souborTG$'
    zvukID = Read from file... 'vstupniAdresar$''souborWav$'
    ... klasické zpracování dvojice wav a textgrid, můžeme se přepínat mezi objekty ...
    select textID
    Remove
    select zvukID
    Remove
endfor
select seznamSouboru
Remove

Zpracování všech souborů v adresáři

Hypotetická situace: dejme tomu, že soubory jsou pojmenovány ve stylu H1a_3_HADA.TextGrid, kde poslední 4 znaky znamenají ID zaznamenané osoby.

Toto ID bychom chtěli z názvu souboru získat a uložit si do proměnné, kterou budeme později vypisovat s dalšími hodnotami.

Naopak prvních 5 znaků názvu souboru značí kód položky, který chceme také uložit do proměnné.

id$ = right$(souborJmeno$, 4)  ;souborJmeno je už bez přípony
kod$ = left$(souborJmeno$, 5)

Tímto způsobem můžeme efektivně vytvořit soubor .txt s velkou tabulkou dat, kterou následně zpracujeme ve vhodných programech.

Konec