js-tts-wrapper
Version:
A JavaScript/TypeScript library that provides a unified API for working with multiple cloud-based Text-to-Speech (TTS) services
1 lines • 2.78 MB
JavaScript
!function(A,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i((A="undefined"!=typeof globalThis?globalThis:A||self).JSTTSWrapper={})}(this,(function(A){"use strict";function i(A,i){return i.forEach((function(i){i&&"string"!=typeof i&&!Array.isArray(i)&&Object.keys(i).forEach((function(e){if("default"!==e&&!(e in A)){var a=Object.getOwnPropertyDescriptor(i,e);Object.defineProperty(A,e,a.get?a:{enumerable:!0,get:function(){return i[e]}})}}))})),Object.freeze(A)}class e{constructor(){this.ssml=""}add(A){return A.trim().startsWith("<speak")?this.ssml=A:this.ssml=`<speak>${A}</speak>`,this.ssml}addBreak(A="500ms"){return this.ssml=this.ssml.replace("</speak>",`<break time="${A}"/></speak>`),this}addProsody(A,i,e,a){let g="";i&&(g+=` rate="${i}"`),e&&(g+=` pitch="${e}"`),a&&(g+=` volume="${a}"`);const r=`<prosody${g}>${A}</prosody>`;return this.ssml.includes("<speak>")?this.ssml=this.ssml.replace("<speak>",`<speak>${r}`):this.ssml=`<speak>${r}</speak>`,this}wrapWithSpeak(A){return A.trim().startsWith("<speak")?A:`<speak>${A}</speak>`}clearSSML(){this.ssml=""}toString(){return this.ssml}}class a{static normalize(A,i){try{let e,g;if(A.startsWith("mms_")&&(A=A.substring(4)),A.includes("-")){const i=A.split("-");e=i[0].toLowerCase(),g=i[1].toUpperCase()}else e=A.toLowerCase(),g=null==i?void 0:i.toUpperCase();const r=a.iso1To3[e]||e,B=g?`${e}-${g}`:e;let n=a.languageNames[e]||e;return g&&a.regionNames[g]?n+=` (${a.regionNames[g]})`:g&&(n+=` (${g})`),{iso639_3:r,bcp47:B,display:n,countryCode:g}}catch(A){return{iso639_3:"und",bcp47:"und",display:"Unknown"}}}static getDisplayName(A){return a.normalize(A).display}static getISO639_3(A){return a.normalize(A).iso639_3}static getBCP47(A,i){return a.normalize(A,i).bcp47}}a.languageNames={en:"English",fr:"French",es:"Spanish",de:"German",it:"Italian",ja:"Japanese",ko:"Korean",zh:"Chinese",ru:"Russian",pt:"Portuguese",ar:"Arabic",hi:"Hindi",nl:"Dutch",sv:"Swedish",fi:"Finnish",no:"Norwegian",da:"Danish",pl:"Polish",tr:"Turkish",cs:"Czech",hu:"Hungarian",el:"Greek",he:"Hebrew",th:"Thai",vi:"Vietnamese",id:"Indonesian",ms:"Malay",ro:"Romanian",sk:"Slovak",uk:"Ukrainian",bg:"Bulgarian",hr:"Croatian",lt:"Lithuanian",lv:"Latvian",et:"Estonian",sl:"Slovenian",sr:"Serbian"},a.regionNames={US:"United States",GB:"United Kingdom",AU:"Australia",CA:"Canada",IN:"India",IE:"Ireland",ZA:"South Africa",NZ:"New Zealand",FR:"France",DE:"Germany",IT:"Italy",ES:"Spain",MX:"Mexico",JP:"Japan",KR:"Korea",CN:"China",TW:"Taiwan",HK:"Hong Kong",BR:"Brazil",PT:"Portugal",RU:"Russia"},a.iso1To3={ar:"ara",bg:"bul",ca:"cat",cs:"ces",da:"dan",de:"deu",el:"ell",en:"eng",es:"spa",et:"est",fi:"fin",fr:"fra",he:"heb",hi:"hin",hr:"hrv",hu:"hun",id:"ind",it:"ita",ja:"jpn",ko:"kor",lt:"lit",lv:"lav",ms:"msa",nl:"nld",no:"nor",pl:"pol",pt:"por",ro:"ron",ru:"rus",sk:"slk",sl:"slv",sr:"srp",sv:"swe",th:"tha",tr:"tur",uk:"ukr",vi:"vie",zh:"zho"};const g={sapi:{supportsSSML:!0,supportLevel:"full",supportedTags:["speak","prosody","break","emphasis","voice","phoneme","say-as","sub","p","s"],unsupportedTags:[],requiresNamespace:!1,requiresVersion:!0},witai:{supportsSSML:!0,supportLevel:"full",supportedTags:["speak","prosody","break","emphasis","voice","phoneme","say-as","sub","p","s"],unsupportedTags:[],requiresNamespace:!1,requiresVersion:!1},watson:{supportsSSML:!0,supportLevel:"full",supportedTags:["speak","prosody","break","emphasis","voice","phoneme","say-as","sub","p","s"],unsupportedTags:[],requiresNamespace:!1,requiresVersion:!1},azure:{supportsSSML:!0,supportLevel:"full",supportedTags:["speak","prosody","break","emphasis","voice","phoneme","say-as","sub","p","s","mstts:express-as"],unsupportedTags:[],requiresNamespace:!0,requiresVersion:!0},polly:{supportsSSML:!0,supportLevel:"limited",supportedTags:["speak","prosody","break","voice","phoneme","say-as","sub","p","s","mark","lang"],unsupportedTags:[],requiresNamespace:!0,requiresVersion:!1},google:{supportsSSML:!0,supportLevel:"limited",supportedTags:["speak","prosody","break","emphasis","voice","phoneme","say-as","sub","p","s","mark","lang","audio"],unsupportedTags:[],requiresNamespace:!1,requiresVersion:!1},elevenlabs:{supportsSSML:!1,supportLevel:"none",supportedTags:[],unsupportedTags:["*"],requiresNamespace:!1,requiresVersion:!1},openai:{supportsSSML:!1,supportLevel:"none",supportedTags:[],unsupportedTags:["*"],requiresNamespace:!1,requiresVersion:!1},playht:{supportsSSML:!1,supportLevel:"none",supportedTags:[],unsupportedTags:["*"],requiresNamespace:!1,requiresVersion:!1},upliftai:{supportsSSML:!1,supportLevel:"none",supportedTags:[],unsupportedTags:["*"],requiresNamespace:!1,requiresVersion:!1},sherpaonnx:{supportsSSML:!1,supportLevel:"none",supportedTags:[],unsupportedTags:["*"],requiresNamespace:!1,requiresVersion:!1},"sherpaonnx-wasm":{supportsSSML:!1,supportLevel:"none",supportedTags:[],unsupportedTags:["*"],requiresNamespace:!1,requiresVersion:!1},espeak:{supportsSSML:!0,supportLevel:"limited",supportedTags:["speak","prosody","break","emphasis","p","s"],unsupportedTags:["voice","phoneme","say-as","sub"],requiresNamespace:!1,requiresVersion:!1},"espeak-wasm":{supportsSSML:!0,supportLevel:"limited",supportedTags:["speak","prosody","break","emphasis","p","s"],unsupportedTags:["voice","phoneme","say-as","sub"],requiresNamespace:!1,requiresVersion:!1}},r={polly:{standard:{supportLevel:"full",unsupportedTags:[]},"long-form":{supportLevel:"full",unsupportedTags:[]},neural:{supportLevel:"limited",unsupportedTags:["emphasis","amazon:auto-breaths","amazon:effect"]},generative:{supportLevel:"limited",unsupportedTags:["emphasis","amazon:auto-breaths","amazon:effect","mark"]}},google:{standard:{supportLevel:"full",unsupportedTags:[]},wavenet:{supportLevel:"full",unsupportedTags:[]},neural2:{supportLevel:"limited",unsupportedTags:["mark"]},journey:{supportLevel:"none",unsupportedTags:["*"]},studio:{supportLevel:"none",unsupportedTags:["*"]}}};class B{static getCapabilities(A,i){const e=g[A];if(!e)return{supportsSSML:!1,supportLevel:"none",supportedTags:[],unsupportedTags:["*"],requiresNamespace:!1,requiresVersion:!1};if(i&&r[A]){const a=B.getVoiceSpecificCapabilities(A,i);if(a)return{...e,supportLevel:a.supportLevel,unsupportedTags:a.unsupportedTags}}return e}static getVoiceSpecificCapabilities(A,i){const e=r[A];if(!e)return null;return e[B.detectVoiceType(A,i)]||null}static detectVoiceType(A,i){const e=i.toLowerCase();switch(A){case"polly":return e.includes("neural")?"neural":e.includes("generative")?"generative":e.includes("long-form")?"long-form":"standard";case"google":return e.includes("neural2")?"neural2":e.includes("journey")?"journey":e.includes("studio")?"studio":e.includes("wavenet")?"wavenet":(e.includes("standard"),"standard");default:return"default"}}static validateSSML(A,i,e){const a=B.getCapabilities(i,e),g=[],r=[];if(A.trim().startsWith("<speak")&&A.trim().endsWith("</speak>")||g.push("SSML must be wrapped in <speak> tags"),!a.supportsSSML)return r.push(`Engine '${i}' does not support SSML. Tags will be stripped.`),{isValid:!0,errors:g,warnings:r};if(a.unsupportedTags.includes("*"))r.push(`Engine '${i}' does not support any SSML tags. All tags will be stripped.`);else for(const e of a.unsupportedTags){new RegExp(`<${e}[^>]*>`,"gi").test(A)&&r.push(`Tag '<${e}>' is not supported by engine '${i}' and will be removed.`)}return a.requiresNamespace&&!A.includes("xmlns=")&&r.push(`Engine '${i}' requires xmlns attribute in <speak> tag.`),a.requiresVersion&&!A.includes("version=")&&r.push(`Engine '${i}' requires version attribute in <speak> tag.`),{isValid:0===g.length,errors:g,warnings:r}}static processSSMLForEngine(A,i,e){const a=B.getCapabilities(i,e);if(!a.supportsSSML)return B.stripAllSSMLTags(A);let g=A;if(a.unsupportedTags.includes("*"))return B.stripAllSSMLTags(A);for(const A of a.unsupportedTags)g=B.removeSSMLTag(g,A);return g=B.addRequiredAttributes(g,a),g}static stripAllSSMLTags(A){let i=A;i=i.replace(/<speak[^>]*>/gi,""),i=i.replace(/<\/speak>/gi,""),i=i.replace(/<break[^>]*\/?>/gi," ");let e="";for(;i!==e;)e=i,i=i.replace(/<emphasis[^>]*>(.*?)<\/emphasis>/gis,"$1"),i=i.replace(/<prosody[^>]*>(.*?)<\/prosody>/gis,"$1"),i=i.replace(/<voice[^>]*>(.*?)<\/voice>/gis,"$1"),i=i.replace(/<say-as[^>]*>(.*?)<\/say-as>/gis,"$1"),i=i.replace(/<phoneme[^>]*>(.*?)<\/phoneme>/gis,"$1"),i=i.replace(/<sub[^>]*>(.*?)<\/sub>/gis,"$1"),i=i.replace(/<p[^>]*>(.*?)<\/p>/gis,"$1 "),i=i.replace(/<s[^>]*>(.*?)<\/s>/gis,"$1 "),i=i.replace(/<lang[^>]*>(.*?)<\/lang>/gis,"$1"),i=i.replace(/<audio[^>]*>(.*?)<\/audio>/gis,"$1"),i=i.replace(/<mark[^>]*\/?>/gi,""),i=i.replace(/<[^>]+>/g,"");return i=i.replace(/\s+/g," ").trim(),i}static removeSSMLTag(A,i){let e=A;const a=new RegExp(`<${i}[^>]*\\/>`,"gi");e=e.replace(a,"");const g=new RegExp(`<${i}[^>]*>(.*?)<\\/${i}>`,"gi");return e=e.replace(g,"$1"),e}static addRequiredAttributes(A,i){let e=A;return i.requiresNamespace&&!A.includes("xmlns=")&&(e=e.replace(/<speak([^>]*)>/i,'<speak$1 xmlns="http://www.w3.org/2001/10/synthesis">')),i.requiresVersion&&!A.includes("version=")&&(e=e.replace(/<speak([^>]*)>/i,'<speak version="1.0"$1>')),e}}function n(A){return A.trim().startsWith("<speak")&&A.trim().endsWith("</speak>")}function C(A,i,e){return B.validateSSML(A,i,e)}function o(A,i,e){return B.processSSMLForEngine(A,i,e)}function Q(A){return A.replace(/<speak.*?>/g,"").replace(/<\/speak>/g,"").replace(/<break.*?\/>/g," ").replace(/<emphasis.*?>(.*?)<\/emphasis>/g,"$1").replace(/<prosody.*?>(.*?)<\/prosody>/g,"$1").replace(/<voice.*?>(.*?)<\/voice>/g,"$1").replace(/<say-as.*?>(.*?)<\/say-as>/g,"$1").replace(/<phoneme.*?>(.*?)<\/phoneme>/g,"$1").replace(/<sub.*?>(.*?)<\/sub>/g,"$1").replace(/<p>(.*?)<\/p>/g,"$1 ").replace(/<s>(.*?)<\/s>/g,"$1 ").replace(/\s+/g," ").trim()}function l(A){return n(A)?A:`<speak>${A}</speak>`}const c="undefined"!=typeof window,I=!c&&"undefined"!=typeof process&&void 0!==process.versions&&void 0!==process.versions.node,w=A=>{if(I){return new Function("n","return require(n)")("node:fs").readFileSync(A,"utf-8")}throw new Error("Synchronous file reading is not supported in browsers")},D=A=>{if(I){return new Function("n","return require(n)")("node:fs").existsSync(A)}throw new Error("Synchronous file existence check is not supported in browsers")},t=(...A)=>{if(I){return new Function("n","return require(n)")("node:path").join(...A)}return A.join("/").replace(/\/+/g,"/")};async function s(A){const i=[];let e=0;if("getReader"in A&&"function"==typeof A.getReader){const a=A.getReader();try{for(;;){const{done:A,value:g}=await a.read();if(A)break;g&&(i.push(g),e+=g.length)}}finally{a.releaseLock()}if(I){const A=i.map((A=>Buffer.from(A)));return Buffer.concat(A,e)}const g=new Uint8Array(e);let r=0;for(const A of i)g.set(A,r),r+=A.length;return g}if("function"==typeof A.on)return new Promise(((a,g)=>{const r=A;r.on("data",(A=>{const a=Buffer.isBuffer(A)?A:Buffer.from(A);i.push(a),e+=a.length})),r.on("end",(()=>{a(Buffer.concat(i,e))})),r.on("error",(A=>{g(A)}))}));throw new Error("Unsupported stream type provided to streamToBuffer")}function h(A){const i=[A.text,A.filename,A.audioBytes,A.audioStream].filter(Boolean).length;if(0===i)throw new Error("No input provided. Please provide text, filename, audioBytes, or audioStream.");if(i>1)throw new Error("Multiple input sources provided. Please provide only one of: text, filename, audioBytes, or audioStream.")}function E(A){switch(A.toLowerCase().split(".").pop()){case"mp3":return"audio/mpeg";case"wav":default:return"audio/wav";case"ogg":return"audio/ogg";case"opus":return"audio/opus";case"aac":return"audio/aac";case"flac":return"audio/flac"}}function d(A){if(A.length<4)return"audio/wav";const i=Array.from(A.slice(0,12));return 73===i[0]&&68===i[1]&&51===i[2]||255===i[0]&&!(224&~i[1])?"audio/mpeg":82===i[0]&&73===i[1]&&70===i[2]&&70===i[3]&&87===i[8]&&65===i[9]&&86===i[10]&&69===i[11]?"audio/wav":79===i[0]&&103===i[1]&&103===i[2]&&83===i[3]?"audio/ogg":102===i[0]&&76===i[1]&&97===i[2]&&67===i[3]?"audio/flac":"audio/wav"}async function M(A){if(!I)throw new Error("File reading is only supported in Node.js environment");try{const i=await new Function("m","return import(m)")("node:fs/promises"),e=await i.readFile(A);return new Uint8Array(e)}catch(i){throw new Error(`Failed to read audio file "${A}": ${i instanceof Error?i.message:String(i)}`)}}async function U(A){const i=await s(A);return i instanceof Buffer?new Uint8Array(i):i}var F=Object.freeze({__proto__:null,detectAudioFormat:d,getAudioFormatFromFilename:E,processAudioInput:async function(A){if(h(A),A.audioBytes)return{audioBytes:A.audioBytes,mimeType:d(A.audioBytes)};if(A.audioStream){const i=await U(A.audioStream);return{audioBytes:i,mimeType:d(i)}}if(A.filename){return{audioBytes:await M(A.filename),mimeType:E(A.filename)}}throw new Error("No valid audio input provided")},readAudioFile:M,streamToBytes:U,validateSpeakInput:h});class u{constructor(A){this.credentials=A,this.voiceId=null,this.lang="en-US",this.callbacks={},this.properties={volume:100,rate:"medium",pitch:"medium"},this.timings=[],this.capabilities={browserSupported:!0,nodeSupported:!0,needsWasm:!1},this.sampleRate=24e3,this.ssml=new e,this.audio={isPlaying:!1,isPaused:!1,audioElement:null,position:0,duration:0}}async synthToBytesWithFormat(A,i){return this.synthToBytesWithConversion(A,i)}async synthToBytesWithConversion(A,i){const e=await this.synthToBytes(A,i);if(!(null==i?void 0:i.format))return e;const a=i.format,g=this.detectNativeFormat(e);if(g===a)return e;if(!I)return console.warn(`Audio format conversion not available in browser. Returning native format (${g}) instead of requested format (${a})`),e;try{const{isAudioConversionAvailable:A,convertAudioFormat:i}=await new Function("m","return import(m)")("../utils/audio-converter");if(A())try{return(await i(e,a)).audioBytes}catch(A){console.warn(`Audio format conversion failed: ${A instanceof Error?A.message:String(A)}`),console.warn(`Returning native format (${g}) instead of requested format (${a})`)}else console.warn(`Audio format conversion not available. Returning native format (${g}) instead of requested format (${a})`)}catch(A){console.warn(`Audio converter not available at runtime; returning native format (${g})`)}return e}detectNativeFormat(A){switch(d(A)){case"audio/mpeg":return"mp3";case"audio/ogg":return"ogg";default:return"wav"}}async getVoices(){const A=await this._getVoices();return(await this._mapVoicesToUnified(A)).map((A=>{const i=A.languageCodes.map((A=>{const i=a.normalize(A.bcp47);return{bcp47:i.bcp47,iso639_3:i.iso639_3,display:i.display}}));return{...A,languageCodes:i}}))}async _mapVoicesToUnified(A){return A}async speak(A,i){this.emit("start");try{let e,a;if("string"==typeof A)e=await this.synthToBytesWithConversion(A,i),a=d(e);else{const{processAudioInput:i}=await Promise.resolve().then((function(){return F})),g=await i(A);e=g.audioBytes,a=g.mimeType}if(c){const i=new ArrayBuffer(e.byteLength);new Uint8Array(i).set(e);const g=new Blob([i],{type:a}),r=URL.createObjectURL(g),B=new Audio;B.oncanplay=async()=>{try{this.audio.audioElement=B,this.audio.isPlaying=!0,this.audio.isPaused=!1,"string"==typeof A&&this._createEstimatedWordTimings(A),await B.play()}catch(A){console.error("Error playing audio:",A),this.emit("end")}},B.onerror=A=>{console.error("Audio playback error:",A),this.emit("end"),URL.revokeObjectURL(r)},B.onended=()=>{this.emit("end"),this.audio.isPlaying=!1,URL.revokeObjectURL(r)},B.src=r}else if(I)try{const i=await Promise.resolve().then((function(){return Ji})),{isNodeAudioAvailable:a,playAudioInNode:g}=i,r=await a();"string"==typeof A&&this._createEstimatedWordTimings(A),r?(this.emit("start"),this._scheduleWordBoundaryCallbacks(),await g(e,this.sampleRate,this.constructor.name.replace("TTSClient","").toLowerCase()),this.emit("end")):(console.log("Audio playback in Node.js requires the sound-play package."),console.log("Install it with: npm install js-tts-wrapper[node-audio]"),console.log("Or use synthToFile() to save audio to a file and play it with an external player."),this._fireWordBoundaryCallbacks(),this.emit("end"))}catch(A){console.error("Error playing audio in Node.js:",A),this._fireWordBoundaryCallbacks(),this.emit("end")}else console.log("Audio playback is not supported in this environment."),console.log("Use synthToFile() to save audio to a file and play it with an external player."),this.emit("end")}catch(A){throw console.error("Error in speak method:",A),this.emit("end"),A}}async speakStreamed(A,i){this.emit("start");try{let e,a,g=[],r="";if("string"==typeof A){r=A;const B=await this.synthToBytestream(r,i),n=B.audioStream;g=B.wordBoundaries;const C=n.getReader(),o=[];let Q=await C.read();for(;!Q.done;)o.push(Q.value),Q=await C.read();const l=o.reduce(((A,i)=>A+i.length),0);e=new Uint8Array(l);let c=0;for(const A of o)e.set(A,c),c+=A.length;if(null==i?void 0:i.format)if(I)try{const{isAudioConversionAvailable:A,convertAudioFormat:g}=await new Function("m","return import(m)")("../utils/audio-converter");if(A()){const A=await g(e,i.format);e=A.audioBytes,a=A.mimeType}else a=d(e)}catch(A){console.warn(`Streaming format conversion failed: ${A instanceof Error?A.message:String(A)}`),a=d(e)}else a=d(e);else a=d(e)}else{const{processAudioInput:i}=await Promise.resolve().then((function(){return F})),g=await i(A);e=g.audioBytes,a=g.mimeType,r=""}if(g.length>0?this.timings=g.map((A=>[A.offset/1e4,(A.offset+A.duration)/1e4,A.text])):r?this._createEstimatedWordTimings(r):this.timings=[],c){const A=new ArrayBuffer(e.byteLength);new Uint8Array(A).set(e);const i=new Blob([A],{type:a}),g=URL.createObjectURL(i),r=new Audio;r.oncanplay=async()=>{try{this.audio.audioElement=r,this.audio.isPlaying=!0,this.audio.isPaused=!1,await r.play()}catch(A){console.error("Error playing audio:",A),this.emit("end")}},r.onerror=A=>{console.error("Audio playback error:",A),this.emit("end"),URL.revokeObjectURL(g)},r.onended=()=>{this.emit("end"),this.audio.isPlaying=!1,URL.revokeObjectURL(g)},r.src=g}else if(I){console.log("🔍 Taking Node.js audio path");try{const A=await Promise.resolve().then((function(){return Ji})),{isNodeAudioAvailable:i,playAudioInNode:a}=A,g=await i();console.log(`🔍 Audio available: ${g}`),r&&(console.log(`🔍 Creating estimated word timings for: "${r}"`),this._createEstimatedWordTimings(r),console.log(`🔍 Created ${this.timings.length} timings`)),g?(console.log("🔍 Audio available - scheduling word boundary callbacks"),this._scheduleWordBoundaryCallbacks(),await a(e,this.sampleRate,this.constructor.name.replace("TTSClient","").toLowerCase()),this.emit("end")):(console.log("Audio playback in Node.js requires the sound-play package."),console.log("Install it with: npm install js-tts-wrapper[node-audio]"),console.log("Or use synthToFile() to save audio to a file and play it with an external player."),this._fireWordBoundaryCallbacks(),this.emit("end"))}catch(A){console.error("Error playing audio in Node.js:",A),this._fireWordBoundaryCallbacks(),this.emit("end")}}else console.log("Audio playback is not supported in this environment."),console.log("Use synthToFile() to save audio to a file and play it with an external player."),r&&this._createEstimatedWordTimings(r),setTimeout((()=>{this._fireWordBoundaryCallbacks(),this.emit("end")}),100)}catch(A){throw console.error("Error in streaming synthesis:",A),this.emit("end"),A}}async synthToFile(A,i,e="wav",a){const g=await this.synthToBytesWithConversion(A,{...a,format:e});if(c){const A="mp3"===e?"audio/mpeg":"audio/wav",a=new ArrayBuffer(g.byteLength);new Uint8Array(a).set(g);const r=new Blob([a],{type:A}),B=URL.createObjectURL(r),n=document.createElement("a");n.href=B,n.download=i.endsWith(`.${e}`)?i:`${i}.${e}`,document.body.appendChild(n),n.click(),requestAnimationFrame((()=>{var A;(null===(A=null===document||void 0===document?void 0:document.body)||void 0===A?void 0:A.contains(n))&&document.body.removeChild(n),URL.revokeObjectURL(B)}))}else if(I){const A=i.endsWith(`.${e}`)?i:`${i}.${e}`;(await new Function("m","return import(m)")("node:fs")).writeFileSync(A,Buffer.from(g))}else console.warn("File saving not implemented for this environment.")}setVoice(A,i){this.voiceId=A,i&&(this.lang=i)}pause(){if(c)this.audio.audioElement&&this.audio.isPlaying&&!this.audio.isPaused&&(this.audio.audioElement.pause(),this.audio.isPaused=!0);else if(I)try{Promise.resolve().then((function(){return pi})).then((A=>{A.pauseAudioPlayback()&&(this.audio.isPaused=!0)})).catch((A=>{console.error("Error importing node-audio-control:",A)}))}catch(A){console.error("Error pausing audio in Node.js:",A)}}resume(){if(c)this.audio.audioElement&&this.audio.isPlaying&&this.audio.isPaused&&(this.audio.audioElement.play(),this.audio.isPaused=!1);else if(I)try{Promise.resolve().then((function(){return pi})).then((A=>{A.resumeAudioPlayback()&&(this.audio.isPaused=!1)})).catch((A=>{console.error("Error importing node-audio-control:",A)}))}catch(A){console.error("Error resuming audio in Node.js:",A)}}stop(){if(c)this.audio.audioElement&&(this.audio.audioElement.pause(),this.audio.audioElement.currentTime=0,this.audio.isPlaying=!1,this.audio.isPaused=!1);else if(I)try{Promise.resolve().then((function(){return pi})).then((A=>{A.stopAudioPlayback()&&(this.audio.isPlaying=!1,this.audio.isPaused=!1)})).catch((A=>{console.error("Error importing node-audio-control:",A)}))}catch(A){console.error("Error stopping audio in Node.js:",A)}}_createEstimatedWordTimings(A){const i=(this._isSSML(A)?this._stripSSML(A):A).split(/\s+/).filter((A=>A.length>0));if(!i.length)return;const e=.3*i.length/i.length;this.timings=[];for(let A=0;A<i.length;A++){const a=A*e,g=(A+1)*e;this.timings.push([a,g,i[A]])}}_fireWordBoundaryCallbacks(){if(this.timings.length)for(const[A,i,e]of this.timings)this.emit("boundary",{text:e,offset:Math.round(1e4*A),duration:Math.round(1e4*(i-A))})}_scheduleWordBoundaryCallbacks(){if(this.timings.length)for(const[A,i,e]of this.timings){const a={text:e,offset:Math.round(1e4*A),duration:Math.round(1e4*(i-A))};setTimeout((()=>{this.emit("boundary",a)}),1e3*A)}}_isSSML(A){return n(A)}_stripSSML(A){return Q(A)}on(A,i){this.callbacks[A]=this.callbacks[A]||[],this.callbacks[A].push(i)}emit(A,...i){for(const e of this.callbacks[A]||[])e(...i)}async startPlaybackWithCallbacks(A,i,e){await this.speak(A,e);for(const[A,e,a]of this.timings)setTimeout((()=>{i(a,A,e)}),1e3*A)}connect(A,i){"onStart"===A?this.on("start",i):"onEnd"===A&&this.on("end",i)}getProperty(A){return this.properties[A]}setProperty(A,i){this.properties[A]=i}constructProsodyTag(A){const i=[];return this.properties.rate&&i.push(`rate="${this.properties.rate}"`),this.properties.pitch&&i.push(`pitch="${this.properties.pitch}"`),this.properties.volume&&i.push(`volume="${this.properties.volume}%"`),0===i.length?A:`<prosody ${i.join(" ")}>${A}</prosody>`}async checkCredentials(){try{return(await this._getVoices()).length>0}catch(A){return console.error("Error checking credentials:",A),!1}}async checkCredentialsDetailed(){try{const A=await this._getVoices();return{success:A.length>0,voiceCount:A.length}}catch(A){return console.error("Error checking credentials:",A),{success:!1,error:A instanceof Error?A.message:String(A)}}}async getCredentialStatus(){const A="undefined"!=typeof window,i=this.constructor.name.replace("TTSClient","").toLowerCase();try{const e=await this.checkCredentials(),a=this.getRequiredCredentials().length>0;let g=[];if(e&&a)try{g=await this._getVoices()}catch(A){console.warn("getCredentialStatus: _getVoices() failed; continuing without voices",A),g=[]}return{valid:e,engine:i,environment:A?"browser":"node",requiresCredentials:a,credentialTypes:this.getRequiredCredentials(),message:e?`${i} credentials are valid and ${g.length} voices are available`:`${i} credentials are invalid or service is unavailable`,details:{voiceCount:g.length,hasCredentials:Object.keys(this.credentials||{}).length>0}}}catch(e){return{valid:!1,engine:i,environment:A?"browser":"node",requiresCredentials:this.getRequiredCredentials().length>0,credentialTypes:this.getRequiredCredentials(),message:`Error validating ${i} credentials`,error:e instanceof Error?e.message:String(e)}}}getRequiredCredentials(){return[]}async getVoicesByLanguage(A){const i=a.normalize(A);return(await this.getVoices()).filter((A=>A.languageCodes.some((A=>A.bcp47===i.bcp47||A.iso639_3===i.iso639_3))))}}function N(A){return A&&A.__esModule&&Object.prototype.hasOwnProperty.call(A,"default")?A.default:A}var v,R,f={},m={},H={},G={},J={};function p(){if(v)return J;v=1,Object.defineProperty(J,"__esModule",{value:!0}),J.FormatterBase=void 0;var A=function(){function A(A){this.options=A,this.options=A}return A.prototype.addArray=function(A,i){for(var e=0,a=A;e<a.length;e++){var g=a[e];this.formatFromAst(g,i)}return i},A.prototype.processAst=function(A,i){A instanceof Array?this.addArray(A,i):this.formatFromAst(A,i)},A}();return J.FormatterBase=A,J}var k,b={},y={};function V(){if(k)return y;k=1;var A,i=y&&y.__extends||(A=function(i,e){return A=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(A,i){A.__proto__=i}||function(A,i){for(var e in i)Object.prototype.hasOwnProperty.call(i,e)&&(A[e]=i[e])},A(i,e)},function(i,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function a(){this.constructor=i}A(i,e),i.prototype=null===e?Object.create(e):(a.prototype=e.prototype,new a)}),e=y&&y.__assign||function(){return e=Object.assign||function(A){for(var i,e=1,a=arguments.length;e<a;e++)for(var g in i=arguments[e])Object.prototype.hasOwnProperty.call(i,g)&&(A[g]=i[g]);return A},e.apply(this,arguments)},a=y&&y.__spreadArray||function(A,i,e){if(e||2===arguments.length)for(var a,g=0,r=i.length;g<r;g++)!a&&g in i||(a||(a=Array.prototype.slice.call(i,0,g)),a[g]=i[g]);return A.concat(a||Array.prototype.slice.call(i))};Object.defineProperty(y,"__esModule",{value:!0}),y.SsmlFormatterBase=y.TagsObject=void 0;var g=p(),r=function(){function A(A){this.base=A,this.tags={},this.text=""}return A.prototype.tag=function(A,i,a){void 0===a&&(a=!1);var g=this.base.ssmlTagSortOrder.indexOf(A);this.tags[A]||(this.tags[A]={sortId:g,attrs:null}),this.tags[A].attrs=a?e(e({},this.tags[A].attrs),i):i},A.prototype.voiceTagNamed=function(A,i){var e=this,a=A&&A[i];if(a){"object"!=typeof a&&(a={voice:{name:i}});var g=["id","displayName","languages","language","locale","isHD"];return Object.keys(a).forEach((function(A){if(!g.includes(A)){var i=a[A];e.tag(A,i)}})),!0}return!1},A.prototype.voiceTag=function(A,i){var e=(i||"").trim(),a=e.toLowerCase(),g=e||"device",r=this.base.sentenceCase(a||g),B=[e];a&&a!==e&&B.push(a),r&&!B.includes(r)&&B.push(r);for(var n=0,C=B;n<C.length;n++){if((c=C[n])&&this.voiceTagNamed(this.base.options&&this.base.options.voices,c))return}var o=[];a&&o.push(a),e&&e!==a&&o.push(e),r&&!o.includes(r)&&o.push(r);for(var Q=0,l=o;Q<l.length;Q++){var c=l[Q];if(this.voiceTagNamed(this.base.validVoices,c))return}var I=this.base.getVoiceTagFallback(r||g);I&&this.tag("voice",I)},A}();y.TagsObject=r;var B=function(A){function e(i){var e=A.call(this,i)||this;return e.options=i,e.validVoices={},e.sectionTags=[],e.modifierKeyMappings={chars:"characters",cardinal:"number",digits:"characters",bleep:"expletive",phone:"telephone",vol:"volume"},e.ssmlTagSortOrder=["emphasis","say-as","prosody","amazon:domain","amazon:effect","amazon:emotion","voice","lang","sub","phoneme"],e.modifierKeyToSsmlTagMappings={emphasis:"emphasis",address:"say-as",number:"say-as",characters:"say-as",expletive:"say-as",fraction:"say-as",interjection:"say-as",ordinal:"say-as",telephone:"say-as",unit:"say-as",time:"say-as",date:"say-as",whisper:null,sub:"sub",ipa:"phoneme",rate:"prosody",pitch:"prosody",volume:"prosody",drc:null,timbre:null,lang:null,voice:null,dj:null,defaults:null,newscaster:null,excited:null,disappointed:null},e}var g;return i(e,A),e.prototype.format=function(A){return this.formatFromAst(A,[]).join("")},e.prototype.addSectionStartTag=function(A,i,e){this.sectionTags=a([],A,!0).reverse();for(var g=0;g<A.length;g++){var r=A[g],B=i.tags[r].attrs;e.push("\n"),e.push(this.startTag(r,B,!1))}},e.prototype.addSectionEndTag=function(A){if(this.sectionTags.length>0)for(var i=0;i<this.sectionTags.length;i++){var e=this.sectionTags[i];A.push(this.endTag(e,!1)),A.push("\n")}},e.prototype.addTag=function(A,i,e,a,g,r){return r.push(this.startTag(A,g,e)),this.processAst(i,r),r.push(this.endTag(A,e)),a&&r.push("\n"),r},e.prototype.applyTagsObject=function(A,i){for(var e=Object.keys(A.tags).sort((function(i,e){return A.tags[e].sortId-A.tags[i].sortId})),a=A.text,g=0,r=e;g<r.length;g++){var B=r[g],n=A.tags[B].attrs;a=this.getTagWithAttrs(a,B,n)}return i.push(a),i},e.prototype.extractParenthesizedText=function(A){return!A||"string"!=typeof A.allText||A.allText.length<2?"":A.allText.substring(1,A.allText.length-1).trim()},e.prototype.getShortIpaObject=function(A,i){var e,a,g=new r(this),B=null===(e=A.children)||void 0===e?void 0:e.find((function(A){return A&&("parenthesized"===A.name||"plainTextModifier"===A.name)})),n=B&&"parenthesized"===B.name?this.extractParenthesizedText(B):(null==B?void 0:B.allText)||"";g.text=n||i||"";var C=null===(a=A.children)||void 0===a?void 0:a.find((function(A){return A&&"shortIpaValue"===A.name})),o=C?C.allText:"";return o&&g.tag("phoneme",{alphabet:"ipa",ph:o}),g},e.prototype.getShortSubObject=function(A){var i,e,a=new r(this),g=null===(i=A.children)||void 0===i?void 0:i.find((function(A){return A&&("parenthesized"===A.name||"plainTextModifier"===A.name)}));a.text=g&&"parenthesized"===g.name?this.extractParenthesizedText(g):(null==g?void 0:g.allText)||"";var B=null===(e=A.children)||void 0===e?void 0:e.find((function(A){return A&&"shortSubValue"===A.name})),n=B?B.allText.trim():"";return n&&a.tag("sub",{alias:n}),a},e.prototype.addSpeakTag=function(A,i,e,a,g){return g.push(this.startTag("speak",a,i)),this.processAst(A,g),this.addSectionEndTag(g),g.push(this.endTag("speak",i)),e&&g.push("\n"),g},e.prototype.addComment=function(A,i){return i.push("\x3c!-- ".concat(A," --\x3e\n")),i},e.prototype.startTag=function(A,i,e){void 0===e&&(e=!1);var a="";return i&&(a=" "+Object.keys(i).map((function(A){return A+'="'+i[A]+'"'})).join(" ")),"<"+A+a+">"+(e?"\n":"")},e.prototype.endTag=function(A,i){return void 0===i&&(i=!1),(i?"\n":"")+"</"+A+">"},e.prototype.voidTag=function(A,i){var e="";return i&&(e=" "+Object.keys(i).map((function(A){return A+'="'+i[A]+'"'})).join(" ")),"<"+A+e+"/>"},e.prototype.addTagWithAttrs=function(A,i,e,a,g){return void 0===g&&(g=!1),i||g?(A.push(this.startTag(e,a)),i&&A.push(i),A.push(this.endTag(e,!1))):A.push(this.voidTag(e,a)),A},e.prototype.getTagWithAttrs=function(A,i,e){var a=[];return A?(a.push(this.startTag(i,e)),a.push(A),a.push(this.endTag(i,!1))):a.push(this.voidTag(i,e)),a.join("")},e.prototype.sentenceCase=function(A){return A.replace(/[a-z]/i,(function(A){return A.toUpperCase()})).trim()},e.prototype.escapeXmlCharacters=function(A){var i="".concat(Object.keys(e.XML_UNESCAPE_MAPPING).join("|"),"]"),a=A.replace(new RegExp(i,"g"),(function(A){return e.XML_UNESCAPE_MAPPING[A]})),g="[".concat(Object.keys(e.XML_ESCAPE_MAPPING).join(""),"]");return a.replace(new RegExp(g,"g"),(function(A){return e.XML_ESCAPE_MAPPING[A]}))},e.prototype.getVoiceTagFallback=function(A){return null},e.XML_ESCAPE_MAPPING={"<":"<",">":">","&":"&",'"':""","'":"'"},e.XML_UNESCAPE_MAPPING=(g=e.XML_ESCAPE_MAPPING,Object.keys(g).reduce((function(A,i){return A[g[i]]=i,A}),{})),e}(g.FormatterBase);return y.SsmlFormatterBase=B,y}var Y,P,T={};function S(){return Y||(Y=1,Object.defineProperty(T,"__esModule",{value:!0}),T.AMAZON_POLLY_GENERATIVE_VOICES=T.AMAZON_POLLY_NEURAL_VOICES=T.AMAZON_POLLY_STANDARD_VOICES=T.AMAZON_POLLY_ALL_VOICES=void 0,T.AMAZON_POLLY_ALL_VOICES=((A={}).aditi={voice:{name:"Aditi"},id:"Aditi",displayName:"Aditi",languages:["en-IN","hi-IN"]},A.adriano={voice:{name:"Adriano"},id:"Adriano",displayName:"Adriano",languages:["it-IT"]},A.alba={voice:{name:"Alba"},id:"Alba",displayName:"Alba",languages:["es-ES"]},A.amy={voice:{name:"Amy"},id:"Amy",displayName:"Amy",languages:["en-GB"]},A.andres={voice:{name:"Andres"},id:"Andres",displayName:"Andrés",languages:["es-MX"]},A.aria={voice:{name:"Aria"},id:"Aria",displayName:"Aria",languages:["en-NZ"]},A.arlet={voice:{name:"Arlet"},id:"Arlet",displayName:"Arlet",languages:["ca-ES"]},A.arthur={voice:{name:"Arthur"},id:"Arthur",displayName:"Arthur",languages:["en-GB"]},A.astrid={voice:{name:"Astrid"},id:"Astrid",displayName:"Astrid",languages:["sv-SE"]},A.ayanda={voice:{name:"Ayanda"},id:"Ayanda",displayName:"Ayanda",languages:["en-ZA"]},A.bianca={voice:{name:"Bianca"},id:"Bianca",displayName:"Bianca",languages:["it-IT"]},A.brian={voice:{name:"Brian"},id:"Brian",displayName:"Brian",languages:["en-GB"]},A.burcu={voice:{name:"Burcu"},id:"Burcu",displayName:"Burcu",languages:["tr-TR"]},A.camila={voice:{name:"Camila"},id:"Camila",displayName:"Camila",languages:["pt-BR"]},A.carla={voice:{name:"Carla"},id:"Carla",displayName:"Carla",languages:["it-IT"]},A.carmen={voice:{name:"Carmen"},id:"Carmen",displayName:"Carmen",languages:["ro-RO"]},A.celine={voice:{name:"Celine"},id:"Celine",displayName:"Céline",languages:["fr-FR"]},A.chantal={voice:{name:"Chantal"},id:"Chantal",displayName:"Chantal",languages:["fr-CA"]},A.conchita={voice:{name:"Conchita"},id:"Conchita",displayName:"Conchita",languages:["es-ES"]},A.cristiano={voice:{name:"Cristiano"},id:"Cristiano",displayName:"Cristiano",languages:["pt-PT"]},A.daniel={voice:{name:"Daniel"},id:"Daniel",displayName:"Daniel",languages:["de-DE"]},A.danielle={voice:{name:"Danielle"},id:"Danielle",displayName:"Danielle",languages:["en-US"]},A.dora={voice:{name:"Dora"},id:"Dora",displayName:"Dóra",languages:["is-IS"]},A.elin={voice:{name:"Elin"},id:"Elin",displayName:"Elin",languages:["sv-SE"]},A.emma={voice:{name:"Emma"},id:"Emma",displayName:"Emma",languages:["en-GB"]},A.enrique={voice:{name:"Enrique"},id:"Enrique",displayName:"Enrique",languages:["es-ES"]},A.ewa={voice:{name:"Ewa"},id:"Ewa",displayName:"Ewa",languages:["pl-PL"]},A.filiz={voice:{name:"Filiz"},id:"Filiz",displayName:"Filiz",languages:["tr-TR"]},A.gabrielle={voice:{name:"Gabrielle"},id:"Gabrielle",displayName:"Gabrielle",languages:["fr-CA"]},A.geraint={voice:{name:"Geraint"},id:"Geraint",displayName:"Geraint",languages:["en-GB-WLS"]},A.giorgio={voice:{name:"Giorgio"},id:"Giorgio",displayName:"Giorgio",languages:["it-IT"]},A.gregory={voice:{name:"Gregory"},id:"Gregory",displayName:"Gregory",languages:["en-US"]},A.gwyneth={voice:{name:"Gwyneth"},id:"Gwyneth",displayName:"Gwyneth",languages:["cy-GB"]},A.hala={voice:{name:"Hala"},id:"Hala",displayName:"Hala",languages:["ar-AE","arb"]},A.hannah={voice:{name:"Hannah"},id:"Hannah",displayName:"Hannah",languages:["de-AT"]},A.hans={voice:{name:"Hans"},id:"Hans",displayName:"Hans",languages:["de-DE"]},A.hiujin={voice:{name:"Hiujin"},id:"Hiujin",displayName:"Hiujin",languages:["yue-CN"]},A.ida={voice:{name:"Ida"},id:"Ida",displayName:"Ida",languages:["nb-NO"]},A.ines={voice:{name:"Ines"},id:"Ines",displayName:"Inês",languages:["pt-PT"]},A.isabelle={voice:{name:"Isabelle"},id:"Isabelle",displayName:"Isabelle",languages:["fr-BE"]},A.ivy={voice:{name:"Ivy"},id:"Ivy",displayName:"Ivy",languages:["en-US"]},A.jacek={voice:{name:"Jacek"},id:"Jacek",displayName:"Jacek",languages:["pl-PL"]},A.jan={voice:{name:"Jan"},id:"Jan",displayName:"Jan",languages:["pl-PL"]},A.jasmine={voice:{name:"Jasmine"},id:"Jasmine",displayName:"Jasmine",languages:["en-SG"]},A.jihye={voice:{name:"Jihye"},id:"Jihye",displayName:"Jihye",languages:["ko-KR"]},A.jitka={voice:{name:"Jitka"},id:"Jitka",displayName:"Jitka",languages:["cs-CZ"]},A.joanna={voice:{name:"Joanna"},id:"Joanna",displayName:"Joanna",languages:["en-US"]},A.joey={voice:{name:"Joey"},id:"Joey",displayName:"Joey",languages:["en-US"]},A.justin={voice:{name:"Justin"},id:"Justin",displayName:"Justin",languages:["en-US"]},A.kajal={voice:{name:"Kajal"},id:"Kajal",displayName:"Kajal",languages:["en-IN","hi-IN"]},A.karl={voice:{name:"Karl"},id:"Karl",displayName:"Karl",languages:["is-IS"]},A.kazuha={voice:{name:"Kazuha"},id:"Kazuha",displayName:"Kazuha",languages:["ja-JP"]},A.kendra={voice:{name:"Kendra"},id:"Kendra",displayName:"Kendra",languages:["en-US"]},A.kevin={voice:{name:"Kevin"},id:"Kevin",displayName:"Kevin",languages:["en-US"]},A.kimberly={voice:{name:"Kimberly"},id:"Kimberly",displayName:"Kimberly",languages:["en-US"]},A.laura={voice:{name:"Laura"},id:"Laura",displayName:"Laura",languages:["nl-NL"]},A.lea={voice:{name:"Lea"},id:"Lea",displayName:"Léa",languages:["fr-FR"]},A.liam={voice:{name:"Liam"},id:"Liam",displayName:"Liam",languages:["fr-CA"]},A.lisa={voice:{name:"Lisa"},id:"Lisa",displayName:"Lisa",languages:["nl-BE"]},A.liv={voice:{name:"Liv"},id:"Liv",displayName:"Liv",languages:["nb-NO"]},A.lotte={voice:{name:"Lotte"},id:"Lotte",displayName:"Lotte",languages:["nl-NL"]},A.lucia={voice:{name:"Lucia"},id:"Lucia",displayName:"Lucia",languages:["es-ES"]},A.lupe={voice:{name:"Lupe"},id:"Lupe",displayName:"Lupe",languages:["es-US"]},A.mads={voice:{name:"Mads"},id:"Mads",displayName:"Mads",languages:["da-DK"]},A.maja={voice:{name:"Maja"},id:"Maja",displayName:"Maja",languages:["pl-PL"]},A.marlene={voice:{name:"Marlene"},id:"Marlene",displayName:"Marlene",languages:["de-DE"]},A.mathieu={voice:{name:"Mathieu"},id:"Mathieu",displayName:"Mathieu",languages:["fr-FR"]},A.matthew={voice:{name:"Matthew"},id:"Matthew",displayName:"Matthew",languages:["en-US"]},A.maxim={voice:{name:"Maxim"},id:"Maxim",displayName:"Maxim",languages:["ru-RU"]},A.mia={voice:{name:"Mia"},id:"Mia",displayName:"Mia",languages:["es-MX"]},A.miguel={voice:{name:"Miguel"},id:"Miguel",displayName:"Miguel",languages:["es-US"]},A.mizuki={voice:{name:"Mizuki"},id:"Mizuki",displayName:"Mizuki",languages:["ja-JP"]},A.naja={voice:{name:"Naja"},id:"Naja",displayName:"Naja",languages:["da-DK"]},A.niamh={voice:{name:"Niamh"},id:"Niamh",displayName:"Niamh",languages:["en-IE"]},A.nicole={voice:{name:"Nicole"},id:"Nicole",displayName:"Nicole",languages:["en-AU"]},A.ola={voice:{name:"Ola"},id:"Ola",displayName:"Ola",languages:["pl-PL"]},A.olivia={voice:{name:"Olivia"},id:"Olivia",displayName:"Olivia",languages:["en-AU"]},A.patrick={voice:{name:"Patrick"},id:"Patrick",displayName:"Patrick",languages:["en-US"]},A.pedro={voice:{name:"Pedro"},id:"Pedro",displayName:"Pedro",languages:["es-US"]},A.penelope={voice:{name:"Penelope"},id:"Penelope",displayName:"Penélope",languages:["es-US"]},A.raul={voice:{name:"Raul"},id:"Raul",displayName:"Raul",languages:["es-ES"]},A.raveena={voice:{name:"Raveena"},id:"Raveena",displayName:"Raveena",languages:["en-IN"]},A.remi={voice:{name:"Remi"},id:"Remi",displayName:"Rémi",languages:["fr-FR"]},A.ricardo={voice:{name:"Ricardo"},id:"Ricardo",displayName:"Ricardo",languages:["pt-BR"]},A.ruben={voice:{name:"Ruben"},id:"Ruben",displayName:"Ruben",languages:["nl-NL"]},A.russell={voice:{name:"Russell"},id:"Russell",displayName:"Russell",languages:["en-AU"]},A.ruth={voice:{name:"Ruth"},id:"Ruth",displayName:"Ruth",languages:["en-US"]},A.sabrina={voice:{name:"Sabrina"},id:"Sabrina",displayName:"Sabrina",languages:["de-CH"]},A.salli={voice:{name:"Salli"},id:"Salli",displayName:"Salli",languages:["en-US"]},A.seoyeon={voice:{name:"Seoyeon"},id:"Seoyeon",displayName:"Seoyeon",languages:["ko-KR"]},A.sergio={voice:{name:"Sergio"},id:"Sergio",displayName:"Sergio",languages:["es-ES"]},A.sofie={voice:{name:"Sofie"},id:"Sofie",displayName:"Sofie",languages:["da-DK"]},A.stephen={voice:{name:"Stephen"},id:"Stephen",displayName:"Stephen",languages:["en-US"]},A.suvi={voice:{name:"Suvi"},id:"Suvi",displayName:"Suvi",languages:["fi-FI"]},A.takumi={voice:{name:"Takumi"},id:"Takumi",displayName:"Takumi",languages:["ja-JP"]},A.tatyana={voice:{name:"Tatyana"},id:"Tatyana",displayName:"Tatyana",languages:["ru-RU"]},A.thiago={voice:{name:"Thiago"},id:"Thiago",displayName:"Thiago",languages:["pt-BR"]},A.tomoko={voice:{name:"Tomoko"},id:"Tomoko",displayName:"Tomoko",languages:["ja-JP"]},A.vicki={voice:{name:"Vicki"},id:"Vicki",displayName:"Vicki",languages:["de-DE"]},A.vitoria={voice:{name:"Vitoria"},id:"Vitoria",displayName:"Vitória",languages:["pt-BR"]},A.zayd={voice:{name:"Zayd"},id:"Zayd",displayName:"Zayd",languages:["ar-AE","arb"]},A.zeina={voice:{name:"Zeina"},id:"Zeina",displayName:"Zeina",languages:["arb"]},A.zhiyu={voice:{name:"Zhiyu"},id:"Zhiyu",displayName:"Zhiyu",languages:["cmn-CN"]},A),T.AMAZON_POLLY_STANDARD_VOICES=((i={}).aditi={voice:{name:"Aditi"},id:"Aditi",displayName:"Aditi",languages:["en-IN","hi-IN"]},i.amy={voice:{name:"Amy"},id:"Amy",displayName:"Amy",languages:["en-GB"]},i.astrid={voice:{name:"Astrid"},id:"Astrid",displayName:"Astrid",languages:["sv-SE"]},i.bianca={voice:{name:"Bianca"},id:"Bianca",displayName:"Bianca",languages:["it-IT"]},i.brian={voice:{name:"Brian"},id:"Brian",displayName:"Brian",languages:["en-GB"]},i.camila={voice:{name:"Camila"},id:"Camila",displayName:"Camila",languages:["pt-BR"]},i.carla={voice:{name:"Carla"},id:"Carla",displayName:"Carla",languages:["it-IT"]},i.carmen={voice:{name:"Carmen"},id:"Carmen",displayName:"Carmen",languages:["ro-RO"]},i.celine={voice:{name:"Celine"},id:"Celine",displayName:"Céline",languages:["fr-FR"]},i.chantal={voice:{name:"Chantal"},id:"Chantal",displayName:"Chantal",languages:["fr-CA"]},i.conchita={voice:{name:"Conchita"},id:"Conchita",displayName:"Conchita",languages:["es-ES"]},i.cristiano={voice:{name:"Cristiano"},id:"Cristiano",displayName:"Cristiano",languages:["pt-PT"]},i.dora={voice:{name:"Dora"},id:"Dora",displayName:"Dóra",languages:["is-IS"]},i.emma={voice:{name:"Emma"},id:"Emma",displayName:"Emma",languages:["en-GB"]},i.enrique={voice:{name:"Enrique"},id:"Enrique",displayName:"Enrique",languages:["es-ES"]},i.ewa={voice:{name:"Ewa"},id:"Ewa",displayName:"Ewa",languages:["pl-PL"]},i.filiz={voice:{name:"Filiz"},id:"Filiz",displayName:"Filiz",languages:["tr-TR"]},i.geraint={voice:{name:"Geraint"},id:"Geraint",displayName:"Geraint",languages:["en-GB-WLS"]},i.giorgio={voice:{name:"Giorgio"},id:"Giorgio",displayName:"Giorgio",languages:["it-IT"]},i.gwyneth={voice:{name:"Gwyneth"},id:"Gwyneth",displayName:"Gwyneth",languages:["cy-GB"]},i.hans={voice:{name:"Hans"},id:"Hans",displayName:"Hans",languages:["de-DE"]},i.ines={voice:{name:"Ines"},id:"Ines",displayName:"Inês",languages:["pt-PT"]},i.ivy={voice:{name:"Ivy"},id:"Ivy",displayName:"Ivy",languages:["en-US"]},i.jacek={voice:{name:"Jacek"},id:"Jacek",displayName:"Jacek",languages:["pl-PL"]},i.jan={voice:{name:"Jan"},id:"Jan",displayName:"Jan",languages:["pl-PL"]},i.joanna={voice:{name:"Joanna"},id:"Joanna",displayName:"Joanna",languages:["en-US"]},i.joey={voice:{name:"Joey"},id:"Joey",displayName:"Joey",languages:["en-US"]},i.justin={voice:{name:"Justin"},id:"Justin",displayName:"Justin",languages:["en-US"]},i.karl={voice:{name:"Karl"},id:"Karl",displayName:"Karl",languages:["is-IS"]},i.kendra={voice:{name:"Kendra"},id:"Kendra",displayName:"Kendra",languages:["en-US"]},i.kimberly={voice:{name:"Kimberly"},id:"Kimberly",displayName:"Kimberly",languages:["en-US"]},i.lea={voice:{name:"Lea"},id:"Lea",displayName:"Léa",languages:["fr-FR"]},i.liv={voice:{name:"Liv"},id:"Liv",displayName:"Liv",languages:["nb-NO"]},i.lotte={voice:{name:"Lotte"},id:"Lotte",displayName:"Lotte",languages:["nl-NL"]},i.lucia={voice:{name:"Lucia"},id:"Lucia",displayName:"Lucia",languages:["es-ES"]},i.lupe={voice:{name:"Lupe"},id:"Lupe",displayName:"Lupe",languages:["es-US"]},i.mads={voice:{name:"Mads"},id:"Mads",displayName:"Mads",languages:["da-DK"]},i.maja={voice:{name:"Maja"},id:"Maja",displayName:"Maja",languages:["pl-PL"]},i.marlene={voice:{name:"Marlene"},id:"Marlene",displayName:"Marlene",languages:["de-DE"]},i.mathieu={voice:{name:"Mathieu"},id:"Mathieu",displayName:"Mathieu",languages:["fr-FR"]},i.matthew={voice:{name:"Matthew"},id:"Matthew",displayName:"Matthew",languages:["en-US"]},i.maxim={voice:{name:"Maxim"},id:"Maxim",displayName:"Maxim",languages:["ru-RU"]},i.mia={voice:{name:"Mia"},id:"Mia",displayName:"Mia",languages:["es-MX"]},i.miguel={voice:{name:"Miguel"},id:"Miguel",displayName:"Miguel",languages:["es-US"]},i.mizuki={voice:{name:"Mizuki"},id:"Mizuki",displayName:"Mizuki",languages:["ja-JP"]},i.naja={voice:{name:"Naja"},id:"Naja",displayName:"Naja",languages:["da-DK"]},i.nicole={voice:{name:"Nicole"},id:"Nicole",displayName:"Nicole",languages:["en-AU"]},i.penelope={voice:{name:"Penelope"},id:"Penelope",displayName:"Penélope",languages:["es-US"]},i.raveena={voice:{name:"Raveena"},id:"Raveena",displayName:"Raveena",languages:["en-IN"]},i.ricardo={voice:{name:"Ricardo"},id:"Ricardo",displayName:"Ricardo",languages:["pt-BR"]},i.ruben={voice:{name:"Ruben"},id:"Ruben",displayName:"Ruben",languages:["nl-NL"]},i.russell={voice:{name:"Russell"},id:"Russell",displayName:"Russell",languages:["en-AU"]},i.salli={voice:{name:"Salli"},id:"Salli",displayName:"Salli",languages:["en-US"]},i.seoyeon={voice:{name:"Seoyeon"},id:"Seoyeon",displayName:"Seoyeon",languages:["ko-KR"]},i.takumi={voice:{name:"Takumi"},id:"Takumi",displayName:"Takumi",languages:["ja-JP"]},i.tatyana={voice:{name:"Tatyana"},id:"Tatyana",displayName:"Tatyana",languages:["ru-RU"]},i.vicki={voice:{name:"Vicki"},id:"Vicki",displayName:"Vicki",languages:["de-DE"]},i.vitoria={voice:{name:"Vitoria"},id:"Vitoria",displayName:"Vitória",languages:["pt-BR"]},i.zeina={voice:{name:"Zeina"},id:"Zeina",displayName:"Zeina",languages:["arb"]},i.zhiyu={voice:{name:"Zhiyu"},id:"Zhiyu",displayName:"Zhiyu",languages:["cmn-CN"]},i),T.AMAZON_POLLY_NEURAL_VOICES=((e={}).adriano={voice:{name:"Adriano"},id:"Adriano",displayName:"Adriano",languages:["it-IT"]},e.amy={voice:{name:"Amy"},id:"Amy",displayName:"Amy",languages:["en-GB"]},e.andres={voice:{name:"Andres"},id:"Andres",displayName:"Andrés",languages:["es-MX"]},e.aria={voice:{name:"Aria"},id:"Aria",displayName:"Aria",languages:["en-NZ"]},e.arlet={voice:{name:"Arlet"},id:"Arlet",displayName:"Arlet",languages:["ca-ES"]},e.arthur={voice:{name:"Arthur"},id:"Arthur",displayName:"Arthur",languages:["en-GB"]},e.ayanda={voice:{name:"Ayanda"},id:"Ayanda",displayName:"Ayanda",languages:["en-ZA"]},e.bianca={voice:{name:"Bianca"},id:"Bianca",displayName:"Bianca",languages:["it-IT"]},e.brian={voice:{name:"Brian"},id:"Brian",displayName:"Brian",languages:["en-GB"]},e.burcu={voice:{name:"Burcu"},id:"Burcu",displayName:"Burcu",languages:["tr-TR"]},e.camila={voice:{name:"Camila"},id:"Camila",displayName:"Camila",languages:["pt-BR"]},e.daniel={voice:{name:"Daniel"},id:"Daniel",displayName:"Daniel",languages:["de-DE"]},e.danielle={voice:{name:"Danielle"},id:"Danielle",displayName:"Danielle",languages:["en-US"]},e.elin={voice:{name:"Elin"},id:"Elin",displayName:"Elin",languages:["sv-SE"]},e.emma={voice:{name:"Emma"},id:"Emma",displayName:"Emma",languages:["en-GB"]},e.gabrielle={voice:{name:"Gabrielle"},id:"Gabrielle",displayName:"Gabrielle",languages:["fr-CA"]},e.gregory={voice:{name:"Gregory"},id:"Gregory",displayName:"Gregory",languages:["en-US"]},e.hala={voice:{name:"Hala"},id:"Hala",displayName:"Hala",languages:["ar-AE","arb"]},e.hannah={voice:{name:"Hannah"},id:"Hannah",displayName:"Hannah",languages:["de-AT"]},e.hiujin={voice:{name:"Hiujin"},id:"Hiujin",displayName:"Hiujin",languages:["yue-CN"]},e.ida={voice:{name:"Ida"},id:"Ida",displayName:"Ida",languages:["nb-NO"]},e.ines={voice:{name:"Ines"},id:"Ines",displayName:"Inês",languages:["pt-PT"]},e.isabelle={voice:{name:"Isabelle"},id:"Isabelle",displayName:"Isabelle",languages:["fr-BE"]},e.ivy={voice:{name:"Ivy"},id:"Ivy",displayName:"Ivy",languages:["en-US"]},e.jasmine={voice:{name:"Jasmine"},id:"Jasmine",displayName:"Jasmine",languages:["en-SG"]},e.jihye={voice:{name:"Jihye"},id:"Jihye",displayName:"Jihye",languages:["ko-KR"]},e.jitka={voice:{name:"Jitka"},id:"Jitka",displayName:"Jitka",languages:["cs-CZ"]},e.joanna={voice:{name:"Joanna"},id:"Joanna",displayName:"Joanna",languages:["en-US"]},e.joey={voice:{name:"Joey"},id:"Joey",displayName:"Joey",languages:["en-US"]},e.justin={voice:{name:"Justin"},id:"Justin",displayName:"Justin",languages:["en-US"]},e.kajal={voice:{name:"Kajal"},id:"Kajal",displayName:"Kajal",languages:["en-IN","hi-IN"]},e.kazuha={voice:{name:"Kazuha"},id:"Kazuha",displayName:"Kazuha",languages:["ja-JP"]},e.kendra={voice:{name:"Kendra"},id:"Kendra",displayName:"Kendra",languages:["en-US"]},e.kevin={voice:{name:"Kevin"},id:"Kevin",displayName:"Kevin",languages:["en-US"]},e.kimberly={voice:{name:"Kimberly"},id:"Kimberly",displayName:"Kimberly",languages:["en-US"]},e.laura={voice:{name:"Laura"},id:"Laura",displayName:"Laura",languages:["nl-NL"]},e.lea={voice:{name:"Lea"},id:"Lea",displayName:"Léa",languages:["fr-FR"]},e.liam={voice:{name:"Liam"},id:"Liam",displayName:"Liam",languages:["fr-CA"]},e.lisa={voice:{name:"Lisa"},id:"Lisa",displayName:"Lisa",languages:["nl-BE"]},e.lucia={voice:{name:"Lucia"},id:"Lucia",displayName:"Lucia",languages:["es-ES"]},e.lupe={voice:{name:"Lupe"},id:"Lupe",displayName:"Lupe",languages:["es-US"]},e.matthew={voice:{name:"Matthew"},id:"Matthew",displayName:"Matthew",languages:["en-US"]},e.mia={voice:{name:"Mia"},id:"Mia",displayName:"Mia",languages:["es-MX"]},e.niamh={voice:{name:"Niamh"},id:"Niamh",displayName:"Niamh",languages:["en-IE"]},e.ola={voice:{name:"Ola"},id:"Ola",displayName:"Ola",languages:["pl-PL"]},e.olivia={voice:{name:"Olivia"},id:"Olivia",displayName:"Olivia",languages:["en-AU"]},e.pedro={voice:{name:"Pedro"},id:"Pedro",displayName:"Pedro",languages:["es-US"]},e.remi={voice:{name:"Remi"},id:"Remi",displayName:"Rémi",languages:["fr-FR"]},e.ruth={voice:{name:"Ruth"},id:"Ruth",displayName:"Ruth",languages:["en-US"]},e.sabrina={voice:{name:"Sabrina"},id:"Sabrina",displayName:"Sabrina",languages:["de-CH"]},e.salli={voice:{name:"Salli"},id:"Salli",displayName:"Salli",languages:["en-US"]},e.seoyeon={voice:{name:"Seoyeon"},id:"Seoyeon",displayName:"Seoyeon",languages:["ko-KR