2014-10-20 115 views
8

我正在使用卡內基梅隆大學發音字典檢測Python中的韻,並且想知道:我如何估計兩個詞之間的音素相似度?換句話說,是否有一種算法能夠識別「手」和「計劃」比「手」和「薯條」更接近押韻的事實?估計兩個詞之間的音素相似性

一些方面:首先,我願意說,兩個詞押韻,如果他們的主要重讀音節和所有後續音節是相同的(c06d,如果你想在Python中複製):

def create_cmu_sound_dict(): 

    final_sound_dict = {} 

    with open('resources/c06d/c06d') as cmu_dict: 
     cmu_dict = cmu_dict.read().split("\n") 
     for i in cmu_dict: 
      i_s = i.split() 
      if len(i_s) > 1: 
       word = i_s[0] 
       syllables = i_s[1:] 

       final_sound = "" 
       final_sound_switch = 0 

       for j in syllables: 
        if "1" in j: 
         final_sound_switch = 1 
         final_sound += j 
        elif final_sound_switch == 1: 
         final_sound += j 

      final_sound_dict[word.lower()] = final_sound 

    return final_sound_dict 

如果我然後運行

print cmu_final_sound_dict["hands"] 
print cmu_final_sound_dict["plans"] 

我可以看到,手和計劃聽起來非常類似。我可以自己估計這種相似性,但我想我應該問:是否有複雜的算法可以將數學值與這種聲音(或聽覺)相似度結合起來?也就是說,用什麼算法或軟件包來數字化兩個詞之間的音素相似度?我意識到這是一個很大的問題,但我會非常感謝其他人就此問題提供的任何建議。

+0

爲什麼選擇down-vote和move to close?我能做些什麼來改善這個問題? – duhaime 2014-10-20 21:04:11

+2

你在找什麼像Soundex算法(http://en.wikipedia.org/wiki/Soundex)? – acfrancis 2014-10-20 21:08:30

+0

我不能說downvoter,但給出近距離投票的理由是,你的問題看起來像[要求推薦](http://meta.stackoverflow.com/questions/254393/what-exactly-is -a-推薦個問題)。你可能想要更清楚地問一下「*我該怎麼做X?*」而不是「*我應該用哪個工具來做X?*」 – 2014-10-20 21:09:27

回答

3

作弊。

#!/usr/bin/env python 

from Levenshtein import * 

if __name__ == '__main__': 
    s1 = ['HH AE1 N D Z', 'P L AE1 N Z'] 
    s2 = ['HH AE1 N D Z', 'F R AY1 Z'] 
    s1nospaces = map(lambda x: x.replace(' ', ''), s1) 
    s2nospaces = map(lambda x: x.replace(' ', ''), s2) 
    for seq in [s1, s2, s1nospaces, s2nospaces]: 
     print seq, distance(*seq) 

輸出:

['HH AE1 N D Z', 'P L AE1 N Z'] 5 
['HH AE1 N D Z', 'F R AY1 Z'] 8 
['HHAE1NDZ', 'PLAE1NZ'] 3 
['HHAE1NDZ', 'FRAY1Z'] 5 

庫:https://pypi.python.org/pypi/python-Levenshtein/0.11.2

嚴重,但是,因爲你只有文本作爲輸入和相當多的基於文本的CMU快譯通,你只限於一些對文本輸入的操縱;但我看到它的方式,只有有限數量的電話可用,所以你可以採取最重要的,並給他們分配「音位權重」。這裏只有74人在你指着CMU詞典:

% cat cmudict.06.txt | grep -v '#' | cut -f 2- -d ' ' | tr ' ' '\n' | sort | uniq | wc -l 
75 

(75減去一個空行)

你可能會得到更好的結果,如果你在步驟2中做未便更先進:爲特定的音素組合分配權重。然後你可以修改一些Levenshtein類型的距離度量,例如在上面的圖書館中,想出合理執行文本輸入的「音位距離」度量標準。

第3步沒有多少工作:利潤。

+0

這完全忽略了使「nd」傾向於同化爲「n」的音素特徵,而例如, 「nk」不會(或傾向於「ngk」,或者實際上經常被認爲是「ngk」)。 – tripleee 2016-04-28 05:50:48

0

1)獲得所有TTS通過Web API或本地SAPI所有單詞音頻,

2)提取語音特徵,如果你能(12),或至少獲得語音數據

的力量

3)取決於你有的功能,這裏有一些方法。

如果您可以獲得語音數據(Dim = 1)的每個樣本(幀)的強大功能,那麼一個簡單的方法無疑是計算兩組特徵的correlation

如果您有其他類型的特徵,其中最有可能將有更多的維度,你可以把它當作圖像,並檢查了2d convolutionDynamic time warping

4)如果您有關於語音處理的任務毫不知情1,2,3,退房pyphonetics

#pip install pyphonetics 
>>> from pyphonetics import RefinedSoundex 
>>> rs = RefinedSoundex() 
>>> rs.distance('Rupert', 'Robert') 
0 
>>> rs.distance('assign', 'assist', metric='hamming') 
2 
相關問題