FrontPage

A Quick Look at Praat Scripting

  • This page is intended as a brief but somewhat "unorthodox" introduction to Praat scripting.
    • The primary target readers are ones who have some (partial) knowledge about programming/script language (e.g., C, perl, awk, python, VBA), and thus know, say, what array/if (conditional)/for (iteration, loop) mean. If you new to programming, see other sources*1.
    • The contents are fragmentary. For unknown commands, consult Help in Praat first. It provides you valuable information.

Table of Contents

Hello world

  1. Choose New Praat script from the Praat menu to open the ScriptEditor window.
  2. Type:
    echo Hello world
  3. Choose Run from the Run menu (or type C-r) to execute.

Language Specification Worth Mentioning

General

  • Output to the Info Window: echo, printline, and print
    • The three scripts below work in the same way (clearinfo clears the Info window):
      • echo Hello world
        clearinfo
        printline Hello world
        clearinfo
        print Hello world'newline$'
    • The two scripts below, however, do not work in the same way.
      • echo This is the first sentence.
        echo This is the second sentence.
        clearinfo
        printline This is the first sentence.
        printline This is the second sentence.
  • Comments
    • "#" and ";" are comment characters. Praat ignores the comment characters and after them, to the end of the line.
    • Use ";" instead of "#", if you want to write a comment after a statement in the same line.
      n = 0 
      if n = 0 ;conditional
          clearinfo
          printline Hello world
      endif
      # An error occurs if ";" is replaced with "#".
      • Some commands, however, cannot be followed by a comment in the same line. For example,
        n = 0 
        if n = 0 ;conditional
            clearinfo
            printline Hello world  ; This sentence is also displayed on the Info window.
        endif
  • Variable Types
    • numerics and strings
      • Variables (either numeric or string) must begin with lower cases.
      • String variables must end with $.
        str$ = "foo"
        num = 3
        ### statements below causes an error. ###
        #Str$ = "foo"  ; it begins with Upper case.
        #Num = 3
        #str = "foo"   ; it lacks $, though it has a string.
    • Arrays are also available.
      • The indices are enclosed with "[" and "]"
      • Like scalars, arrays must begin with lower cases.
      • Similarly, arrays which store strings must have $ before "["
        str$[1] = "foo"
        str$[2] = "bar"
        str$[3] = "hoge"
        str$[4] = "piyo"
        num[1] = 3
        num[2] = 34
        num[3] = 22
        num[4] = 98
        ### statements below causes an error. ###
        #str[1] = "foo"   ; it lacks $, though it has a string.
        #Num[4] = 98      ; it begins with Upper case.
    • Unfortunately, hashes (or associative arrays) are not available.
  • Variable Substitution
    • Variables are substituted when put between single quotes.
      fruit$ = "apple(s)"
      count = 3
      echo I bought 'count' 'fruit$'.
      • NOTE1: No double quotations are required to literals in print (and printline and echo). Compare
        fruit$ = "apple(s)"
        count = 3
        echo "I bought" 'count' 'fruit$' "."
      • NOTE2: If the index in an array is also a variable, a dummy variable is required.
        str$[1]= "apple"
        str$[2]= "orange"
        str$[3]= "melon"
        
        clearinfo
        for i from 1 to 3
            hop$ = str$[i]   ;; a dummy variable
            printline 'i''tab$''hop$'
        endfor
  • Operators
    • Comparison Operators
      • The "equal" operator is "="*2, identical with the assignment operator.
        num = 3
        str$ = "hoge"
        
        clearinfo
        if num = 3
            printline 'num'
        endif
        
        if str$ = "hoge"
            printline 'str$'
        endif
  • Strings
    • Basically, operators used for numerics are also applicable to strings.
    • Interestingly, not only string "addition" (i.e., concatenation), but also string "subtraction" (i.e., truncation) is possible, using "+" and "-".
      str1$ = "abc"
      str2$ = "def"
      str3$ = "c"
      
      str4$ = str1$ + str2$
      str5$ = str1$ - str3$
      
      clearinfo
      printline 'str4$'
      printline 'str5$'
    • result:
      abcdef
      ab
  • autoincrement/autodecrement operators (e.g., i++, i--) are not available.
  • Conditional statements
    • if(-elsif)(-else)-endif
      • NOTE: elsif (or elif), rather than elseif and else if.
  • Loops
    • for i (from m) to n-endfor, while-endwhile, repeat-until
      • from m in for can be omitted when m = 1.
      • It is not possible to decrement the loop counter in for-loop. Use while-endwhile, instead.
        n = 10
        clearinfo
        while n >= 1
            printline 'n'
            n = n-1
        endwhile
      • There seems to be no statement which escapes from the loop (break in C, or last in perl). Instead, you can substitute the loop counter (or something) with a value which does not satisfy the loop condition, for example.
        clearinfo
        max = 10
        for i to max
            if i = 5
                i = max+1      ; escape from the loop
            else
                printline 'i'
            endif
        endfor
  • goto is not available. (modified July 17, 2012)
    # the "goto" command in Praat scripts
    clearinfo
    for i to 10
        if i mod 2 = 0
            goto next
        endif
        printline 'i'
        label next
    endfor
  • Subroutines: procedure-endproc
  • Regular expressions are available in some string functions:
    • index_regex(str$,regex$)
    • rindex_regex(str$,regex$)
    • replace_regex$(str$,regex$,substr$,n)
      • NOTE: Functions which return strings (not numerics) require $.
        str$ = "abcdefg"
        regex$ = "b[^e]*"
        clearinfo
        if index_regex(str$,regex$) <> 0
            printline match
        else
            printline not match
        endif
  • Generally, index numbers start at 1 (not 0).
    • Check, for example, the value of the following string functions:
      • mid$(str$,index,len)
        str$ = "abcdefg"
        len = length(str$)
        clearinfo
        for i from 1 to len
            hop$ = mid$(str$,i,1)
            printline 'i''tab$''hop$'
        endfor
      • index(str$,substr$)
        str$ = "abcdefg"
        substr$ = "bcd"
        clearinfo
        n = index(str$,substr$)
        printline 'n'
  • File IO
    • text$ < filename (read the contents of filename)
      file$ = "d:\foo.txt"
      text$ < 'file$'
      clearinfo
      print 'text$'
    • text$ > filename (make a new file and write the contents of text$)
    • text$ >> filename (add the contents of text$ to filename)
      file$ = "d:\bar.txt"
      text$ = "praat scripting is fun." + "'newline$'"
      text$ > 'file$'
      #text$ >> 'file$'
    • NOTE: Consider the use of Object, rather than "<" or ">". Very often, Object manipulation is easier and more straightforward. For Object, see below.

Particular to Praat (1): Object Manipulation

Those who conquer object manipulation techniques conquer Praat scripting. (The present author)

Particular to Praat (2): form-endform

  • form and endform

Functions of ScriptEditor

  • History
  • Run a script

Other ways to execute a script


*1 Highly recommended: Ingmar Steiner (2006-2007) Automatic Speech Data Processing with Praat. Lecture Notes. (PDF file is available at: http://www.coli.uni-saarland.de/~steiner/praat/lecturenotes.pdf .)
*2 In fact, "==" can also be used as an equal operator.

Front page   Edit Unfreeze Diff Backup Upload Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2012-07-17 (Tue) 19:07:12 (1924d)