Search code examples
audiopraat

How to apply Praat script to an audio file?


I'm trying to change formants of the audio file with praat in Colab. I found the script that does that, it's code and the code for calculating formants. I installed praat:

!sudo apt-get update -y -qqq --fix-missing && apt-get install -y -qqq praat > /dev/null
!wget -qqq http://www.praatvocaltoolkit.com/downloads/plugin_VocalToolkit.zip
!unzip -qqq /content/plugin_VocalToolkit.zip > /dev/null

with open('/content/script.praat', 'w') as f:
  f.write(r"""writeInfoLine: preferencesDirectory$""")

!praat /content/script.praat
/root/.praat-dir

!mv /content/plugin_VocalToolkit/* /root/.praat-dir

!praat --version
Praat 6.0.37 (February 3 2018)

How can I apply this script to multiple wav files without UI, using linux command line or python?


Solution

  • The general answer

    You don't. You run a script, and it's entirely up to the script how it works, what objects it works on, where those objects are fetched, how they are fetched, etc.

    So you always have to look at how to apply a specific script, and that always entails figuring out how that script wants its input, and how to get to that point.

    The specific answer

    The page for the script you want says

    This command [does something on] each selected Sound

    so the first thing will be to open the files you want and select them.

    Let's assume you'll be working with a small enough number of sounds to open them all in one go. If you are working on a lot of sound files, or files that are too large to hold in memory, you'll have to batch the job into smaller chunks.

    One way to do this would be with a wrapper script that opened your files, selected them, and executed the other script you want:

    # Get a list of all your files
    files = Create Strings as file list: "list", "/some/path/*.wav"
    total_files = Get number of strings
    
    # Open each of them
    for i to total_files
        selectObject: files
        filename$ = Get string: i
        sounds[i] = Read from file: "/some/path/" + filename$    
    endfor
    
    # Clear the selection
    nocheck selectObject(undefined)
    
    # Add each sound to your selection
    for i to total_files
        plusObject: sounds[i]
    endfor
    
    # Run your script
    runScript: path_to_script$, ...
    # where the ... is the list of arguments your script expects
    
    # In your specific case, it would be something like
    runScript: preferencesDirectory$ + "/plugin_VocalToolkit/changeformants.praat",
        ... 500, 1500, 2500, 0,     0,    5500, "yes", "yes"
    #      ,-´  ,-´  ,--´ ,--´    ,-´       ^     ^      ^
    # New F1,  F2,  F3,  F4, and F5 means   |     |      |
    #                               Max formant   |      |
    #                       Process only voiced parts    |
    #                             Retrieve intensity contour
    
    # Do something with whatever the script gives you
    

    My Praat is pretty rusty, but this should at least give you an idea of what to do (disclaimer: I haven't run any of the above, but the concepts should be fine).

    With that "wrapper" script stored somewhere, you can then execute it from the command line:

    $ praat /path/to/wrapper.praat