Průchod TextGridem - výpis labelů

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

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

Zadání

Předpokládejme následující soubor s nahrávkou slova milánek. K dispozici je TextGrid a úkolem je automaticky projít postupně všechny intervaly druhé vrstvy a vypsat jejich labely. priklad_data.zip (milanek.TextGrid)

Skript počítá s tím, že si uživatel sám ručně načte konkrétní TextGrid a před spuštěním skriptu ho označí v okně Praat Objects.

Jak na to?

  1. Vytvoříme nový skript.

  2. Vymažeme historii příkazů.

  3. Ručně provedeme příkaz pro zjištění počtu intervalů v určité vrstvě TextGridu.

  4. Ručně provedeme příkaz pro zjištění labelu určitého intervalu TextGridu.

  5. Historii vložíme do skriptu a doplníme další příkazy.

  6. Pomocí for cyklu projdeme postupně všechny intervaly – proměnná se bude postupně měnit od 1 do počtu intervalů s krokem 1.

  7. Uvnitř cyklu zjistíme pro každý konkrétní interval daný label a vypíšeme ho (místo konkrétního čísla intervalu použijeme proměnnou).

Zkuste skript vytvořit sami. Na následující straně je řešení.

Vložení historie příkazů

Get number of intervals: 2
Get label of interval: 2, 5

Zatím jsme zadali nějaká libovolná čísla, smyslem je zapamatovat si, u kterého parametru jsme zadali jaké číslo, díky tomu pak jednoduše v zápise příkazů podle těchto čísel „rozšifrujeme“, který parametr je který.

Skript upravíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo                                          <==

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2                 <==

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

pocet: 9

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet                            <==
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

int je 1, což je menší nebo rovno pocet, proto vstoupíme dovnitř cyklu

pocet: 9
int: 1

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int         <==
    printline 'label$'
endfor

první interval má prázdný label

pocet: 9
int: 1
label$: ""

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'                             <==
endfor

první interval má prázdný label

pocet: 9
int: 1
label$: ""

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor                                             <==

pocet: 9
int: 1
label$: ""

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet                            <==
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

pocet: 9
int: 1 2
label$: ""

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int         <==
    printline 'label$'
endfor

pocet: 9
int: 1 2
label$: "" "m"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'                             <==
endfor

pocet: 9
int: 1 2
label$: "" "m"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor                                             <==

pocet: 9
int: 1 2
label$: "" "m"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet                            <==
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

pocet: 9
int: 1 2 3
label$: "" "m"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int         <==
    printline 'label$'
endfor

pocet: 9
int: 1 2 3
label$: "" "m" "i"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'                             <==
endfor

pocet: 9
int: 1 2 3
label$: "" "m" "i"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor                                             <==

pocet: 9
int: 1 2 3
label$: "" "m" "i"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet                            <==
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4
label$: "" "m" "i"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int         <==
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4
label$: "" "m" "i" "l"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'                             <==
endfor

pocet: 9
int: 1 2 3 4
label$: "" "m" "i" "l"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor                                             <==

pocet: 9
int: 1 2 3 4
label$: "" "m" "i" "l"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet                            <==
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5
label$: "" "m" "i" "l"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int         <==
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5
label$: "" "m" "i" "l" "a:"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'                             <==
endfor

pocet: 9
int: 1 2 3 4 5
label$: "" "m" "i" "l" "a:"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor                                             <==

pocet: 9
int: 1 2 3 4 5
label$: "" "m" "i" "l" "a:"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet                            <==
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5 6
label$: "" "m" "i" "l" "a:"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int         <==
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5 6
label$: "" "m" "i" "l" "a:" "n"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'                             <==
endfor

pocet: 9
int: 1 2 3 4 5 6
label$: "" "m" "i" "l" "a:" "n"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor                                             <==

pocet: 9
int: 1 2 3 4 5 6
label$: "" "m" "i" "l" "a:" "n"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet                            <==
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5 6 7
label$: "" "m" "i" "l" "a:" "n"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int         <==
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5 6 7
label$: "" "m" "i" "l" "a:" "n" "e"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'                             <==
endfor

pocet: 9
int: 1 2 3 4 5 6 7
label$: "" "m" "i" "l" "a:" "n" "e"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor                                             <==

pocet: 9
int: 1 2 3 4 5 6 7
label$: "" "m" "i" "l" "a:" "n" "e"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet                            <==
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5 6 7 8
label$: "" "m" "i" "l" "a:" "n" "e"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int         <==
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5 6 7 8
label$: "" "m" "i" "l" "a:" "n" "e" "k"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'                             <==
endfor

