phonemize
Version:
Fast phonemizer with rule-based G2P prediction. Pure JavaScript implementation.
2 lines (1 loc) • 1.85 kB
JavaScript
;var JAPANESE_SYLLABLE_MAP={a:`a`,i:`i`,u:`ɯ`,e:`e`,o:`o`,ka:`ka`,ki:`ki`,ku:`kɯ`,ke:`ke`,ko:`ko`,ga:`ɡa`,gi:`ɡi`,gu:`ɡɯ`,ge:`ɡe`,go:`ɡo`,sa:`sa`,shi:`ʃi`,su:`sɯ`,se:`se`,so:`so`,za:`za`,ji:`dʑi`,zu:`zɯ`,ze:`ze`,zo:`zo`,ta:`ta`,chi:`tɕi`,tsu:`tsɯ`,te:`te`,to:`to`,da:`da`,de:`de`,do:`do`,na:`na`,ni:`ni`,nu:`nɯ`,ne:`nɛ`,no:`no`,ha:`ha`,hi:`çi`,fu:`ɸɯ`,he:`hɛ`,ho:`ho`,ba:`ba`,bi:`bi`,bu:`bɯ`,be:`be`,bo:`bo`,pa:`pa`,pi:`pi`,pu:`pɯ`,pe:`pe`,po:`po`,ma:`ma`,mi:`mi`,mu:`mɯ`,me:`mɛ`,mo:`mo`,ya:`ja`,yu:`jɯ`,yo:`jo`,ra:`ɾa`,ri:`ɾi`,ru:`ɾɯ`,wa:`wa`,wo:`o`,n:`n`,kya:`kja`,kyu:`kjɯ`,kyo:`kjo`,gya:`ɡja`,gyu:`ɡjɯ`,gyo:`ɡjo`,sha:`ʃa`,shu:`ʃɯ`,sho:`ʃo`,ja:`dʑa`,ju:`dʑɯ`,jo:`dʑo`,cha:`tɕa`,chu:`tɕɯ`,cho:`tɕo`,nya:`ɲa`,nyu:`ɲɯ`,nyo:`ɲo`,hya:`ça`,hyu:`çɯ`,hyo:`ço`,ryu:`ɾjɯ`},JAPANESE_LONG_VOWEL_RULES={aa:`aː`,ii:`iː`,uu:`uː`,ee:`eː`,oo:`oː`},JapaneseG2PModel=function(){function n(){this.id=`ja-g2p`,this.name=`Japanese G2P Processor`,this.supportedLanguages=[`ja`]}return n.prototype.predict=function(e,t,n){return this.processJapanese(e)},n.prototype.addPronunciation=function(e,t){},n.prototype.processJapanese=function(n){n=n.toLowerCase(),n===`ha`?n=`wa`:n===`he`?n=`e`:n===`wo`?n=`o`:n===`konnichiha`?n=`konnichiwa`:n===`konbanha`&&(n=`konbanwa`),n=n.replace(/([bcdfghjklmpqrstvwxyz])\1/g,`っ$1`),n=n.replace(/n(?=[bcdfghjklmpqrstvwxyz])/g,`ん`);for(var r=0,i=Object.entries(JAPANESE_LONG_VOWEL_RULES);r<i.length;r++){var a=i[r],o=a[0],s=a[1];n=n.replace(new RegExp(o,`g`),s)}for(var c=``,l=0;l<n.length;){for(var u=!1,d=3;d>0;d--)if(l+d<=n.length){var f=n.substring(l,l+d);if(JAPANESE_SYLLABLE_MAP[f]){c+=JAPANESE_SYLLABLE_MAP[f],l+=d,u=!0;break}}u||(n[l]===`っ`?c+=`っ`:n[l]===`ん`?c+=`n`:c+=n[l],l++)}return c.replace(/っ/g,``)},n}();module.exports=JapaneseG2PModel;