2007-12-12

[Phonetics] Praat腳本:語調標記與繪圖

為了要幫葉老師的書畫一些語調圖,所以寫了一個Praat腳本來處理這些dirty work。這也是真正第一個自己寫的Praat腳本,值得慶賀一下(終於學會了 ^^y )。

腳本的功能說明:

  1. 標記語調
  2. 提取音高,手動修正野點(wild point),平滑
  3. 畫音波圖和語調曲拱
  4. 存檔(附檔名TextGrid、Pitch、wmf)

流程圖示
Praat腳本流程圖


######################################
# Annotate and draw intonation
#
# Author: Zhunbang Pbice Liao
# Praat Version: 4.6.34
# Last Update: 2007.10.23
######################################

form File Directory
  
comment Input file directory
  sentence directory c:\praat\
endform

# Create a string file that lists file names.

Create Strings as file list... list 'directory$'*.wav
numberOfFiles
= Get number of strings

# if !numberOfFiles
#
  Create Strings as file list... list'directory$'*.WAV
#
  numberOfFiles = Get number of strings
# endif

# Loop to read in files

for ifile to numberOfFiles
  
select Strings list
  
fileName$ = Get string... ifile
  
Read from file... 'directory$''fileName$'
  
name$ = fileName$ -".wav" -".WAV"

# Skip labeling if TextGrid files already exist

  if fileReadable (directory$+name$+".TextGrid")
    Read from file... 'directory$''name$'.TextGrid
  
else
# Do labeling
    select Sound 'name$'
    
To TextGrid... Romanization
    plus Sound 'name$'
    Edit
    pause Annotate the sound then click "continue"
    endeditor
  endif

# Skip extract pitch contour if Pitch file exit

  if fileReadable (directory$+name$+".Pitch")
    Read from file... 'directory$''name$'.Pitch
  else   

# Extract pitch contour

    select Sound 'name$'
    To Pitch... 0 50 300
    select Pitch 'name$'
    Edit
    select Sound 'name$'
    plus TextGrid 'name$'

# Edit

    pause Fix pitch points then click "continue"
    endeditor
    endeditor
    select Pitch 'name$'
    Smooth... 5
   endif

  

# Draw waveform

  Erase all
  Black
  14
  Helvetica
  select Sound 'name$'
  Select outer viewport... 0 7.5 0 1.5
  
Line width... 1
  Draw... 0 0 0 0 no Curve

# Draw intonation contour

  select Pitch 'name$'
  
plus TextGrid 'name$'
    
Line width... 3
  
Select outer viewport... 0 7.5 0.5 5.5
  Draw separately... 0 0 0 300 yes yes yes

  Line width... 3
  
Draw separately... 0 0 0 300 no no no
    
Line width... 3.5
  Select outer viewport... 0 7.5 0 5.5
  Axes... 0 7.5 0 5.5
  Draw rectangle... 0 7.5 0 5.5

  

# Save File

  Write to Windows metafile... 'directory$''name$'.wmf
  if not fileReadable (directory$+name$+".TextGrid")
    select TextGrid 'name$'
    Write to text file... 'directory$''name$'.TextGrid
  endif
  if not fileReadable (directory$+name$+".Pitch")
    select Pitch 'name$'
    Write to text file... 'directory$''name$'.Pitch
  endif

# Remove

  select Sound 'name$'
  plus TextGrid 'name$'
  plus Pitch 'name$'
  Remove
  
select Pitch 'name$'
  Remove  

endfor

select all

Remove

# End of script

11 則留言:

Emmanuel 提到...

原來SCRIPT的中文叫做腳本唷?

準棒 提到...

Script在簡體中文叫做「腳本」;繁體中文似乎叫做「指令稿」。不過我嫌它容易和「命令」(command)等名稱搞混,所以就沿用簡體中文的名稱.... :p

Emmanuel 提到...

原來是大陸的呀!

我每次看到大陸的翻法就很冏,譬如「幫助」、「菜單」......
(p.s. 純粹習慣問題)

準棒 提到...

看久了也就習慣了,我現在就是這樣... :p

匿名 提到...

不錯不錯,終於看到你學程式的結果了 ^^

匿名 提到...

你好,想請教你一個語音問題。

我發現/nt/音若然前後都是vowel,或於 syllable coda時,/t/音會被省去,即語音學中的elision。
例如:"internet"會讀成類似'inernet', "winter"會讀成'winner'等等…(除非很小心很清楚地讀)

問題就是,為何/nt/後的/t/會被省去?是否因為他們是同一個place of articulation?若是這個原理,為何/mp/中的/p/沒有這個現象?

準棒 提到...

Hi, BL,
我雖然讀過一點點phonetics,不過我得很慚愧地說,我不懂phonology。所以你說的elision,我也不知道該怎麼解釋.....照你的描述來看,或許是bilabial跟dental的區別?

匿名 提到...

子音節nt這幾個例子感覺是謬誤
win-ter的t是onset所以並不會被省略
in-ter-net的例子也一樣
nt的t在coda position容易被忽略
是因為percetually weak
可以參考D. Steriade 2001的paper
Directional asymmetries in place assimilation: a perceptual account.
另ㄧ個子音節mp也是一樣
如果硬要說mp比較salient
也可能是因為p比t可能要salient
至於是perceptually還是其他原因
我個人是覺得articulatory的解釋
比較合理
labial的articulation過程中
constriction比較narrow
而alveolar or dental
在phonology中常被unspecified
所以相較其他stop也就更容易被
assimilated or deleted

Unknown 提到...

您好:
您的部落格上有很多很棒的訊息,對於您的用心我非常感佩。
 我目前也是研究生,論文的主題也是關於外籍生的聲調習得,因搜尋praat的相關訊息時便連結到您的部落格上,對於praat我還是個零起點的學習者,在使用上常出現一些不知所以然的現象,只能初步地看到聲調的調型,但對於圖象的判讀,還有很大困難,不知可否向您請教以下幾個問題呢?
1.在設定聲調的Hz時,軟體預設所的Pitch Floor是75Hz,Pitch Ceiling是600Hz,對於華語聲調需要再重新設定嗎?
2.在分析語音檔的聲調時.我想讓軟體跑出該語音檔的聲音,所出現的聲音卻只有聲調的高低,顯現並非原聲,這是為什麼呢?是不是在設定出現了什麼問題呢?
3.分析華語聲調,我需要寫script嗎?您的建議為何?

  很冒昧的問了幾個問題,請您見諒,謝謝!

準棒 提到...

Hi, Rosie,

請不要這麼客氣,很高興有機會跟同行互相切磋。

Q1. Pitch range的設定,主要還是看發音人的音高。根據Praat官網的說明,男子的聲音可設定為75~300 Hz,女子的聲音可設定100~500 Hz,如果是嘎裂音(creaky voice),則有可能低於75 Hz。至於實際應該設定多少,你不妨先分析幾個聲音,看看發音人的音高範圍大致如何。

Q2. 抱歉我看不懂你的問題。可否再說的詳細一點?

Q3. 寫script只是節省時間,這些分析也可以用手工完成,只是很費時間罷了。如果你分析的聲音只有幾十個,就不需要特別寫script,但如果上百個、甚至上千個,自然還是script比較省力。Praat Script也不會很難,和其他script language(比如PHP、Perl)多有相似之處。

By the way, Praat的官網的Help是很好的學習資源,不妨參考。

這是我的email: pbice@seed.net.tw

Unknown 提到...

您好,我目前就讀於師大華研所,非常佩服您寫出了這個腳本!!
我在執行上遇到了一些問題,不知能不能請教您?