arpabet-and-ipa-convertor-ts
Version:
Typescript code to convert between Arpabet and IPA phonetic transcriptions
110 lines (109 loc) • 3.86 kB
JavaScript
;
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;