用Praat自动提取基频(Pitch)数据(全自动)

分类:Praat
 标签:Praat,基频,Pitch,音频
   修改 | 阅读(5668)| 评论(4)


前不久,写了一个程序用Praat提取音强数据(按百分比),此程序是要进到音频的图形界面选中一段音频后才能提取相应的数据。当然,这样手工操作会取到你想要的音频数据,但是,对于大量的音频数据分析来说,这工作量是非常巨大的,所以我就在想有没有自动提取数据的办法?Praat是可以编程的,只要提供有足够的接口或方法,应该是没问题的,但是……这Praat是英文的,我的英文水平却是麻麻地,看不懂……但是对于Programer的我们来说,不要求全部看明白,只要认得其中的一两个单词,知道大概意思就OK了。经过不久的奋斗(虽然说是不久,但也废尽脑细胞啊……),程序终于出来了。看看下面:

#程序编写:何京宗   http://www.hejingzong.cn
#编写日期:2014-04-04
#程序功能:自动分段提取十点基频数据
#如有拷贝进行使用请保留版权声明,尊重作者劳动成果,谢谢。
form 请输入
 comment 当前音频长度:
 positive audioLength 6.0
endform
empty$=""
echo 'empty$'
Show all
Move cursor to... 0
Select later
Select earlier
#Select... 0 0.6
#Zoom to selection
beginTime=0.01
#Get begin of selection
pitch=Get pitch
n=0
perLength$=""
while beginTime+0.05<audioLength and n<30
 while pitch=undefined and beginTime<audioLength
  beginTime=beginTime+0.01
  Move cursor to... 'beginTime'
  #Select later
  #Select earlier
  pitch=Get pitch
 endwhile
 endTime=beginTime+0.01
 pitch=Get pitch
 while pitch!=undefined and endTime<audioLength
  endTime=endTime+0.01
  Move cursor to... 'endTime'
  #Select later
  #Select earlier
  pitch=Get pitch
 endwhile
 endTime=endTime-0.01
 if endTime>beginTime
  Select... 'beginTime' 'endTime'
  nn=n+1
  c=endTime-beginTime
  print 'nn':'beginTime:3' To 'endTime:3' Length:'c:3'
  perLength$=perLength$+fixed$('c'*1000,0)+" "
  print 'newline$'
  #Zoom to selection
  for i from 0 to 9
   currentTime=beginTime+((endTime-beginTime)/9)*i
   Move cursor to... 'currentTime'
   pitch = Get pitch
   print 'pitch:0'
   if i < 9
     printtab
   endif
  endfor
  print 'newline$'
  print 'newline$'
  beginTime=endTime+0.02
  Move cursor to... 'beginTime'
  pitch=Get pitch
 endif
 n=n+1
endwhile
print 'newline$'
print 各段的时长如下(单位:ms):
print 'newline$'
print 'perLength$'

此程序一出,哇塞,全部数据一点即出,太爽了。但是……但是现在提取的数据是精确到0.1秒的,运行起来没什么压力,如果要精确到0.001秒,也就是1毫秒,这程序运行起来就不爽了,6秒钟的音频要提取数据程序要运行150秒左右……虽然时间有点久,但是比起手动的来还是方便很多的。
(注:在Praat的频谱界面运行此程序默认只能精确到0.01)
需要精确到三位小数以上的请点击这里

特别说明:该脚本精确度有限,如需要更高精确度请下载使用最新的Praat汉化版VIP功能。


用法?用法跟前面那篇文章里说的差不多,只不过不用选择某一段音频而已

如您觉得本文对您有帮助,可以赞助博主一杯奶茶吗

    




如有问题点这里(如需寻求帮助请在邮件中作简短自我介绍)

 

【Moira】评论于:2018-9-20 11:56:51    [回复本评论]

大神!请收下我的膝盖~~~~

【沁】评论于:2016-2-22 11:42:55    [回复本评论]

求每50毫秒自动提取一个二合元音的F1、F2值,求加上详细步骤图解

你好,你找到求每50毫秒自动提取复合元音共振峰F1,F2的脚本了吗?有的话可以给我分享一下吗?谢谢

【Yultuz】于17-04-10 12:52回复
【沁】评论于:2016-2-22 11:42:32    [回复本评论]

求每50毫秒自动提取一个二合元音的F1、F2值,求加上详细步骤图解

您的昵称:*
QQ登录(无需注册直接登录可进行回复)
您的邮箱:(填写邮箱,如有回复可进行邮件通知)
验证码:
点击刷新