[english][all](請注意:中文版本並未隨英文版本同步更新!)
若是以音符為單位來進行比對,我們就必須先將輸入向量切成音符。假設音高向量可以表示成 pv(i), i=1~n,那麼最簡單的切音符方法,可以說明如下:
for i=1:n
if |pv(i)-pv(i-1)|>q & 音符夠長
切出一個音符
else
將 pv(i) 加入目前的音符
end
end
以下就是一個簡單的範例,來切出音符:
上述方法是最簡單的方法,還有很多改進的空間,可能的改進的方向如下:
- 若遇到休止(音量很低之處),也要切出一個音符。
- 若遇到氣音,也要切出一個音符。
- 若歌唱者的音很準,可將每個音符的音高四捨五入到整數值。(或在上下平移後,找出一個平移量,讓每個音符在四捨五入後,和原音符的誤差總和為最小。)
- 可用 DP 的方式,來找出最佳的音符切割方式,使切出的音符和原來的音高向量有最小的誤差總和。
一旦切出音符後,就要進行比對,有幾種方式可以進行。
- 第一種切音符的比對方法,是只考慮音符的升降,而不考慮絕對數值及時間資訊。例如,如果切出的音符音高是 [69, 60, 58, 62, 62, 67, 69],那麼對應的比對格式是 [D, D, U, S, U, U],這些字母代表相鄰音符的關係,例如 D 是 Down,S 是 Same,U 是 Up。一旦將輸入音高向量轉成這種字串向量後,我們就可以使用「最長共同子字串」(longest common subsequence, LCS)或「編輯距離」(edit distance, ED)來進行比對。
- 第二種切音符的比對方法,則是指考慮音符的音高資訊,而不考慮音長資訊。例如,如果切出的音符音高是 [69, 60, 58, 62, 62, 67, 69],那麼我們可以直接使用類似 DTW 的方式來進行比對,只是在比對前還必須經過音高校正(key transposition)。
- 第三種切音符的比對方法,則是同時考慮音符的音高和音長資訊,此時我們還是可以使用類似 DTW 的方式來進行比對,只是要將音高和音長分別考慮來求取距離,同時也必須考慮音高校正和音長校正。
Audio Signal Processing and Recognition (音訊處理與辨識)