phonemize
Version:
Fast phonemizer with rule-based G2P prediction. Pure JavaScript implementation.
2 lines (1 loc) • 5.56 kB
JavaScript
var __assign=function(){return __assign=Object.assign||function(e){for(var n,r=1,i=arguments.length;r<i;r++)for(var a in n=arguments[r],n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a]);return e},__assign.apply(this,arguments)};function __spreadArray(e,n,r){if(r||arguments.length===2)for(var i=0,a=n.length,o;i<a;i++)(o||!(i in n))&&(o||=Array.prototype.slice.call(n,0,i),o[i]=n[i]);return e.concat(o||Array.prototype.slice.call(n))}typeof SuppressedError==`function`&&SuppressedError;var PUNCTUATION=`!"#$%&'()*+,-./:;<=>?@[\\]^_\`{|}~`,ARPABET_TO_IPA={AA:`ɑ`,AE:`æ`,AH:`ə`,AO:`ɔ`,AX:`ə`,AXR:`ɚ`,EH:`ɛ`,ER:`ɝ`,IH:`ɪ`,IY:`i`,UH:`ʊ`,UW:`u`,AW:`aʊ`,AY:`aɪ`,EY:`eɪ`,OW:`oʊ`,OY:`ɔɪ`,B:`b`,D:`d`,G:`ɡ`,K:`k`,P:`p`,T:`t`,DH:`ð`,F:`f`,HH:`h`,S:`s`,SH:`ʃ`,TH:`θ`,V:`v`,Z:`z`,ZH:`ʒ`,CH:`tʃ`,JH:`dʒ`,M:`m`,N:`n`,NG:`ŋ`,EL:`ɫ`,L:`l`,R:`ɹ`,W:`w`,Y:`j`,TS:`ts`,UO:`uo`,YE:`je`,UAH:`ua`,YEN:`jɛn`,YAW:`jaʊ`,YOW:`joʊ`,WAY:`waɪ`,UAHN:`uɑn`,UE:`yɛ`,UY:`ui`,UA:`ua`,EN:`ən`,IN:`in`,UN:`un`,OE:`ø`,AR:`ɑr`,HL:`ħl`,AB:`ɑb`,SAW:`ɔ`,KH:`kʰ`,PH:`pʰ`,NY:`ɲ`},IPA_STRESS_MAP={0:``,1:`ˈ`,2:`ˌ`},CHINESE_TONE_TO_ARROW={"˥˥":`→`,"˥":`→`,"˧˥":`↗`,"˧˩˧":`↓↗`,"˧˩":`↓`,"˥˩":`↘`,"˧":`→`,"˩":`↓`,"˩˥":`↗`,"˥˧":`↘`,"˧˧":`→`},IPA_TO_ARPABET=__assign(__assign({},Object.fromEntries(Object.entries(ARPABET_TO_IPA).map(function(e){var n=e[0],r=e[1];return[r,n]}))),{ʌ:`AH`,ɜ:`ER`,ɒ:`AA`}),IPA_TO_STRESS=Object.fromEntries(Object.entries(IPA_STRESS_MAP).map(function(e){var n=e[0],r=e[1];return[r,n]})),PINYIN_INITIALS_TO_ZHUYIN={b:`ㄅ`,p:`ㄆ`,m:`ㄇ`,f:`ㄈ`,d:`ㄉ`,t:`ㄊ`,n:`ㄋ`,l:`ㄌ`,g:`ㄍ`,k:`ㄎ`,h:`ㄏ`,j:`ㄐ`,q:`ㄑ`,x:`ㄒ`,zh:`ㄓ`,ch:`ㄔ`,sh:`ㄕ`,r:`ㄖ`,z:`ㄗ`,c:`ㄘ`,s:`ㄙ`,y:`ㄧ`,w:`ㄨ`},PINYIN_FINALS_TO_ZHUYIN={a:`ㄚ`,o:`ㄛ`,e:`ㄜ`,i:`ㄧ`,u:`ㄨ`,ü:`ㄩ`,v:`ㄩ`,ai:`ㄞ`,ei:`ㄟ`,ao:`ㄠ`,ou:`ㄡ`,an:`ㄢ`,en:`ㄣ`,ang:`ㄤ`,eng:`ㄥ`,ong:`ㄨㄥ`,er:`ㄦ`,ia:`ㄧㄚ`,ie:`ㄧㄝ`,iao:`ㄧㄠ`,iu:`ㄧㄡ`,iou:`ㄧㄡ`,ian:`ㄧㄢ`,in:`ㄧㄣ`,iang:`ㄧㄤ`,ing:`ㄧㄥ`,iong:`ㄧㄨㄥ`,ua:`ㄨㄚ`,uo:`ㄨㄛ`,uai:`ㄨㄞ`,ui:`ㄨㄟ`,uei:`ㄨㄟ`,uan:`ㄨㄢ`,un:`ㄨㄣ`,uen:`ㄨㄣ`,uang:`ㄨㄤ`,ueng:`ㄨㄥ`,üe:`ㄩㄝ`,ve:`ㄩㄝ`,üan:`ㄩㄢ`,van:`ㄩㄢ`,ün:`ㄩㄣ`,vn:`ㄩㄣ`,zhi:`ㄓ`,chi:`ㄔ`,shi:`ㄕ`,ri:`ㄖ`,zi:`ㄗ`,ci:`ㄘ`,si:`ㄙ`,yin:`ㄧㄣ`,yang:`ㄧㄤ`,yao:`ㄧㄠ`,ye:`ㄧㄝ`,yi:`ㄧ`,yo:`ㄧㄛ`,you:`ㄧㄡ`,yu:`ㄩ`,yue:`ㄩㄝ`,yun:`ㄩㄣ`,yuan:`ㄩㄢ`,wa:`ㄨㄚ`,wai:`ㄨㄞ`,wan:`ㄨㄢ`,wang:`ㄨㄤ`,wei:`ㄨㄟ`,wen:`ㄨㄣ`,weng:`ㄨㄥ`,wo:`ㄨㄛ`,wu:`ㄨ`};function ipaToArpabet(e){if(!e||typeof e!=`string`||!e.trim())return``;for(var n=[],r=0;r<e.length;){var i=e[r];if(i===`ː`){r++;continue}if(IPA_TO_STRESS[i]){var a=IPA_TO_STRESS[i];r++;var o=getNextPhoneme(e,r);o&&(n.push(o.arpabet+a),r+=o.length);continue}var l=e.substring(r,r+2);if(IPA_TO_ARPABET[l]){n.push(IPA_TO_ARPABET[l]),r+=2;continue}if(IPA_TO_ARPABET[i]){n.push(IPA_TO_ARPABET[i]),r++;continue}i===` `?n.length>0&&n[n.length-1]!==` `&&n.push(` `):i.trim()&&n.push(`undefined`),r++}return n.join(` `).replace(/\s+/g,` `).trim()}var ARPABET_VOWELS=new Set([`AA`,`AE`,`AH`,`AO`,`AW`,`AY`,`EH`,`ER`,`EY`,`IH`,`IY`,`OW`,`OY`,`UH`,`UW`,`AX`,`AXR`]);function arpabetToIpa(e){var n;if(!e||typeof e!=`string`||!e.trim())return``;for(var r=e.split(/\s+/).filter(function(e){return e.trim()}),a=[],o=[],s=-1,c=-1,l=0,u=r;l<u.length;l++){var d=u[l],f=(n=d.match(/([012])$/))?.[0]||``,p=d.replace(/[012]$/,``),m=ARPABET_TO_IPA[p];m?(a.push(m),o.push(ARPABET_VOWELS.has(p))):(a.push(d),o.push(!1)),f===`1`&&s<0?s=a.length-1:f===`2`&&c<0&&(c=a.length-1)}var h=function(e){for(var n=e;n>0&&!o[n-1];)n--;return n},g=[];s>=0&&g.push([h(s),`ˈ`]),c>=0&&g.push([h(c),`ˌ`]),g.sort(function(e,n){return n[0]-e[0]});for(var _=0,v=g;_<v.length;_++){var y=v[_],b=y[0],x=y[1];a.splice(b,0,x)}return a.join(``)}function getNextPhoneme(e,n){var r=e.substring(n,n+2);if(IPA_TO_ARPABET[r])return{arpabet:IPA_TO_ARPABET[r],length:2};var i=e[n];return IPA_TO_ARPABET[i]?{arpabet:IPA_TO_ARPABET[i],length:1}:null}function convertChineseTonesToArrows(e){if(!e||typeof e!=`string`)return e;for(var n=e,r=Object.keys(CHINESE_TONE_TO_ARROW).sort(function(e,n){return n.length-e.length}),i=0,a=r;i<a.length;i++){var s=a[i],c=CHINESE_TONE_TO_ARROW[s];n=n.replace(new RegExp(s,`g`),c)}return n}function pinyinToZhuyin(e){if(!e?.trim())return e;var n=e.match(/([1-5])$/),r=n?n[1]:``,i=e.replace(/[1-5]$/,``);if(PINYIN_FINALS_TO_ZHUYIN[i])return PINYIN_FINALS_TO_ZHUYIN[i]+r;var a=decomposePinyinSyllable(i),o=a.initial,s=a.final,c=``;return o&&PINYIN_INITIALS_TO_ZHUYIN[o]&&(c+=PINYIN_INITIALS_TO_ZHUYIN[o]),s&&PINYIN_FINALS_TO_ZHUYIN[s]?c+=PINYIN_FINALS_TO_ZHUYIN[s]:s?(c=i,console.warn(`Could not find a Zhuyin mapping for pinyin final: ${s}`)):!s&&o&&(c=i),c+(r||`5`)}function decomposePinyinSyllable(e){if(!e?.trim())return{initial:``,final:``};if(e.startsWith(`zh`))return{initial:`zh`,final:e.slice(2)};if(e.startsWith(`ch`))return{initial:`ch`,final:e.slice(2)};if(e.startsWith(`sh`))return{initial:`sh`,final:e.slice(2)};for(var n=[`b`,`p`,`m`,`f`,`d`,`t`,`n`,`l`,`g`,`k`,`h`,`j`,`q`,`x`,`r`,`z`,`c`,`s`,`y`,`w`],r=0,i=n;r<i.length;r++){var a=i[r];if(e.startsWith(a))return{initial:a,final:e.slice(a.length)}}return{initial:``,final:e}}function resolveJson(e){return typeof e.default==`object`?e.default:e}export{PUNCTUATION as P,__assign as _,__spreadArray as a,arpabetToIpa as b,convertChineseTonesToArrows as c,ipaToArpabet as i,pinyinToZhuyin as p,resolveJson as r};