Praat是一款功能非常强大的语音处理分析软件,除了其本身自有的菜单功能之外,还提供了很好的脚本编程接口,使得有一定语言编程能力的人能够快速、自动化地对录音文件进行数据提取。
如果你具有一定的编程能力,此教程你可以不必要看。如果你英文水平不错,也可以不必要看,你可以直接看官网的教程(http://www.fon.hum.uva.nl/praat/manual/Scripting.html),毕竟我英文水平也不好,所以此教程是按照我个人的理解进行叙述,可能会有点乱,没有官网上的那么有条理。
如果你发现此教程中有错误的,还请指正。
如果你要编写脚本程序,最好是用英文原版,因为你可以清楚看到每一个脚本命令怎样去写。Praat大部分的脚本命令其实就是动态菜单或下拉菜单中的菜单项(请记住这句话)。当然,如果你英文不好,且你只是想运行脚本程序,你可以下载我个人汉化的Praat汉化版、中文版进行使用,其菜单的功能与英文无差别。
注:Praat的菜单栏一般我会用汉化版和原英文版两种方式写出。
首先,我们来看一下脚本编程前的准备。我们要进行编程,就得先打开编程窗口。在主窗口(我在此称之为Objects窗口,如图1所示)依次点击【开始】→【新建Praat脚本】(【Praat】→【New Praat script】),这时候我们就会打开一个脚本窗口(如图2所示),就一个空白的文本输入框,我们所有脚本都写在这里。当然,如果你有现成的脚本,你也可以从菜单中用打开命令进行打开,打开菜单路径在此不述。
我们除了在Objects窗口打开脚本窗口外,几乎其他的窗口你都可以打开脚本窗口,比如Sound窗口、Pitch窗口等等,打开顺序为【文件】→【新建脚本】(【File】→【New editor script】)。
注意:请确认你的脚本对应的操作窗口,在错误的窗口运行不对应的脚本将无法运行。(如提取10点基频的脚本应该在Sound窗口运行,如果你在主窗口或者Pitch窗口等其他窗口运行将会报错)
图1 Praat主窗口、Objects窗口
图2 Praat脚本窗口、Script窗口
好的,打开了这个窗口后,我们接下来要来写我们的第一个程序 “Hello World”。如果你不知道“Hello World”,那你就不是程序猿世界的人,几乎所有的程序员都是从编写“Hello World”开始的。
要编写“Hello World”,我们得先来知道Praat的输出语句:print。print为打印的意思,即在输出窗口中打印出我们想要的结果。那我们的第一个程序就很简单了:
print Hello World
把上面这句脚本复制到图2所示的脚本窗口中,然后依次点击【运行】→【运行】(【Run】→【Run】),结果就会在Info输出窗口中输出“Hello World”,如图3所示
图3 Hello World 示例程序
print是在当前行输出的,也就是说如果你写了两句print,那输出的结果会在一行中显示,如果我们要另起一行输出,那可以用 printline
print Hello World1 print Hello World2
脚本1
以上两句脚本的输出结果为:
Hello World1Hello World2
那我们来换一下:
printline Hello World1 printline Hello World2
脚本2
这时我们看到的输出结果会是下面这样:
Hello World1 Hello World2
是的,我们的脚本1输出的结果连起来了,而脚本2的输出结果分行显示了。
除了print以外,Praat还提供了另外的输出语句:writeInfoLine
writeInfoLine:"Hello World"
运行以上这句脚本,我们同样能在Info窗口输出“Hello World”,那我们再试试如下脚本:
writeInfoLine:"Hello World1" writeInfoLine:"Hello World2"
你可能猜这会输出“Hello World1”,再输出“Hello World2”,但是你错了,在结果中你只会看到一个“Hello World2”,那“Hello World1”去哪了?原来,writeInfoLine会在输出结果之前先把Info输出窗口中的所有信息清除掉,那我们又有另外一个输出命令:appendInfoLine
writeInfoLine:"Hello World1" appendInfoLine:"Hello World2"
如你所料,这次输出的结果是:
Hello World1 Hello World2
appendInfoLine不会清除原先输出窗口中的内容。对应writeInfoLine、appendInfoLine,还有不换行输出的writeInfo、appendInfo两个命令,读者可自行编写试验。
鉴于writeInfoLine能清除Info输出窗口中的内容,所以我们一般会写在整个脚本的第一次输出的地方,在脚本中接下的输出中千万不要再用writeInfoLine,否则一个脚本运行下来你就只能看到最后一条输出结果,之前的结果会被清除掉。
现在,我们现在来总结一下:print后面直接跟要输出的内容,writeInfo和appendInfo后面跟英文冒号,然后输出内容包裹在英文双引号中。注意程序编写是区分大小写的。这篇教程中用到的几个命令:print、printline、writeInfo、writeInfoLine、appendInfo、appendInfoLine。请注意区分这6个命令的异同。
好了,第一篇教程就写到这了。有点啰嗦,两千多字就写了三个小时,期待后续的教程吧。
原创作品,未经授权不可进行转载。
如您觉得本文对您有帮助,可以赞助博主一杯奶茶吗