pocet: 9
int: 1 2 3 4 5 6 7 8
label$: "" "m" "i" "l" "a:" "n" "e" "k"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor                                             <==

pocet: 9
int: 1 2 3 4 5 6 7 8
label$: "" "m" "i" "l" "a:" "n" "e" "k"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet                            <==
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5 6 7 8 9
label$: "" "m" "i" "l" "a:" "n" "e" "k"

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int         <==
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5 6 7 8 9
label$: "" "m" "i" "l" "a:" "n" "e" "k" ""

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'                             <==
endfor

pocet: 9
int: 1 2 3 4 5 6 7 8 9
label$: "" "m" "i" "l" "a:" "n" "e" "k" ""

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor                                             <==

pocet: 9
int: 1 2 3 4 5 6 7 8 9
label$: "" "m" "i" "l" "a:" "n" "e" "k" ""

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet                            <==
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

int je větší než pocet, proto skáčeme za konec cyklu, což je konec skriptu

pocet: 9
int: 1 2 3 4 5 6 7 8 9 10
label$: "" "m" "i" "l" "a:" "n" "e" "k" ""

A spustíme

# Vypíše labely intervalů ve 2. vrstvě TextGrid.
# Textgrid musí být před spuštěním skriptu vybrán
# v okně objektů.

clearinfo

pocet = Get number of intervals: 2

for int from 1 to pocet
    label$ = Get label of interval: 2, int
    printline 'label$'
endfor

pocet: 9
int: 1 2 3 4 5 6 7 8 9 10
label$: "" "m" "i" "l" "a:" "n" "e" "k" ""

Úkol A

Vypište labely a trvání jednotlivých intervalů 2. vrstvy TextGridu.

Tip: pro hezký tabulkový výpis můžete v printline použít předdefinovanou proměnnou 'tab$' obsahující tabulátor, tedy proměnlivý počet mezer tak, aby byl výpis hezky pod sebou zarovnán.

Varianta skriptu A)

Do skriptu zadejte napevno cestu k souboru. Předpokládá se minimální interakce uživatele. Skript si soubor sám načte, zobrazí výsledky do Praat Info a na závěr po sobě „uklidí“, tedy načtený soubor z Praat Objects zase odstraní.

Zkuste úlohu vyřešit samostatně. Na následující straně je řešení.

Očekávaný výstup

# Vypíše info o labelech 2. vrstvy TextGridu. Upravte cestu k souboru.
clearinfo

textID = Read from file: "D:\AKU\milanek.TextGrid"

pocetIntervalu = Get number of intervals: 2

for index from 1 to pocetIntervalu
    t1 = Get start point: 2, index
    t2 = Get end point: 2, index
    trvani = t2 - t1
    label$ = Get label of interval: 2, index

    printline ['label$']'tab$''trvani:3' s
endfor

# důležité: co jsme si ve skriptu otevřeli, to zase po sobě uklidíme
select textID
Remove

Úkol B

Varianta skriptu B)

Zkopírujte si soubor se skriptem z úkolu 1a do nového souboru a modifikujte ho tak, aby zpracovával textgrid, který si uživatel sám načetl.

Předpokládejte, že uživatel měl načtený i zvuk .wav a oba soubory před spuštěním skriptu označil.

Info: v tomto případě je slušné, aby se uživatelovy objekty v rámci skriptu neodstraňovaly. Jelikož měl označen i zvuk, který jsme vlasně vůbec nevyužili, bylo by hezké, kdyby po ukončení skriptu byly opět oba objekty označeny. Na následující straně je řešení.

# Vypíše info o labelech 2. vrstvy TextGridu. Před spuštěním načtěte a vyberte .wav a .TextGrid.
clearinfo
# Uložíme si odkaz na označené objekty
textID = selected("TextGrid")
zvukID = selected("Sound")
# Přepneme se na textID
select textID
pocetIntervalu = Get number of intervals: 2

for index from 1 to pocetIntervalu
    t1 = Get start point: 2, index
    t2 = Get end point: 2, index
    trvani = t2 - t1
    label$ = Get label of interval: 2, index

    printline ['label$']'tab$''trvani:3' s
endfor
# Na závěr označíme opět oba objekty
select textID
plus zvukID

Úkol B

Shrnutí

Z velké části zůstal skript shodný, novinkou bylo uložení odkazu na vybrané objekty a příkaz plus pro přidání dalších objektů k již označeným.

Konec