11

我正在使用卡内基梅隆大学发音词典在 Python 中检测押韵,并且想知道:如何估计两个单词之间的音素相似度?换句话说,是否有一种算法可以识别“手”和“计划”比“手”和“薯条”更接近押韵的事实?

一些背景:起初,如果两个单词的主要重读音节和所有后续音节相同,我愿意说两个单词押韵(如果你想在 Python 中复制,则为 c06d ):

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"]

我可以看到手和计划听起来非常相似。我可以自己估计这种相似性,但我想我应该问:是否有复杂的算法可以将数学值与这种程度的声音(或听觉)相似性联系起来?也就是说,可以使用哪些算法或程序包来数学化两个单词之间的音素相似度?我意识到这是一个很大的问题,但如果其他人可以就这个问题提供任何建议,我将不胜感激。

4

2 回答 2

4

1) 通过 web API 或本地SAPI获取所有单词的所有 TTS 音频,

2) 尽可能提取语音特征( 1 , 2 ),或者至少得到语音数据的力量

3)取决于您拥有的功能,这里有一些方法。

如果你能得到语音数据的每个样本(帧)的功率 (Dim=1) ,那么一种简单的方法无疑是计算两组特征的相关性。

如果您有其他类型的特征,很可能会有更多维度,您可以将其视为图像并检查2d 卷积动态时间扭曲

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
于 2016-04-28T05:44:32.983 回答
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 dict,因此您仅限于对文本输入进行某种操作;但在我看来,可用的音素数量有限,因此您可以选择最重要的音素并为它们分配“音素权重”。您指出的 CMU 字典中只有 74 个:

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

(空行为 75 减一)

如果您在第 2 步中进行了更高级的操作,您可能会得到更好的结果:为特定的音素组合分配权重。然后,您可以修改一些 Levenshtein 类型的距离度量,例如在上面的库中,以提出对文本输入进行合理执行的“音素距离”度量。

第 3 步的工作量不大:利润。

于 2014-10-24T10:38:50.863 回答