Sripte-Shreiben in Praat Frank K ugler (September 2006) Die Grundlagen des Praat Sripting: 1. Kenntnis der Befehle in Praat { Mein erstes Sript { Der Sripteditor 2. History Funktion in Praat { Paste History { Syntax und Layout eines Sripts 3. Variablen beim Sripting { Numerishe und Stringvariablen { Denition von Variablen { vordenierte Variablen 4. Shleifen bzw. Sprunge im Sript { Shleifen { Sprunge 5. Nutzlihes 1 Kenntnis der Befehle in Praat Ein Praatsript fuhrt Kommandos in Praat aus, d.h. alle Befehle, die in Praat vorhanden sind, konnen in einem Sript verwendet werden. Dazu ist es notwendig zu wissen, welhe Befehle in welhen Fenstern vorhanden sind. Ein Praatsript ist nihts anderes als eine Auistung vershiedener Praat-Kommandos. Wihtige Befehle benden sih im Menu Query in den vershiedenen Fenstern. Aber auh andere Befehle konnen und sollten genutzt werden. Beispiel: Mein erstes Sript Nehmen wir an, dass ein ausgewahlter Sound { in unserem Beispiel 'verwahting' { zweimal abgespielt werden soll. Um das Ziel zu erreihen gibt es zwei Moglihkeiten: 1. Auswahlen des Sounds Ankliken der Auswahl Play Erneutes Ankliken der Auswahl Play 2. Ein Sript, das das doppelte Ankliken ubernimmt (Beispielsript 1) Dies ist nur ein simples Beispiel fur ein Sript, zeigt jedoh, dass man einzelne Befehle naheinander ablaufen lasst. Spater wenden wir uns noh komplexeren Problemen zu. Wie erstelle ih ein Sript? Im Men u der Praat Objets: Control/New sript Einf ugen der Befehle (z.B. Play -neue Zeile- Play) Um das Sript zu starten, muss im Sripteditor im Menu Run/Run angeklikt werden. 2 History Funktion in Praat Paste History Praat maht das Shreiben eines Sripts sehr einfah: Es bietet eine so genannte history -Funktion. Das Sript wird geshrieben, ohne dass man die einzelnen Befehle selber eintippt. Dazu muss man einmal die Shritte durhfuhren, die das Sript automatish erledigen soll. Das obige Beispiel Mein erstes Sript erhalt man so durh folgende Prozedur: 1. One ein Sriptfenster (Praat Objets: Control/New Sript) 2. Wahle die Funktion: Edit/Clear history 3. Wahle den Sound 'verwahting' aus 4. Klike links in der Menuleiste auf 'Play' 5. Klike erneut 'Play' 6. Wahle im Sriptfenster die Funktion: Edit/Paste history 7. Es ersheint derselbe Sriptinhalt wie eben von Hand eingegeben Syntax und Layout eines Sriptes Syntax: Alle Befehle, die Praat kennt (entweder in den Objets oder im Editor) k onnen verwendet werden. Die Befehle im Sript erhalten genau den Namen, den der jeweilige Befehl im Menu hat, z.B. 'Play'. Vorsiht: Gro- und Kleinshreibung beahten! Layout: Freizeihen/Tabstops werden vom Sript u berlesen Layout: Kommentare werden durh # ; oder ! markiert, z.B. # Hier beginnt das Playsript Play Play Layout: Ein Befehl pro Zeile und eine Zeile pro Befehl Es gibt die Moglihkeit lange Zeilen zu trennen, wobei die folgende Zeile mit drei Punkten beginnen muss (...hier geht die vorherige Befehlszeile weiter) 2 3 Variablen beim Sripting Variablen Das einzige, womit man sih beim Praat-Sripting anfreunden muss, sind Variablen und Shleifen / Sprunge (s. nahsten Abshnitt). Variablen benotigt man, weil man in der Regel eine Analyse immer wieder an vershiedenen Datensatzen durhfuhren will. Durh die history-Funktion erhalt man den Befehl mit den dazugehorigen \festen" Werten, die dann als Variable kodiert werden mussen. Zum Beispiel: selet Sound verwahting | vs. | selet Sound 'dateiName$' Numerishe und Stringvariablen Praat kennt grundsatzlih zwei Typen von Variablen: Numerishe Variablen und Stringvariablen. Erstere enthalten naturlihe Zahlen, letztere jede Art von Zeihen. Eine numerishe Variable wird deniert als ein Variablenname, z.B.: intervallstart = 0.02 intervallend = 0.04 Eine Stringvariable wird deniert als ein Variablenname plus Dollarzeihen, z.B.: intervalltext$ = "Beispiel text" Denition von Variablen Variablen konnen auf drei Arten mit Werten belegt bzw. deniert werden. Die erste M oglihkeit geshieht innerhalb des Sripts und ist oben beshrieben. Der Variablenname muss mit einem Wert gleihgesetzt werden: a = 0.02 fileName$ = "Test.wav" Die zweite Moglihkeit besteht darin, dass das Ergebnis eines Kommandos einer Variable zugewiesen wird. Z.B. will man in einem TextGrid wissen, wie viele Intervalle gelabelt wurden: b = Get number of intervals... 1 Die dritte Moglihkeit der Variablenbelegung besteht darin, dass man zu Beginn des Sripts Variablenwerte `von auen' eingibt mit Hilfe eines Formulars (s. 6.1 im Sripting Tutorial Arguments to the sript) : # Formularbeginn form Bitte Namen eingeben! word Name endform # Sriptbeginn selet 'name$' Play vordenierte Variablen In Praat gibt es einige vordenierte Variablen, z.B. tab$ (s. Abshnitt 5.1 im Sripting Tutorial) 3 4 Shleifen bzw. Spru nge im Sript Shleifen Zunahst zu den Shleifen (s. Praat Sripting Tutorial 5.4). Hier wird exemplarish die Shleife for ... to ... vorgestellt. Als Beispiel nehmen wir das TextGrid verwahting, in dem u.a. die Silbengrenzen gelabelt sind. Unsere Aufgabe besteht darin, jeweils den Beginn einer Silbe zu dokumentieren (um mit Hilfe dieses Zeitpunktes eine weitere Analyse zu betreiben, auf die wir hier in diesem Beispiel verzihten). Den Startpunkt eines Intervalls erhalt man mit dem Befehl Get starting point... Tier Interval aus dem Men u Query. Die Shleife funktioniert folgendermaen: Es wird eine Zahlvariable (X), eine Startvariable (Y) und eine Endvariable (Z) benotigt. for X from Y to Z Kommandos, die ausgefuhrt werden sollen endfor Die Werte der Variablen: Die Zahlvariable kann jede beliebige Variable sein (z.B. `i'). Die Startvariable sollte in diesem Beispiel das erste Intervall sein, also 1. Die Endvariable sollte in diesem Beispiel das letzte Intervall sein, also 13. Woher kommen die Werte f ur die Start- und Endvariable? Entweder durh Festlegung im Sript: for i from 3 to 10 (vom 3. bis zum 10. Intervall) oder eher exibel durh Abfrage der Anzahl der Intervalle eines TextGrids (Befehl: Get number of intervals... Tier ). noi = Get number of intervals... Tier for i from 1 to noi start = Get starting point... Tier Interval endfor Fehlt nur noh die Dokumentation der Startpunkte: z.B. mit Hilfe des Befehls printline. noi = Get number of intervals... Tier for i from 1 to noi start = Get starting point... Tier i printline Start = 'start' endfor Sprunge Sprunge im Sript (s. Sripting Tutorial 5.3) erhalt man durh If -Abfragen. In unserem Beispiel wollen wir die Startpunkte der Silben dokumentieren, aber nur die akzentuierten Silben, die im TextGrid zusatzlih mit einem * gekennzeihnet sind. Die Syntax, die einzuhalten ist, funktioniert folgendermaen: if Variable = Denition, z.B. * #Dies ist unsere akzentuierte Silbe - also messe den Anfang else #Dies ist eine andere Silbe - mahe nihts endif Um herauszunden, welhe Silbe mit einem * gekennzeihnet ist, m ussen wir den gelabelten Text vergleihen mit unserer Denition in der if -Abfrage. Befehl: Get label of interval... Tier Interval noi = Get number of intervals... Tier for i from 1 to noi label$ = Get label of interval... Tier i if label$ = "nsi*" start = Get starting point... Tier i printline Start = 'start' endif endfor 4 5 Nu tzlihes Der Befehl pause Der Befehl eho bzw printline Der Befehl Create strings as le list... Der Befehl fileappend Pfad Befehle in vershiedenen Fenstern Ein Sript als Befehl in ein Praat-Menu hinzufugen Hilfe Dieser Befehl ermogliht es, dass ein Skript angehalten wird. Vorteil beim Sripting: Man kann bei Fehlern im Skript Shritt fur Shritt (also Kommando fur Kommando) nahvollziehen, was das Sript mit welher Datei wann maht. Vorteil im Sriptablauf: Man kann z.B. bei der Messung von Silbenintervallen (s. oben) vor jeder Messung eine Pause einfugen, um im TextGrid die Silbengrenzen zu kontrollieren. Diese Befehle steuern die Ausgabe von Text und Variablen im Info Window. Mit dem Befehl eho lasst sih daruber hinaus auh im Zusammenhang mit pause jeder Variablenwert ausgeben (sinnvoll bei der Fehlersuhe). Mit diesem Befehl kann man den Inhalt eines Ordners in eine Liste einlesen, um z.B. alle Dateien dieses Ordners zu onen (s. openall.sript). Text Dieser Befehl ermogliht es, Informationen (=Analyseergebnisse) in Dateien zu shreiben - statt die Ergebnisse ins Info Window auszugeben. Befehle in den Objets vs. Befehle im Editor Eine Fehlerquelle beim Sripten ist die Verwendung von Befehlen eines jeweils anderen Fensters. Will man zum Beispiel niht den ganzen Sound abspielen, sondern nur ein Stukhen, so kann man im Editor den Befehl Selet/Selet 0.5 0.7 ausfuhren, wodurh die Zeit zwishen 0.5 und 0.7 Sekunden markiert wird. Will man nun den bereits bekannten Befehl 'Play' ausfuhren erhalt man eine Fehlermeldung 'Not available for urrent seletion'. Das heit, dass der Befehl aus den Praat Objets niht verfugbar ist im Editor. Fur das Sript gibt es den Befehl endeditor (Siehe im Sripting Tutorial, Kapitel 7, Sripting the editors). Jedes Sript kann in ein beliebiges Menu eingebaut werden mit dem Befehl im Sriptfenster: File/Add to menu. Es gibt 'xed' Menus; das sind z.B. New Read Write in den Objets. Und es gibt 'dynami' Menus; das gilt z.B. nur fur LongSounds. Nah dem Ausfuhren dieses Befehls ersheint im jeweiligen Menu ein neuer Befehl, der das Sript ausfuhrt. (Naturlih kann man ein Sript auh jedes Mal onen (File/Open sript...) und die 'Run'-Funktion betatigen.) Praat bietet eine sehr ausfuhrlihe und ubersihtlihe Anleitung zum Sripten: Help/Sripting Tutorial. Hinweis Es gibt mitlerweile eine groe Auswahl an Sripten, die aus dem Netz zu laden sind (s. http://www.praat.org). Ein letzter Hinweis: Jedes Sript enthalt am Anfang mindestens einen Fehler, aber durh Fehler lernt man :-) Ubungen 1. Ein Sound soll automatish mit einem dazugehorigen TextGrid mit vier 'tiers' im Editor geonet werden. Dazu soll ein neuer Befehl in den Objets unter dem Menupunkt Read eingefugt werden. Das zu erstellende TextGrid soll ein 'pointtier' und drei 'intervaltiers' enthalten mit den Namen 'Ton', 'Laut', 'Silbe' und 'Text'. 2. Messung von Silbendauern: Es liegt ein TextGrid vor, in dem alle Silben einer Phrase markiert sind. Die Dauer der Silben soll gemessen werden und das Ergebnis soll im Info Window angezeigt werden bzw. in eine Datei geshrieben werden. 3. In einem Ordner sind 100 Testsatze gespeihert, die zuvor aus einem LongSound herausgeshnitten und gelabelt wurden. Der Experimentleiter will sie naheinander uberprufen. Dazu kann man ein Sript shreiben, das sih der Funktion Create Strings as FileList und der Onen sowie Edit -Funktion bedient. 5