Installation
Start
Object Window
Sound Editor
TextGrids
Info Window
Hilfe
Mehr zu Objekten
Skript-Editor
Skript-Syntax
PraatCon
Mehr zu Skripten
Praat ist portabel. D.h. nicht nur, daß die Installationsdatei auf eine Diskette paßt (tatsächlich!), sondern, daß man es auf so ziemlich jedem System benutzen kann. Dazu gehören natürlich Linux, Windows, MacOS, usw.
Auf der Seite www.praat.org kann man nicht nur die gewünschte Version kostenlos herunterladen, sondern auch den Quelltext.
Allerdings muß man unter Linux nicht unbedingt die Quellen selber kompilieren, sondern kann auf eine von zwei vorkompilierten Binärdateien zurückgreifen.
Sobald man das Programm startet, erscheinen (nach einem Splash-Screen mit Versionsnummer) zwei Fenster, das Object Window und das Picture Window. Letzterem werden wir uns später zuwenden, für den Augenblick kann man es getrost schließen (dies tut vermutlich der Großteil der Praat-Benutzer aus Reflex).
Das Object Window, zunächst noch leer und nichtssagend, ist das "Hauptfenster", durch dessen Schließen auch das Programm Praat beendet wird. Am oberen Rand finden sich ein Menü, das im einzelnen noch erläutert werden wird.
Der interessanteste Teil des Object Window sind die noch leeren Bereiche. Links die Objekt-Liste, rechts daneben das dynamische Menü. Um das zu veranschaulichen, erzeugen wir nun ein Objekt.
Der Befehl Read → Read from file... öffnet den betriebssystemüblichen Dialog zum Öffnen einer Datei. Damit laden wir nun die Sound-Datei wetter.wav.
Mit einem Mal kommt Leben ins Object Window. Die Objekt-Liste enthält nun das Sound-Objekt namens "wetter", das farbig unterlegt, d.h. ausgewählt ist. Das dynamische Menü erscheint rechts daneben und bietet uns eine Vielzahl von Befehlen, mit denen wir das ausgewählte Objekt analysieren, manipulieren oder konvertieren können.
Dies ist die Folge der Tatsache, daß nun ein Objekt ausgewählt ist. Zwei weitere Bereiche werden nun erreichbar: die objekt-unabhängigen Befehle unterhalb der Liste, und die Einträge des Menüs Write.
Mit dem Befehl Edit im dynamischen Menü öffnet sich ein weiteres Fenster, der Sound Editor. Dieser zeigt das Oszillogramm ("Waveform") des Sound-Objekts an, und darunter das Spektrogramm (das allerdings, je nach Einstellungen, erst ab einem bestimmten "Zoom-Faktor" angezeigt wird).
Mit dem Mauszeiger kann man einen horizontalen Rahmen im Oszillogramm ziehen, um eine zeitliche Markierung zu erzeugen. Möchte man nun nur den markierten Ausschnitt so groß wie möglich sehen, kann man mit einem Klick auf sel unten links den Befehl Zoom to selection ausführen, der bis zur gewählten Markierung die zeitliche Auflösung der Darstellung erhöht, also in den Sound "hineinzoomt". Mit den danebenliegenden Schaltflächen in und out kann man die zeitliche Auflösung weiter vergrößern bzw. verkleinern; mit all zeigt man den Sound in voller Länge an. Diese Befehle (sowie ihre Tastaturkürzel) stehen ebenfalls im Menü View zur Verfügung.
Die verschiedenen grauen Balken geben nicht nur Auskunft über die Dauer der angezeigten und markierten Bereiche, sondern lassen sie auch per Mausklick abspielen.
Die übrigen Details des Sound Editors werden später erläutert, und wir schließen den Sound Editor wieder.
Mit dem Befehl Annotate → To TextGrid... wird ein Dialog angezeigt, der nach den Namen der Tiers fragt; wir bestätigen zunächst einfach mit "OK".
Dadurch wurde ein neues Objekt im Object Window erzeugt, vom Typ TextGrid und mit dem gleichen Namen wie das Sound-Objekt, aus dem es erzeugt wurde. Dadurch, daß nun dieses neue Objekt markiert ist, hat sich auch das dynamische Menü verändert. Wir sehen also, daß sich die rechts angezeigten Befehle danach richten, was in der Objektliste ausgewählt ist.
Wenn wir nun mit der Maus sowohl den Sound als auch das TextGrid markieren (entweder durch Mausklicks mit gedrückter Umschalt- bzw. Steuerungstaste oder durch Ziehen), ändert sich abermals das dynamische Menü, und wir erhalten wieder den Befehl Edit, den wir ausführen.
Der jetzt dargestellte Editor zeigt nicht nur wie der Sound Editor Oszillogramm und Spektrogramm, sondern auch das dazugehörige TextGrid. Letzteres enthält noch keine Daten, daher besteht es nur aus drei leeren Ebenen übereinander, den Tiers, deren Namen am rechten Rand zu lesen sind.
Wenn man nun in den Sound-Bereich klickt, zieht sich die vertikale Linie durch alle Tiers hinunter, und es entsteht in jedem Tier ein kleiner Kreis. Wenn man dort hineinklickt, wird im entsprechenden Tier eine Grenze eingezogen. Je nachdem, ob man das in einem IntervalTier oder einem TextTier macht, entsteht eine Boundary oder ein Point. Langsam wird auch deutlich, was die Frage nach den "point tiers" sollte: Auf einem IntervalTier werden mit Boundaries Intervalle abgegrenzt, auf einem TextTier Punkte markiert.
Spätestens wenn man nun beginnt, etwas zu tippen, fällt der Textbereich am oberen Rand des Editors auf. Damit lassen sich Intervalle mit Labels etikettieren und Punkte mit Text versehen.
Man kann Boundaries und Points auch versetzen, indem man sie mit der Maus zieht.
Möchte man später ein Intervall verändern, klickt man einfach hinein. Es fällt auf, daß mit der Auswahl des Intervalls auch der entsprechende Bereich im Sound ausgewählt wird. Nun kann man den Text einfach durch die Tastatur ändern oder löschen. Auch das Intervall selbst (bzw. die Grenze zum vorigen) kann gelöscht werden, indem man den Befehl Boundary → Remove verwendet.
Das Info Window (nicht mit dem jederzeit erreichbaren Befehl Info zu verwechseln) erscheint erst auf Anfrage, bleibt dann jedoch sichtbar, bis man es wieder schließt. Darin zeigt Praat alle Ausgaben an, die irgendwelche Auskünfte über Objekte geben (einschließlich des Befehls Info!). Dazu gehören auch alle Query-Befehle.
Sollte man den Inhalt des Info-Fensters weiterverwenden wollen, kann man beliebig darin herumtippen, markieren, kopieren, usw. oder den gesamten Inhalt mit File → Save as... in eine Textdatei schreiben.
Bevor es etwas komplizierter wird, sei an dieser Stelle nachdrücklich darauf verwiesen, daß es zu fast allen Funktionen in Praat (mehr oder weniger) umfangreiche Hilfe gibt. Das "eingebaute" Manual ist ein einfaches, aber mächtiges Hypertext-Handbuch mit einer schnellen Suchfunktion, das jederzeit und über viele Help-Schaltflächen direkt aufgerufen werden kann, um näheres über die aktuellen Fenster zu erfahren.
Das komplette Manual befindet sich ebenfalls im Netz, unter der URL www.fon.hum.uva.nl/praat/manual.
Sollte man einmal das Manual (oder Teile daraus) drucken wollen, gibt es im Menü File die Befehle Print page... und Print Manual.... Ebenso kann man sich automatisch eine HTML-Version generieren lassen (die weitgehend identisch mit dem Online-Manual ist), mit den Befehlen Write page to HTML file... und Write manual to HTML directory.... Na so was!
Allerdings muß gewarnt werden, daß nicht alle Funktionen gut (oder überhaupt) im Manual dokumentiert sind. Da Praat ständig erweitert und verändert wird, werden manche Änderungen nicht in der Hilfe erfaßt, während andere ewige Baustellen sind. Wieder andere, selten genutzte Funktionen sind gar nicht zu finden, obwohl es dafür sogar einen Help-Button gibt, der dann ins Leere führt. Das ist allerdings ein geringer Preis für den enormen Funktionsumfang, den Praat für lau liefert und sollte eher zu etwas Experimentierfreude und/oder Beteiligung führen! =)
A propos: Sollte das Handbuch einmal nicht weiterhelfen, gibt es unter groups.yahoo.com/group/praat-users eine Mailingliste, in der jeder seine Fragen stellen darf. Wenn es nicht eine vollkommen überflüssige "Newbie"-Frage von jemandem ist, der sich offenbar gar nicht erst die Mühe gemacht hat, ins Manual zu schauen, dann wird es in der Regel innerhalb von wenigen Tagen eine Antwort geben. Oft antwortet sogar Paul Boersma (der Praat-Entwickler) selbst, wenn er gerade die Zeit findet.
Nach diesem Überblick über die am häufigsten genutzten Funktionen von Praat geht es nun mehr in die Tiefe.
Zu allererst ein Caveat: Praat-Objekte sind keine Dateien!
Die Objekte in der Objektliste existieren ausschließlich im Speicher, nicht auf der Festplatte. (Die einzige Ausnahme bildet die LongSound-Klasse.) Wenn also etwas in Praat erstellt wurde, etwa ein TextGrid, dann muß es mit einem Write-Befehl als Datei gespeichert werden, bevor Praat beendet wird, sonst ist es weg.
Ein Nebeneffekt dieser Funktionsweise ist, daß manche Operationen in Praat erheblichen Speicherbedarf erfordern können. Man sollte sich also ein paar Gedanken machen, bevor man z.B. eine 30 Minuten lange Sounddatei wie gewohnt einlesen läßt.
Praat arbeitet rein Objektorientiert. Das bedeutet: alles ist ein Objekt, und jedes Objekt gehört zu einer Klasse (Objekttyp). Als Klassen haben wir bisher Sound und TextGrid kennengelernt. Es gibt aber noch viele andere, die in diesem Kurs noch vorkommen werden, oder auch nicht. Eine (unvollständige) Übersicht gibt das Manual unter Types of objects.
Jedes Objekt in der Objektliste hat einen Namen. Dieser wird jeweils nach dem Objekttyp in der Liste angegeben. Der Objektname besteht nur aus Buchstaben (groß oder klein, keine Umlaute!), Ziffern, und den Sonderzeichen Bindestrich und Unterstrich. Wenn eine Datei gelesen wird, erscheint sie als entsprechendes Objekt in der Liste, mit dem Dateinamen als Namen, wobei alle unerlaubten Zeichen durch einen Unterstrich ersetzt werden.
Jedes Objekt kann durch die Befehle unterhalb der Objektliste umbenannt (Rename...), kopiert (Copy...) oder inspiziert (Info und Inspect) werden. Außerdem gibt es noch den äußerst nützlichen Befehl Remove, der alle markierten Objekte augenblicklich entfernt. Wenn sie gerade noch in einem weiteren Editor-Fenster o.ä. geöffnet waren, werden solche Fenster einfach geschlossen.
Es ist ohne weiteres möglich, mehrere Objekte gleichen Typs mit dem gleichen Namen in der Liste zu haben. Es handelt sich dabei jedoch nicht um dieselben Objekte! Diese verwirrende Frage entsteht intern auch gar nicht erst, denn jedes Objekt, egal ob es noch in der Liste steht oder bereits entfernt wurde, besitzt eine eindeutige ID. Die IDs werden als laufende Nummer von Programmstart an vergeben, angefangen bei 1. Dies wird weiter unten von entscheidender Bedeutung sein.
Objekte können entweder markiert sein oder nicht. Ist ein Objekt markiert, bietet das dynamische Menü alle Befehle, die für ein Objekt dieses Typs zur Verfügung stehen. Sind mehrere Objekte markiert, kommt es auf die Typen und die Anzahl an, welche Befehle angezeigt werden. Für die meisten Typkombinationen oder Objektanzahlen gibt es keine Befehle, und so bleibt das dynamische Menü leer, andererseits kommen manchmal "verborgene" Befehle zum Vorschein, wenn man bestimmte Objektkombinationen markiert.
Objekte werden mit der Maus markiert. Man kann durch Ziehen der Maus mehrere benachbarte Objekte zugleich markieren. Das geht auch, indem man auf das erste zu markierende Objekt klickt, und dann bei gedrückter Umschalttaste (oder Alt-Taste) auf das letzte zu markierende. Alle dazwischenliegenden Objekte werden dann mitmarkiert. Das Drücken der Steuerungstaste erlaubt, beliebige Objekte zu markieren oder zu "entmarkieren". Dabei können diskontinuierliche Markierungen entstehen. Ziehen kann man die Maus dabei auch. Am besten experimentiert man mit einer längeren Liste von Objekten mal herum, um ein Gefühl dafür zu bekommen.
An dieser Stelle seien noch ein paar Absonderlichkeiten erwähnt, die Praat ein wenig umständlich erscheinen lassen:
Ist einfach so. Damit muß man leben.
Zwar haben wir erst ein paar Funktionen von Praat kennengelernt, aber bevor wir weitermachen, lernen wir erst die Grundlagen der Praat-eigenen Skriptsprache kennen. Das erleichtert später vieles.
Skripte werden als Text geschrieben, und zwar im Script Editor. Den öffnet man mit Control → New Praat script. Alternativ lädt man ein Skript aus einer Datei mit Control → Open Praat script oder im Script Editor selbst mit File → Open.
Der Script Editor ist eigentlich nur ein primitiver Texteditor mit ein paar Sonderfunktionen. Dazu gehören die History, der Run-Bereich und die Menü-Anpassung.
Die Command History enthält eine Liste aller bislang in Praat verwendeter Befehle. Das ist fast immer mehr als man braucht, und so kann man sie mit Edit → Clear history auch löschen. Wenn man dann eine Reihe von Befehlen ausführt, etwa die, die man hinterher im Skript haben möchte, dann kann man sie anschließend mit Edit → Paste history im Script Editor einfügen. Das kann oft helfen, wenn man sich über die Syntax komplizierter Befehle im Unklaren ist.
Mit Run → Run wird das Skript ausgeführt. D.h. alle Befehle, von oben bis unten, werden der Reihe nach abgearbeitet, bis das Skript fertig ist oder ein Fehler zum Abbruch führt (zu Beginn häufiger). Alternativ kann man auch einen Teil des Skripts markieren und nur diesen mit Run → Run selection ausführen. Das kann hin und wieder nützlich sein.
Ein gespeichertes Skript kann als Befehl in das Menü des Objektfensters (oder eines Editor-Fenster) eingefügt werden. Das klingt zwar noch etwas komisch, kann bei häufig verwendeten Skripten aber ein Menge Aufwand ersparen. So ein Menüeintrag wird mit File → Add to fixed menu... angelegt. Man kann aber auch einen Eintrag in das dynamische Menü für einen beliebigen Objekttyp einfügen, indem man den Befehl Add to dynamic menu... verwendet. In beiden Fällen lassen sich die so angelegten Befehle mit Control → Preferences → Buttons... wieder entfernen. Wer's genau wissen will, diese Anpassungen werden in der Datei Buttons.ini gespeichert, die unter Linux im Home-Verzeichnis angelegt wird, unter Windows im Verzeichnis C:\Praat.
Praat-Skripte bestehen aus Praat-Befehlen und anderen Skript-Elementen. Befehle lassen sich an einem großen Anfangsbuchstaben erkennen und werden genau wie der jeweilige Befehl in den Praat-Fenstern geschrieben, komplett mit Leerzeichen, Groß-/Kleinschreibung usw. Wenn man auch nur einen Fehler macht, wird der Befehl nicht erkannt. Also Achtung!
Befehle, die mit ... enden, erwarten obligatorische Parameter. Wird die falsche Anzahl übergeben, gibt es Fehler. Die Parameter werden, durch Leerzeichen voneinander (und von den Punkten) getrennt, hinter den Befehl in die gleiche Zeile geschrieben. Sollte ein Parameter ein Leerzeichen enthalten, muß er in Anführungszeichen eingeschlossen werden, es sei denn, es ist der letzte Parameter. Man sollte im Zweifel (also grundsätzlich) im Dialog des Befehls nachschauen, was für Parameter er erwartet.
Es gibt kein Befehlsabschlußzeichen außer dem Zeilenumbruch selbst. Möchte man einen langen Befehl in der nächsten Zeile fortführen, beginnt man sie mit ....
Auswahllisten in Dialogen werden als Parameter übergeben, indem man den Text des gewünschten Listeneintrags ausschreibt. Checkboxes können entweder mit yes bzw. no oder durch 1 bzw. 0 übergeben werden.
Tabs oder Leerzeichen werden ignoriert, wenn sie am Zeilenanfang stehen, ansonsten sollte man sie vermeiden.
Ganze Zeilen werden mit #, ; oder ! auskommentiert. Man kann auch nur den Rest einer Zeile auskommentieren, dies sollte man jedoch nach Befehlen vermeiden.
Es gibt zwei Arten von Variablen: numerische und String-Variablen. Beide müssen mit einem Kleinbuchstaben beginnen; danach darf eine beliebige Folge von Klein- oder Großbuchstaben, Ziffern, oder Unterstrichen folgen. Stringvariablen müssen mit einem $ abgeschlossen werden.
# Wir erzeugen eine numerische Variable... sinn_des_Lebens = 42 # ...und eine String-Variable: hello$ = "Hello world!"
Variablen können an Praat-Befehle oder Ausgabe-Kommandos übergeben werden. Als Faustregel sollte gelten, wann immer der Inhalt einer Variable übergeben werden soll, muß sie in Hochkommata eingeschlossen werden. (Bei Befehlen, die als Parameter eine numerische Angabe erwarten und denen eine numerische Variable übergeben wird, dürfen die Hochkommata wegfallen, was man allerdings mit Bedacht tun sollte.)
# Ein markiertes Objekt wird umbenannt: Rename... Fuh # Und jetzt nochmal mit Umweg über String-Variable: neuer_Name$ = "Bahr" Rename... 'neuer_Name$'
Gleiches gilt für die Ausgabe ins Info-Fenster. Dazu stehen die Kommandos print, printline und echo zur Verfügung. Ebenso gibt es die vordefinierten String-Variablen newline$ und tab$. Da das Info-Fenster normalerweise noch die jeweils letzte Ausgabe enthält, kann man es mit clearinfo manuell löschen.
printline Dies ist eine Zeile mit Zeilenumbruch. print Dies nicht. print 'tab$'Aber jetzt:'newline$' echo Diese Ausgabe hat die vorige gelöscht! clearinfo printline Diese nur Dank des vorangegangen Befehls... # Und jetzt wird eine Variable deklariert und ausgegeben: hello$ = "Hello world!" printline 'hello$' # Man könnte stattdessen auch schreiben: hello$ = "Hello world!'newline$'" print 'hello$'
Für alle Befehle, die eine Ausgabe in das Info-Fenster erzeugen, kann man die Ausgabe auch stattdessen in Variablen des entsprechenden Typs umleiten. Das Info-Fenster bleibt dann unbenutzt.
# Für ein TextGrid kann man mit... Get number of tiers # ...die Anzahl der Tiers herausfinden. Sie wird aber einfach nur ausgegeben. # Sinnvoller ist: numberOfTiers = Get number of tiers # Dann kann man sie später immer noch ausgeben: echo 'numberOfTiers' # Das erste Intervall des ersten Tiers hat die Länge... firstInterval = Get end point... 1 1 # ...und das Label: firstLabel$ = Get label of interval... 1 1 # Das kann man auch zusammen ausgeben: printline Erstes Label:'tab''firstLabel$' ('firstInterval:3' Sekunden) # Da war auch gleich ein Trick zur Rundung auf drei Kommastellen versteckt!
Man kann Praat auch von der Kommandozeile bzw. in der Shell verwenden. Dabei kann man allerdings nur Skripte laufen lassen und muß auf sämtliche Interaktion oder graphische Ausgabe verzichten. Umfangreiche Analysen lassen sich so allerdings erheblich beschleunigen.
Befehle wie Edit stehen in dieser Verwendungsweise nicht zur Verfügung. Dafür muß man sich auch keine Gedanken um das Löschen des Info-Fensters machen; clearinfo hat keine Wirkung. printline und echo sind somit identisch und schreiben ihre Ausgabe nach STDOUT, also in die Konsole.
Unter Windows geht das leider nicht mit dem normalen Praat. Man benötigt stattdessen eine andere Version, das Kommandozeilenprogramm PraatCon. Es kann auf der Windows-Downloadseite der Praat-Homepage heruntergeladen werden. Nach dem Entpacken läßt es sich von der Kommandozeile aus mit Skripten füttern.
Innerhalb von Skripten kann man auch bedingte Anweisungen und Schleifen verwenden.
if bedingung$ = "wahr" echo Toll! elsif bedingung$ = "true" echo Great! else echo Schade... endif # Einige Schleifen... for counter from 1 to 5 printline 'counter' endfor # Dem entspricht counter = 1 while counter <= 5 printline 'counter' counter = counter + 1 endwhile # Ähnlich, aber nicht gleich: counter = 1 repeat printline 'counter' counter = counter + 1 until counter > 0 # Die Abbruchbedingung ist zwar zu Beginn wahr, der Repeat-Block wird aber # trotzdem mindestens einmal ausgeführt.
Will man abfragen, ob eine numerische Variable myBool den Wert "1" hat, genügt auch der Ausdruck if myBool.
elsif darf auch elif geschrieben werden. Statt endif ist auch fi zulässig.
In einer for-Schleife, deren Zähler beim Wert "1" beginnen soll, darf die Anweisung from 1 auch fehlen. Die Zählvariable wird in jedem Fall automatisch angelegt und bei jeder Interation um 1 vergrößert.
Anstelle von c = c + 1 darf auch die verkürzte Schreibweise c += 1 verwendet werden. Das aus manchen anderen Programmiersprachen (wie C++) bekannte c++ gibt es in Praat allerdings nicht.
Damit haben wir auch schon einen Operator (neben =) kennengelernt, das +. Damit lassen sich natürlich die Werte numerischer Variablen addieren. Ebenso können allerdings auch String-Variablen konkateniert werden. Ähnliches gilt für -.
donau$ = "Donau" dampf$ = "dampf" schiffahrt$ = "schiffahrt" donaudampfschiffahrt$ = donau$ + dampf$ + schiffahrt$ # Wert: "Donaudampfschiffahrt" donaudampfschiff$ = donaudampfschiffahrt$ - "ahrt" # Wert: "Donaudampfschiff"
Die verkürzte Notation += (und -=) funktioniert allerdings nicht bei Strings.
= is sowohl Zuweisungs- als auch Vergleichsoperator. Der Vergleichsoperator für "ungleich" schreibt sich <>.