UNPKG

arpabet-and-ipa-convertor-ts

Version:

Typescript code to convert between Arpabet and IPA phonetic transcriptions

110 lines (109 loc) 3.86 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.toEnglishPhoneticAlphabet = exports.toAmericanPhoneticAlphabet = exports.toIPA = void 0; var phonemes_1 = require("./phonemes"); var phoneme_error_1 = require("./phoneme-error"); var syllable_1 = require("./model/syllable"); var word_1 = require("./model/word"); var stress_1 = require("./model/stress"); var arpabetTree = {}; phonemes_1.vowels.forEach(function (o) { arpabetTree[o.arpabet] = o; }); phonemes_1.consonants.forEach(function (o) { arpabetTree[o.arpabet] = o; }); var stressDict = (_a = {}, _a[stress_1.Stress.No.type] = stress_1.Stress.No, _a[stress_1.Stress.Primary.type] = stress_1.Stress.Primary, _a[stress_1.Stress.Secondary.type] = stress_1.Stress.Secondary, _a); function toWord(arpabet) { if (!arpabet) { return null; } var before; var lastNum; var phoneme; var stress; var arpabetPhonemes = arpabet.split(' '); var word = new word_1.Word(); var syllable = new syllable_1.Syllable(); for (var _i = 0, arpabetPhonemes_1 = arpabetPhonemes; _i < arpabetPhonemes_1.length; _i++) { var arphabetPhoneme = arpabetPhonemes_1[_i]; phoneme = arpabetTree[arphabetPhoneme]; if (phoneme) { syllable.addPhoneme(phoneme); if (phoneme.isVowel) { word.addSyllable(syllable); syllable = new syllable_1.Syllable(); } } else { lastNum = arphabetPhoneme.slice(-1)[0]; if (isNaN(parseInt(lastNum))) { throw new phoneme_error_1.PhonemeError( // 匹配不到合适的音标 arphabetPhoneme + " does not match the appropriate phonetic transcription"); } stress = stressDict[lastNum]; before = arphabetPhoneme.slice(0, -1); phoneme = arpabetTree[before]; if (phoneme) { syllable.addPhoneme(phoneme); if (stress) { syllable.stress = stress; } else { throw new phoneme_error_1.PhonemeError( // 的重音标识不对,标记成了 "The accent mark of " + before + " is wrong, it is marked as " + lastNum); } if (phoneme.isVowel) { word.addSyllable(syllable); syllable = new syllable_1.Syllable(); } else { throw new phoneme_error_1.PhonemeError( // ${arphabe_phoneme} 重音标识位置不对,当前 ${before} 不是元音 arphabetPhoneme + " The accent mark is in the wrong position, the current " + before + " is not a vowel"); } } else { throw new phoneme_error_1.PhonemeError( // ${before} 匹配不到合适的音标 before + " does not match the appropriate phonetic transcription"); } } } word.addSyllable(syllable); return word; } function toIPA(arpabet) { // 转换成国际音标 var word = toWord(arpabet); if (!word) { return null; } return word.toIPA(); } exports.toIPA = toIPA; function toAmericanPhoneticAlphabet(arpabet) { // 转换成美音 var word = toWord(arpabet); if (!word) { return null; } return word.toAmericanPhoneticAlphabet(); } exports.toAmericanPhoneticAlphabet = toAmericanPhoneticAlphabet; function toEnglishPhoneticAlphabet(arpabet) { /// 转换成英音 var word = toWord(arpabet); if (!word) { return null; } return word.toEnglishPhoneticAlphabet(); } exports.toEnglishPhoneticAlphabet = toEnglishPhoneticAlphabet;