我不确定这是否能正确处理压力标记(我只是将其转换为上标),我也不确定它应该放在哪里,但认为这可能会启发有人正确地添加它。
_MAP_ARPA_IPA = {"AA": "ɑ", "AE": "æ", "AH": "ʌ", "AO": "ɔ","AW": "aʊ",
"AX": "ə", "AXR": "ɚ", "AY": "aɪ", "EH": "ɛ", "ER": "ɝ",
"EY": "eɪ", "IH": "ɪ", "IX": "ɨ", "IY": "i", "OW": "oʊ",
"OY": "ɔɪ", "UH": "ʊ", "UW": "u", "UX": "ʉ", "B": "b",
"CH": "tʃ", "D": "d", "DH": "ð", "DX": "ɾ", "EL": "l̩",
"EM": "m̩", "EN": "n̩", "F": "f", "G": "ɡ", "HH": "h",
"H": "h", "JH": "dʒ", "K": "k", "L": "l", "M": "m",
"N": "n", "NG": "ŋ", "NX": "ɾ̃", "P": "p", "Q": "ʔ",
"R": "ɹ", "S": "s", "SH": "ʃ", "T": "t", "TH": "θ",
"V": "v", "W": "w", "WH": "ʍ", "Y": "j", "Z": "z",
"ZH": "ʒ"}
_MAP_ARPA_AUX = {
"0": "⁰", "1": "¹", "2": "²", "3": "³", "4": "⁴",
"5": "⁵", "6": "⁶", "7": "⁷", "8": "⁸", "9": "⁹",
"-": "-", "!": "!", "+": "+",
"/": "/", "#": "#", ":": ":"}
def arpa2ipa(tag, mapping, aux_map):
"""
function definition:
--> takes an Arpabet tag and maps into IPA
stress is shown as a superscript
>>> arpa2ipa("AA", _MAP_ARPA_IPA, _MAP_ARPA_AUX)
"ɑ"
>>> arpa2ipa("IY0", _MAP_ARPA_IPA, _MAP_ARPA_AUX)
"i⁰"
"""
if tag[-1] in aux_map:
assert tag[:-1] in mapping, f"Unexpected arpabet: {tag[:-1]}"
return mapping[tag[:-1]] + aux_map[tag[-1]]
else:
assert tag in mapping, f"Unexpected arpabet: {tag}"
return mapping[tag]
使用示例:
>>> green = ["G", "R", "IY0", "N"]
>>> print(green, [arpa2ipa(l, _MAP_ARPA_IPA, _MAP_ARPA_AUX) for l in green ])
['ɡ', 'ɹ', 'i⁰', 'n']
我在整个词汇表中运行了它,它可以转换每个发音而没有任何错误。
1条答案
按热度按时间35g0bw711#
这将是cmudict语料库阅读器的一个有用的附加功能。它最终可能会进入一个单独的模块,特别是如果NLTK有更多的IPA音标或TTS材料。同时,它与cmudict最紧密地连接在一起。