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
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
您想要的是各种称为“字母到声音”或“字素到音素”的引擎。周围有一些,包括每个文本到语音系统中的一个。
我通常处理非美国口音,为此我使用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
而不是--ipa
espeak 自己的电话表示(它是 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”)。
在安装了语料库的情况下使用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
您可以使用我的侦听器项目中的一个小实用程序来执行此操作。它在幕后使用 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
获取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'])