2013年5月1日 星期三

修改 Praat 的共振峰擷取程式

這幾天電腦送修, 沒辦法幫學姊看她做 formant 分析所遇到的程式問題. 昨天抽空把她那高達 240M 的資料下載下來 RUN 看看, 結果發現 PITCH 跑到大概第 52 個受試者時就出現錯誤訊息,   指向 formant.htm 中的一道 SQL 指令, 但那已經執行 51 個受試者都沒問題呀. 查了微軟說明文件, 大概知道可能是語料太多了 (64 個人!), 超過 ACCESS 資料庫能耐. 但是找不到解決方案, 只好試著把資料拆兩半去跑, 果然順利通過天險. 但是跑到抓 formant 時又卡住了 (第 33 個受試者). 仔細看了程式碼, 發現原來當初只寫 32 個受試者, 學姊這 64 個 ... 難怪會跑不下去. 這也讓我發現當初寫說明書時漏掉這一個重要的部份, 那就是抓 formant 的三個 script 要依據實驗設計中的受試者性別來做客製化處理, 這三個抓 formant 的 praat script 不是一體適用的 (除非用 AutoIt 改寫時能夠加入自動設定功能). 所以即使是自己寫的程式, 太久沒用也是會忘掉當初為什麼要這樣寫的. 更改方式如下 :

有三個 praat 程式需要修改 :

1. fetch_formant_list.praat
2. fetch_formant_mean_max_min.praat
3. fetch_percent_formant.praat

打開這三個程式, 搜尋 "#產生 formant 物件" 可以看到一堆 if ... elsif 如下 :

  #產生 formant 物件 (女:1,4,5,6,8,10,13,15,21,24,25,26,28,29,30)
  if k$="01"
     To Formant (burg)... 0 5 5500 0.025 50
  elsif k$="02"
     To Formant (burg)... 0 5 5000 0.025 50
  elsif k$="03"
     To Formant (burg)... 0 5 5000 0.025 50
  elsif k$="04"
     To Formant (burg)... 0 5 5500 0.025 50
  .....
  endif

這部份用途是依據載入的 wav 檔發音者性別來設定 formant 分析的頻率參數, 第三參數為最高 formant 女生要設 5500 Hz, 男生 5000 Hz, 第四參數為分析窗寬度, 窄頻設 0.025 秒, 寬頻設 0.005 秒, 其餘不用改. 然後看 subject 有幾個, 就複製 if ... elsif 段落, 然後看是男是女, 設定其最高共陣峰頻率即可.

沒有留言 :