11

python中是否有可以将单词(主要是名称)转换为Arpabet音标的库?

倒钩 -> B AA1 RB AH0 LZ

烧烤 -> B AA1 RB IH0 KY UW2

烧烤 -> B AA1 RB IH0 KY UW2 D

烧烤 -> B AA1 RB IH0 KY UW2 IH0 NG

烧烤 -> B AA1 RB IH0 KY UW2 Z

4

4 回答 4

16

您想要的是各种称为“字母到声音”或“字素到音素”的引擎。周围有一些,包括每个文本到语音系统中的一个。

我通常处理非美国口音,为此我使用espeak。它不会直接输出 arpabet(无论如何它仅限于美国声音),但您可以哄它尝试美国口音,然后从 IPA 转换为 arpabet。

>>> from subprocess import check_output
>>> print check_output(["espeak", "-q", "--ipa",
                        '-v', 'en-us',
                        'hello  world']).decode('utf-8')
həlˈoʊ wˈɜːld

您可以使用-x而不是--ipaespeak 自己的电话表示(它是 ascii):

>>> check_output(["espeak", "-q", "-x", '-v', 'en-us', 'hello world'])
h@l'oU w'3:ld

不过,转换为 arpabet 并不像查找字符那么简单。例如,“tʃ”应该转换为“CH”,而不是贪婪转换会给你的“T SH”(除了,在奇怪的情况下,比如“swɛtʃɑːp”代表“sweatshop”)。

于 2013-01-21T02:31:45.690 回答
14

在安装了语料库的情况下使用nltkcmudict

arpabet = nltk.corpus.cmudict.dict()
for word in ('barbels', 'barbeque', 'barbequed', 'barbequeing', 'barbeques'):
    print(arpabet[word])

产量

[['B', 'AA1', 'R', 'B', 'AH0', 'L', 'Z']]
[['B', 'AA1', 'R', 'B', 'IH0', 'K', 'Y', 'UW2']]
[['B', 'AA1', 'R', 'B', 'IH0', 'K', 'Y', 'UW2', 'D']]
[['B', 'AA1', 'R', 'B', 'IH0', 'K', 'Y', 'UW2', 'IH0', 'NG']]
[['B', 'AA1', 'R', 'B', 'IH0', 'K', 'Y', 'UW2', 'Z']]

cmudict要在 python 解释器类型中安装语料库:

>>> import nltk
>>> nltk.download()
Use GUI to install 
corpora>cmudict
于 2012-08-11T01:19:58.687 回答
8

您可以使用我的侦听器项目中的一个小实用程序来执行此操作。它在幕后使用 espeak(生成 IPA),然后使用从 CMU 字典中提取的映射来生成可以匹配生成的 IPA 的 ARPABet 映射集,例如:

$ listener-arpa 
we are testing
we
        W IY
are
        ER
        AA
testing
        T EH S T IH NG

大约 45% 的时间在 CMU 字典上产生完全匹配(我使用 CMU/Wikipedia 中记录的对应关系得到了大约 36%),同时每个单词产生约 3 个匹配项(平均)。也就是说,我们在大约 99% 的情况下看到“紧密匹配”,也就是说,虽然我们可能不会每次都精确匹配手工标记的单词,但我们通常只相差几个音素。

$ sudo apt-get install espeak
$ pip install -e git+https://github.com/mcfletch/listener.git#egg=listener
于 2014-07-28T14:10:12.453 回答
5

获取cmu 发音词典,然后您可以使用nltk从该词典本身获取任何单词的相关
arpabet 音标,如下所示

>>> entries = nltk.corpus.cmudict.entries()
>>> len(entries)
127012
>>> for entry in entries[39943:39951]:
...     print entry
...
('fir', ['F', 'ER1'])
('fire', ['F', 'AY1', 'ER0'])
('fire', ['F', 'AY1', 'R'])
('firearm', ['F', 'AY1', 'ER0', 'AA2', 'R', 'M'])
('firearm', ['F', 'AY1', 'R', 'AA2', 'R', 'M'])
('firearms', ['F', 'AY1', 'ER0', 'AA2', 'R', 'M', 'Z'])
('firearms', ['F', 'AY1', 'R', 'AA2', 'R', 'M', 'Z'])
('fireball', ['F', 'AY1', 'ER0', 'B', 'AO2', 'L'])
于 2012-08-11T01:15:16.693 回答