|
Previous sections of this tutorial have shown you how to run a Praat script from the Script window. However, you can also call a Praat script from the command line (text console) instead. Information that would normally show up in the Info window, then goes to stdout, and error messages go to stderr. You cannot use commands in your script that create windows, such as View & Edit. Before describing how to achieve this (from section 4 below on), we first describe how the normal Praat, with its usual Objects and Picture (and perhaps Info) window, can be started from the command line.
Before seeing how a Praat script can be called from the command line, you should first know that just calling Praat from the command line just starts up Praat with its usual GUI (Graphical User Interface), i.e. with its two windows. For instance, on Windows you can start the Command Prompt window (the “Console”), and type
"C:\Program Files\Praat.exe"
(including the quotes) if Praat.exe is indeed in the folder C:\Program Files
.
On the Mac, the executable is hidden inside the app
file, so you open a Terminal window and type something like
/Applications/Praat.app/Contents/MacOS/Praat
On Linux, you type into the Terminal something like
/usr/bin/praat
On Windows, you can open Praat with a sound file and a TextGrid file by typing
"C:\Program Files\Praat.exe" --open data\hello.wav data\hello.TextGrid
or
"C:\Program Files\Praat.exe" --open data/hello.wav data/hello.TextGrid
at least if your current folder (see the Console’s cd
and dir
commands) contains the folder data
and that folder contains those two files. Praat will start up, and shows the two files as a Sound and a TextGrid object in the list. If Praat was already running when you typed the command, the two files are added as objects to the existing list in Praat.
On the Mac, you do
/Applications/Praat.app/Contents/MacOS/Praat --open data/hello.wav data/hello.TextGrid
and on Linux
/usr/bin/praat --open data/hello.wav data/hello.TextGrid
Again, if Praat was already running when you typed the command, the two files are added as objects to the existing list in Praat.
Note that if you want to send messages or files to a running Praat, the best way (on all platforms) is to use praat --send
(see below) or sendpraat (see Scripting 8. Controlling Praat from another program).
To always start up a new instance of Praat, use --new-open
instead of --open
.
On Windows, when you type
"C:\Program Files\Praat.exe" --open "my script.praat"
Praat will start up, opening the script my script.praat
in a script window. If Praat was already running when you typed the command, the script window will appear within the already running instantiation of Praat.
On the Mac, you do
/Applications/Praat.app/Contents/MacOS/Praat --open "my script.praat"
and on Linux
/usr/bin/praat --open "my script.praat"
Note that on all three platforms, you have to supply quotes around the file name if that file name contains one or more spaces, as here between my
and script
or above between Program
and Files
. This is because the script languages of the Console or Terminal use spaces for separating commands and arguments.
Now we are ready to discuss how to run Praat without a GUI.
On Windows, when you type
"C:\Program Files\Praat.exe" --run "my script.praat"
Praat will execute the script my script.praat
without showing Praat's GUI, i.e. without showing its usual two windows. In fact, any output that would normally go to the Info window, will now go directly to the Console window in which you typed the command. If Praat was already running when you typed the command, its windows will not be affected. In fact, the GUI-instantiation of Praat and the Console-instantiation can run simultaneously without them noticing each other’s existence; moreover, multiple Console-instantiations of Praat can run simultaneously, each in their own Console.
On the Mac, you type
/Applications/Praat.app/Contents/MacOS/Praat --run "my script.praat"
and on Linux
/usr/bin/praat --run "my script.praat"
What happens on all platforms is that the Console or Terminal starts up Praat, then Praat executes the script, and then Praat closes itself.
Consider the following script:
form: "Test command line calls"
sentence: "First text", "I love you"
real: "Beep duration", "0.4"
sentence: "Second text", "Me too"
endform
writeInfoLine: "She: """, first_text$, """"
appendInfoLine: "He: """, second_text$, """"
synth1 = Create SpeechSynthesizer: "English (Great Britain)", "Female1"
Play text: first_text$
Create Sound as pure tone: "beep", 1, 0.0, beep_duration,
... 44100, 440, 0.2, 0.01, 0.01
Play
Remove
synth2 = Create SpeechSynthesizer: "English (America)", "Male1"
Play text: second_text$
When you run this script from within Praat, it writes two lines to the Info window and plays first a female voice speaking the first sentence, then a beep, and then a male voice speaking the second sentence. To make this happen from the Windows command line instead, you type
"C:\Program Files\Praat.exe" --run testCommandLineCalls.praat "I love you" 0.4 "Me too"
In the Mac terminal, you type
/Applications/Praat.app/Contents/MacOS/Praat --run testCommandLineCalls.praat "I love you" 0.4 "Me too"
and in the Linux terminal, you do
/usr/bin/praat --run testCommandLineCalls.praat "I love you" 0.4 "Me too"
Note that each argument that contains one or more spaces has to be put within quotes, on all three platforms. As with runScript, Praat will not present a form window, but simply run the script with the arguments given on the command line (see Scripting 6.1. Arguments to the script). What then happens on all three platforms is that a console instantiation of Praat writes the two lines to the Console window and plays the three sounds.
The path to the script file as well as to infile
, outfile
and folder
arguments will be taken relative to the current working directory of the terminal window. For instance, the following example from Scripting 6.1. Arguments to the script will run the script /Users/miep/research/usefulScripts/playFile.praat
, which will play the sound file /Users/miep/research/project19/sounds/sound3.wav
:
cd /Users/miep/research/project19
/usr/bin/praat --run ../usefulScripts/playFile.praat sounds/sound3.wav
You can send a script to a running Praat. Praat will then execute it:
"C:\Program Files\Praat.exe" --send testCommandLineCalls.praat "I love you" 0.4 "Me too"
/Applications/Praat.app/Contents/MacOS/Praat --send testCommandLineCalls.praat "I love you" 0.4 "Me too"
/usr/bin/praat --send testCommandLineCalls.praat "I love you" 0.4 "Me too"
This works the same way as --run
, except that --send
runs in Praat’s Graphical User Interface. If Praat is already running, then that instance of Praat will execute your script. If Praat is not running yet, then a new GUI instance of Praat will start up and execute your script. To always start up a new instance of Praat, use --new-send
instead of --send
.
See also sendpraat (see Scripting 8. Controlling Praat from another program).
You can run the above script from several programming languages, not just from a Console or Terminal. In Python, for instance, you can do it using the same syntax as you would use in the Console or Terminal:
import os
os.system ('"C:\\Program Files\\Praat.exe" --run testCommandLineCalls.praat "I love you" 0.4 "Me too"')
Note that you have to double the backslashes!
A disadvantage of the os.system
method is that you have to use quotes within quotes. A somewhat cleaner approach is:
import subprocess
subprocess.call(['C:\\Program Files\\Praat.exe', '--run', 'testCommandLineCalls.praat', 'I love you', '0.4', 'Me too'])
This way you specify the arguments directly, with quotes only because they are all strings, but without having to worry about spaces. And perhaps even more importantly, this syntax makes it easy to use variables as arguments, as in:
first_line = 'I love you'
second_line = 'me too'
subprocess.call(['C:\\Program Files\\Praat.exe', '--run', 'testCommandLineCalls.praat', first_line, '0.4', second_line])
Many other programs beside Python have a system
-like command, so that you can run a command like
system ('"C:\\Program Files\\Praat.exe" --run testCommandLineCalls.praat "I love you" 0.4 "Me too"')
If you specify neither --open
nor --run
nor --send
, Praat's behaviour is not guaranteed. If you type something like
praat testCommandLineCalls.praat "I love you" 0.4 "Me too"
into a Console or Terminal window by hand, Praat will typically run the script. Also, the --run
option can probably be left out from the Python call above. However, if you redirect the output of Praat to a file or pipe, you cannot typically leave out the --run
option; if you do, Praat may start its GUI and open the file rather than run it.
“Why this strange behaviour?”, you may ask. The reason is that several platforms (e.g. Windows) use this same mechanismm when you double-click a file, or drop a file on an application icon. For instance, when you double-click hello.wav
or doSomething.praat
, or drop hello.wav
or doSomething.praat
on the Praat icon, you expect Praat to open that sound file or script, not to run it. However, when you double-click or drop doSomething.praat
, Windows will send Praat a message as if you had typed praat doSomething.praat
into a Console window. This means that in this case Praat will have to interpret praat doSomething.praat
as an indication that you want to open that file, not run it. Praat will try to be a bit smart, though: when receiving the message praat doSomething.praat
from the operating system, Praat will try to figure out whether you meant to run or open the file. If Praat detects that you typed praat doSomething.praat
into the Console by hand, Praat will run this script; if not, then Praat will open this script; this includes double-clicking and dropping (appropriately), but may also include some indirect invocations such as through a shell script or redirection or pipe. After all, if Praat is in doubt, wrongly assuming that you want to open the script is safer than wrongly assuming that you want to run the script.
On the Mac and Linux, you have the possibility of running the program interactively from the command line:
> /usr/bin/praat -
You can then type in any of the fixed and dynamic commands, and commands that handle object selection, such as selectObject. This method also works in pipes:
> echo "Report memory use" | /usr/bin/praat -
If you call Praat from a web server, you typically do not want to read and write its preferences and buttons files. To achieve this, you use the --no-pref-files
command line option before the script name:
system ('/users/apache/praat --run --no-pref-files /user/apache/scripts/computeAnalysis.praat 1234 blibla')
On Windows, you will often want to specify --utf8
as well, because otherwise Praat will write its output to BOM-less UTF-16 files, which many programs do not understand.
Switches:
Options:
/var/www/praat_plugins
/var/www/praat_plugins
(for instance). This can come in handy if you require access to preference files and/or plugins that are not in your home folder.
writeInfo
) in UTF-8 encoding. This is the default encoding on MacOS and Linux, but on Windows the default is the Console’s native UTF-16 Little Endian (i.e. the Console understands UTF-16 always, whereas it understands UTF-8 only if you type chcp 65001
first). If you pipe to Windows programs that understand UTF-8 rather than UTF-16, or if you want to redirect the output to a UTF-8 file, use this option.
writeInfo
) in ISO-Latin 1 ("ANSI") encoding. This is not recommended, because it potentially loses information (characters above U+00FF will show up as "?"), but it might be necessary if you want to use Praat in a pipe with programs that do understand ANSI but do not understand UTF-8 or UTF-16, or if you want to redirect the output to an ANSI-encoded file.
writeInfo
) in UTF-16 Little Endian encoding, without Byte Order Mark. This format is the default on Windows, but you can use it to write the output to a UTF-16LE-encoded file on any platform.
© ppgb 20220122