- 3D工具
- MikuMikuDance
- 绘画工具
- Flash
- 音乐工具
- Audacity
- 所属类型
- 調教
  

0
9
0
UID: 111156
权限: 40
属性: 宇宙人 发帖: 201
(1精)
积分: 540
章鱼: 3
大葱: 14
茄子: 2688
注册:2012/8/18
存在感:476
|
本帖最后由 Zleepwalking 于 2015/1/11 18:11 编辑
Octave是一个很好用的数值计算软件,Matlab的绝佳替代;Praat是一个很棒的语音分析软件。在语音科学实验中我们常需要提取语音特征,并进行数值处理,然而Praat本身(Praat脚本)的数值计算不太方便,若能将两者结合会带来许多便利。这个简短的例子介绍如何从Octave调用Praat,对音频文件进行分析,并将结果返回到Octave。
假设的应用场景:我们要打开特定的语音文件,分析Pulses(PointProcess),存到vector里。
基本思想是,用system()带上参数启动Praat,执行一段事先写好的Praat脚本,分析结果输出到stdout,被Octave以字符串形式读取,再把字符串转换成向量类型。
先写出一个从打开文件到转换成PointProcess的Praat脚本:
min_freq = 75
max_freq =600
sound =do("Read fromfile...", file_name$)
pp =do("ToPointProcess (periodic, cc)...", min_freq,max_freq)
其中file_name$是一个存放文件名的字符串变量。
Praat提供了non-gui的启动方式:
praat script.praat[arguments_to_script]
其中arguments_to_script是传递给脚本的参数,在脚本中加上form,Praat会按顺序把参数赋值到form中的变量里。于是上述Praat脚本改成:
form Audio File to PointProcess
sentence File_name
positive Min_freq 75
positive Max_freq 600
endform
sound =do("Readfrom file...", file_name$)
pp =do("ToPointProcess (periodic, cc)...", min_freq,max_freq)
注意form内的变量名首字母可以大写,尽管实际被声明的变量名还是小写开头的。
然后在Octave中用 system(sprintf("praat script.praat%s %f %f", filename, min_freq,max_freq))便可从Octave调用Praat,请注意filename应当是绝对路径,否则Praat无法读取文件。
接下来在脚本里用appendInfoLine把PointProcess的数据输出到stdout:
n = do("Get number of points")
for ifrom 1 ton
t = do("Get time fromindex...", i)
appendInfoLine: t
endfor
至此Praat脚本部分已经完成。使用如下Octave程序调用Praat并获得输出:
[status output] = system(sprintf("praatbuild_corpus/praat_psola.praat %s\
%f %f", filename, min_freqmax_freq));
严谨起见,应当检查status以确保Praat是否执行成功,这里省略。
output是一个1*n的字符向量,将它先转换成包含若干字符串的Cell Array:
praatcell = strsplit(output)';
然后逐个转换成数值:
praatmat = zeros(rows(praatcell) - 1,1);
for i= 1:rows(praatcell)- 1
praatmat(i) = str2num(praatcell{i, 1});
end
(似乎没有直接支持Cell Array操作的字符串转数值函数,若有更好的方法请告知我,谢谢。)
完工。
对于较多的输出,执行速度可能会受Praat解释器的牵制,故不宜在Praat脚本中出现大量循环。这种情况下建议将对象存为ShortText/Binary/CSV,然后由Octave读取。
另,不要用Parallel工具包的pararrayfun/parcellfun并行调用这段代码,经测试会卡死。若要并行化,可能的一个方法是在本地开多个Octave运行server.m,在本地组建cluster,然后连接到localhost,分配到不同的处理器核心。
|
|