@ysolve/ocity-heritage-visualizer 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +308 -0
  3. package/dist/mespeak-core.js +140 -0
  4. package/dist/mespeak.js +167 -0
  5. package/dist/mespeak__standard_config.json +7 -0
  6. package/dist/ocity-heritage-visualizer.css +1 -0
  7. package/dist/ocity-heritage-visualizer.es.js +2455 -0
  8. package/dist/ocity-heritage-visualizer.es.js.map +1 -0
  9. package/dist/ocity-heritage-visualizer.umd.js +7 -0
  10. package/dist/ocity-heritage-visualizer.umd.js.map +1 -0
  11. package/dist/vite.svg +1 -0
  12. package/dist/voices/ca.json +6 -0
  13. package/dist/voices/cs.json +6 -0
  14. package/dist/voices/de.json +6 -0
  15. package/dist/voices/el.json +6 -0
  16. package/dist/voices/en/en-n.json +6 -0
  17. package/dist/voices/en/en-rp.json +6 -0
  18. package/dist/voices/en/en-sc.json +6 -0
  19. package/dist/voices/en/en-us.json +6 -0
  20. package/dist/voices/en/en-wm.json +6 -0
  21. package/dist/voices/en/en.json +6 -0
  22. package/dist/voices/eo.json +6 -0
  23. package/dist/voices/es-la.json +6 -0
  24. package/dist/voices/es.json +6 -0
  25. package/dist/voices/fi.json +6 -0
  26. package/dist/voices/fr.json +6 -0
  27. package/dist/voices/hu.json +6 -0
  28. package/dist/voices/it.json +6 -0
  29. package/dist/voices/kn.json +6 -0
  30. package/dist/voices/la.json +6 -0
  31. package/dist/voices/lv.json +6 -0
  32. package/dist/voices/nl.json +6 -0
  33. package/dist/voices/pl.json +6 -0
  34. package/dist/voices/pt-pt.json +6 -0
  35. package/dist/voices/pt.json +6 -0
  36. package/dist/voices/ro.json +6 -0
  37. package/dist/voices/sk.json +6 -0
  38. package/dist/voices/sv.json +6 -0
  39. package/dist/voices/tr.json +6 -0
  40. package/dist/voices/zh-yue.json +6 -0
  41. package/dist/voices/zh.json +6 -0
  42. package/package.json +86 -0
@@ -0,0 +1,167 @@
1
+ /*
2
+ meSpeak-front v.2.0.7
3
+ based on speak.js, https://github.com/kripken/speak.js
4
+ eSpeak and other code here are under the GNU GPL.
5
+ meSpeak (Modular eSpeak) is a mod of 'speak.js' by N.Landsteiner (2011-2020), www.masswerk.at
6
+ official project page: https://www.masswerk.at/mespeak
7
+ */
8
+ var meSpeak=(function(){"use strict";var coreName='mespeak-core.js',eSpeakDir='/espeak',unloading=false,speakQueue=[],deferredLoaders=[],voicesLoaded={},workerCallbacks={},defaultVoice='',AudioAPI=null,canPlay=false,playbackVolume=1,audioPool={},webSoundPool={},audioContext=null,masterOutput=null,masterGain=null,audioAnalyser=null,wsUseTimeout=false,wsStartFromCallback=false,isMobile=(typeof navigator!=='undefined'&&navigator.userAgent&&(/(Mobile|iPhone|iPad|iPod|Android|iOS)/i).test(navigator.userAgent)),isSafari=(typeof navigator!=='undefined'&&navigator.userAgent&&(/Safari/).test(navigator.userAgent)),hasWorker=(!isMobile&&typeof window!=='undefined'&&typeof window.Worker!=='undefined'),audioUnlocked=false,coreReady=false,baseUrl,worker;if(typeof navigator!=='undefined'&&navigator.userAgent){if(navigator.userAgent.indexOf('Chrome')!==-1){if(parseInt(navigator.userAgent.replace(/^.*?\bChrome\/([0-9]+).*$/,'$1'),10)>=32){wsUseTimeout=wsStartFromCallback=true;}}
9
+ else if(navigator.userAgent.match(/\bVersion\/[0-9]+\.[0-9\.]+ (Mobile\/\w+ )?Safari\//)){if(parseInt(navigator.userAgent.replace(/^.*?\bVersion\/([0-9]+).*$/,'$1'),10)>=9){wsStartFromCallback=true;}}}
10
+ function loadCore(){if(!baseUrl){if(document.currentScript){baseUrl=document.currentScript.src.replace(/[^\/]+$/,'');}
11
+ else{var scripts=document.getElementsByTagName('script');baseUrl=scripts[scripts.length-1].src.replace(/[^\/]+$/,'');}}
12
+ if(baseUrl){if(hasWorker){worker=new Worker(baseUrl+coreName);worker.onmessage=coreReceiver;}
13
+ else{var nodes=document.getElementsByTagName('head');if(!nodes||!nodes.length)nodes=document.getElementsByTagName('head');if(nodes&&nodes.length){var script=document.createElement('script');script.src=baseUrl+coreName;script.onload=coreLoaded;nodes[0].appendChild(script);}}
14
+ return true;}
15
+ else{if(self.console)console.error('MeSpeak: Failed to determine current script path.');return false;}}
16
+ function coreReceiver(event){var msgType=event.data.rsp,jobId=event.data.jobId;switch(msgType){case'ready':try{var t=new ArrayBuffer(1);worker.postMessage({'job':'test','jobId':0,'test':t},[t]);if(!t.byteLength)worker.postMessage({'job':'useTransferables','jobId':0,'args':true});}
17
+ catch(e){}
18
+ coreLoaded();break;case'configLoaded':if(workerCallbacks[jobId])workerCallbacks[jobId](event.data.success,event.data.message);break;case'voiceLoaded':if(workerCallbacks[jobId])workerCallbacks[jobId](event.data.success,event.data.message);break;case'wav':if(workerCallbacks[jobId])workerCallbacks[jobId](event.data.audiodata);break;}
19
+ if(workerCallbacks[jobId])delete workerCallbacks[jobId];}
20
+ function sendWorkerJob(obj,jobId,callback){if(typeof callback==='function'){if(!jobId)jobId=getJobId();workerCallbacks[String(jobId)]=callback;}
21
+ else{jobId=0;}
22
+ if(typeof obj.jobId==='undefined')obj.jobId=String(jobId);worker.postMessage(obj);}
23
+ function coreLoaded(){coreReady=true;for(var i=0,l=deferredLoaders.length;i<l;i++){var loader=deferredLoaders[i];loader.job.apply(null,loader.args);}
24
+ deferredLoaders.length=0;}
25
+ function executeQueuedCalls(){if(defaultVoice){for(var i=0,l=speakQueue.length;i<l;i++){var args=speakQueue[i];if(args[4]){speakMultipart(args[0],args[1],args[2],args[3]);}
26
+ else{speak(args[0],args[1],args[2],args[3]);}}
27
+ speakQueue.length=0;}}
28
+ function resetQueue(){speakQueue.length=0;}
29
+ function speak(text,args,callback,id){if(typeof args!=='object'||!args)args={};if(!canPlay&&!args.rawdata){if(self.console)console.warn('meSpeak: Can\'t play; No audio support.');return 0;}
30
+ if(!id)id=getJobId();if(!coreReady||!defaultVoice){if(self.console)console.log('No voice module loaded, deferring call.');if(args.rawdata){return id;}
31
+ else{speakQueue.push([text,args,callback,id,false]);return id;}}
32
+ if(args&&args.voice&&!voicesLoaded[args.voice]){if(self.console)console.log('Voice '+args.voice+' not available. Using default voice: '+defaultVoice);args.voice=defaultVoice;}
33
+ var varg=(args.voice)?String(args.voice):(args.v)?String(args.v):defaultVoice;if(varg.indexOf('mb/mb-')==0)varg=varg.substring(3);if(args.variant)varg+='+'+String(args.variant).replace(/\+/g,'');var argstack=['-w','wav.wav','-a',(typeof args.amplitude!=='undefined')?String(args.amplitude):(typeof args.a!=='undefined')?String(args.a):'100','-g',(typeof args.wordgap!=='undefined')?String(args.wordgap):(typeof args.g!=='undefined')?String(args.g):'0','-p',(typeof args.pitch!=='undefined')?String(args.pitch):(typeof args.p!=='undefined')?String(args.p):'50','-s',(typeof args.speed!=='undefined')?String(args.speed):(typeof args.s!=='undefined')?String(args.s):'175','-b',args.utf16?'4':(typeof args.b!=='undefined')?String(args.b):'1','-v',varg];var a=args.linebreak||args.l;if(a)argstack.push('-l',String(a));a=args.capitals||args.k;if(a)argstack.push('-k',String(a));a=args.nostop||args.z;if(a)argstack.push('-z');if(typeof args.punct!=='undefined'){if(typeof args.punct==='string'){if(args.punct.length){argstack.push('--punct="'+String(args.punct).replace(/([\\"'])/g,'\\$1')+'"');}
34
+ else{argstack.push('--punct');}}
35
+ else if(args.punct){argstack.push('--punct');}}
36
+ a=args.ssml||args.m||args.markup;if(a)argstack.push('-m');argstack.push('--path='+eSpeakDir,String(text));if(args.log&&self.console)console.log('executing espeak '+argstack.join(' '));if(typeof callback!=='function')callback=null;if(!callback&&typeof args.callback=='function')callback=args.callback;if(!args.rawdata&&AudioAPI){if(!audioContext)audioContext=new AudioAPI();if(audioContext.state==='suspended')audioContext.resume();}
37
+ if(hasWorker){sendWorkerJob({'job':'speak','args':argstack},id,function(stream){resolveUtterance(stream,id,args.rawdata,args.volume,args.pan||0,callback);});}
38
+ else{resolveUtterance(meSpeakCore.speak(argstack),id,args.rawdata,args.volume,args.pan||0,callback);}
39
+ return id;}
40
+ function resolveUtterance(stream,id,rawdata,volume,pan,callback){if(stream){if(rawdata){if(callback)callback(true,id,exportStream(stream,rawdata));}
41
+ else{playSound(stream,volume,callback,id,pan);}}
42
+ else if(callback){callback(false,id);}}
43
+ function exportStream(stream,format){switch(String(format).toLowerCase()){case'array':return Array.from?Array.from(new Uint8Array(stream)):Array.prototype.slice.call(new Uint8Array(stream));case'base64':return encode64(stream);case'data-url':case'data-uri':case'dataurl':case'datauri':case'mime':return'data:audio/x-wav;base64,'+encode64(new Uint8Array(stream));default:return stream;}}
44
+ function encode64(data){var BASE='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',PAD='=',ret='',leftchar=0,leftbits=0,l=Object.prototype.toString.call(data)==='[object Array]'?data.length:data.byteLength;for(var i=0;i<l;i++){leftchar=(leftchar<<8)|data[i];leftbits+=8;while(leftbits>=6){var curr=(leftchar>>(leftbits-6))&0x3f;leftbits-=6;ret+=BASE[curr];}}
45
+ if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD;}else if(leftbits==4){ret+=BASE[(leftchar&0xf)<<2];ret+=PAD;}
46
+ return ret;}
47
+ function speakMultipart(parts,args,callback,id){if(typeof args!=='object'||!args)args={};if(!canPlay&&!args.rawdata){if(self.console)console.warn('meSpeak: Can\'t play; No audio support.');return 0;}
48
+ var failed=false;if(typeof callback!=='function')callback=null;if(!callback&&typeof args.callback=='function')callback=args.callback;if(Object.prototype.toString.call(parts)!='[object Array]'||!parts.length){if(self.console)console.warn('meSpeak.speakMultipart: First argument must be an array of objects.');failed=true;}
49
+ if(!failed){for(var i=0,l=parts.length;i<l;i++){if(typeof parts[i]!='object'){if(self.console)console.warn('meSpeak.speakMultipart: First argument must be an array of objects (part #'+i+').');failed=true;break;}}}
50
+ if(failed){if(callback)callback(false,id||0);return 0;}
51
+ if(!id)id=getJobId();if(!coreReady||!defaultVoice){if(self.console)console.log('No voice module loaded, deferring call.');if(args.rawdata){return null;}
52
+ else{speakQueue.push([parts,args,callback,id,true]);return id;}}
53
+ var stackLength=parts.length,streams={},jobIds=[];for(var i=0;i<stackLength;i++)jobIds.push(getJobId());for(var i=0;i<parts.length;i++){var n,part=parts[i]||{},opts={};for(n in args)opts[n]=args[n];for(n in part)opts[n]=part[n];opts.rawdata='array';opts.callback=null;speak(part.text,opts,function(success,jobId,stream){if(success)streams[jobId]=stream;if(--stackLength===0){var wav,sampleLength=0,first=true;for(var i=0;i<jobIds.length;i++){var buffer=streams[jobIds[i]];if(buffer){sampleLength+=readBytes(buffer,40,4);if(first){wav=buffer;first=false;}
54
+ else{wav=wav.concat(buffer.slice(44));}}}
55
+ streams=buffer=null;writeBytes(wav,4,4,sampleLength);writeBytes(wav,40,4,sampleLength);var outStream=new ArrayBuffer(wav.length);new Uint8Array(outStream).set(wav);resolveUtterance(outStream,id,args.rawdata,args.volume,args.pan||0,callback);}},jobIds[i]);}
56
+ return id;}
57
+ function writeBytes(f,p,n,value){while(n){f[p++]=value&0xff;value=value>>8;n--;}}
58
+ function readBytes(f,p,n){var value=0,shft=0;while(n){value|=f[p++]<<shft;shft+=8;n--;}
59
+ return value;}
60
+ function getJobId(){var n,s;while(!n||audioPool[s]||webSoundPool[s]||workerCallbacks[s]){n=Math.floor(Math.random()*Math.pow(2,32));s=n.toString();}
61
+ return n;}
62
+ function playSound(stream,relVolume,callback,_id,pan){if(callback&&(typeof callback!=='function'))callback=null;if(!_id)_id=getJobId();var streamType=Object.prototype.toString.call(stream);if(!(streamType=='[object Array]'||streamType=='[object ArrayBuffer]'||streamType=='[object String]')){if(self.console)console.log('meSpeak: Can\'t play, not an Array, or ArrayBuffer, or base64-String: '+streamType);if(callback)callback(false,_id||0);return 0;}
63
+ if(typeof relVolume!=='undefined'){relVolume=parseFloat(relVolume);if(isNaN(relVolume)||relVolume<0||relVolume>1)relVolume=undefined;}
64
+ if(AudioAPI){if(streamType=='[object String]'){if(stream.indexOf('data:audio/x-wav;base64,',0)==0)stream=stream.substring(24);stream=stream.replace(/=+$/,'');if(stream.match(/[^A-Za-z0-9\+\/]/)){if(self.console)console.log('meSpeak: Can\'t play, not a proper base64-String.');if(callback)callback(false,_id||0);return 0;}
65
+ stream=decodeBase64ToArray(stream);if(!stream.length){if(self.console)console.log('meSpeak: Can\'t play, empty sound data.');if(callback)callback(false,_id||0);return 0;}
66
+ streamType='[object Array]';}
67
+ var buffer;if(streamType=='[object Array]'){var buffer=new ArrayBuffer(stream.length);new Uint8Array(buffer).set(stream);}
68
+ else{buffer=stream;}
69
+ return playWebSound(buffer,relVolume,callback,_id,pan);}
70
+ else if(canPlay){var isDataUrl=false;if(streamType=='[object String]'){if(stream.indexOf('data:audio/x-wav;base64,',0)<0){if(stream.match(/[^A-Za-z0-9\+\/]/)){if(self.console)console.log('meSpeak: Can\'t play, not a proper base64-String.');if(callback)callback(false,_id||0);return 0;}
71
+ stream='data:audio/x-wav;base64,'+stream;}
72
+ isDataUrl=true;}
73
+ else if(streamType=='[object ArrayBuffer]'){stream=new Uint8Array(stream);}
74
+ return(new AudioPlayback(stream,relVolume,isDataUrl,callback,_id).started)?_id:0;}
75
+ else{if(self.console)console.log('meSpeak: Can\'t play; No audio support.');if(callback)callback(false,_id||0);return 0;}}
76
+ function stopSound(){var id,i,k,kl,l,item,n,stopped=0;if(arguments.length>0){for(i=0,l=arguments.length;i<l;i++){n=parseInt(arguments[i]);if(n&&!isNaN(n)){id=n.toString();if(audioPool[id]){audioPool[id].stop();stopped++;}
77
+ else if(webSoundPool[id]){stopWebSound(webSoundPool[id]);stopped++;}
78
+ else{for(k=0,kl=speakQueue.length;k<kl;k++){item=speakQueue[i];if(item[3].string===id){if(!unloading&&typeof item[2]=='function')item[2](false);speakQueue.splice(k,1);stopped++;break;}}}}}}
79
+ else{for(id in audioPool){audioPool[id].stop();stopped++;}
80
+ for(id in webSoundPool){stopWebSound(webSoundPool[id]);stopped++;}
81
+ for(i=0,l=speakQueue.length;i<l;i++){item=speakQueue[i];if(!unloading&&typeof item[2]=='function')item[2](false);stopped++;}
82
+ speakQueue.length=0;}
83
+ return stopped;}
84
+ function setVolume(vol){var id,i,l,n,v;v=parseFloat(vol);if(!isNaN(v)&&v>=0&&v<=1&&v!=playbackVolume){if(arguments.length==1)playbackVolume=v;if(AudioAPI){if(arguments.length>1){for(i=0,l=arguments.length;i<l;i++){n=parseInt(arguments[i]);if(n&&!isNaN(n)){id=n.toString();if(webSoundPool[id])setWebSoundVolume(webSoundPool[id],v);}}}
85
+ else if(masterGain){masterGain.gain.value=playbackVolume;}}
86
+ else if(canPlay){if(arguments.length>1){for(i=0,l=arguments.length;i<l;i++){n=parseInt(arguments[i]);if(n&&!isNaN(n)){id=n.toString();if(audioPool[id])audioPool[id].setVolume(v);}}}
87
+ else{for(id in audioPool)audioPool[id].adjustVolume();}}}
88
+ return vol;}
89
+ function getVolume(){if(arguments.length){var n=parseInt(arguments[0]);if(n&&!isNaN(n)){var id=n.toString();if(webSoundPool[id])return webSoundPool[id].relVolume;if(audioPool[id])return audioPool[id].relVolume;}
90
+ return undefined;}
91
+ else{return playbackVolume;}}
92
+ function resolveAudioApi(){if(self.AudioContext){AudioAPI=self.AudioContext;canPlay=true;return;}
93
+ else{var vendors=['webkit','moz','o','ms'];for(var i=0;i<vendors.length;i++){var api=self[vendors[i]+'AudioContext'];if(api){AudioAPI=api;canPlay=true;return;}}}
94
+ if(!AudioAPI){var audioElement=document.createElement('audio');if(audioElement&&audioElement.canPlayType&&(audioElement.canPlayType('audio/wav')||audioElement.canPlayType('audio/x-wav'))){canPlay=true;}
95
+ else{canPlay=false;if(self.console)console.log('meSpeak: Muted. No support for HTMLAudioElement with MIME "audio/x-wav" dected.');}}}
96
+ function canPlaybackWav(){return canPlay;}
97
+ function AudioPlayback(stream,relVolume,isDataUrl,callback,id){this.relVolume=relVolume;this.audio=null;this.id=String(id);this.callback=(typeof callback=='function')?callback:null;this.playing=false;this.started=false;this.play(stream,isDataUrl);}
98
+ AudioPlayback.prototype={play:function(stream,isDataUrl){try{audioPool[this.id]=this;this.audio=document.createElement('audio');this.adjustVolume();var that=this;this.audio.addEventListener('ended',function(){that.remove();},false);this.audio.addEventListener('canplaythrough',function(){that.audio.play();that.playing=true;},false);if(isDataUrl){this.audio.src=stream;}
99
+ else{this.audio.src='data:audio/x-wav;base64,'+encode64(stream);}
100
+ this.audio.load();this.started=true;}
101
+ catch(e){if(self.console)console.log('meSpeak: HTMLAudioElement Exception: '+e.message);this.started=false;this.remove();}},adjustVolume:function(){this.audio.volume=(typeof this.relVolume!=='undefined')?this.relVolume*playbackVolume:playbackVolume;},setVolume:function(v){this.relVolume=v;this.adjustVolume();},remove:function(stopped){if(this.id)delete audioPool[this.id];if(this.callback){var f=this.callback;this.callback=null;var id=this.id||0;if(!unloading)f(!stopped,id);}},stop:function(){try{if(this.playing)this.audio.pause();}
102
+ catch(e){}
103
+ this.remove(true);}};function playWebSound(stream,volume,callback,id,pan){try{var source,gainNode,timer,relVolume,sid=String(id);if(!audioContext){audioContext=new AudioAPI();}
104
+ else if(audioContext.closed){audioContext=new AudioAPI();audioAnalyser=masterOutput=masterGain=null;}
105
+ if(!masterGain){masterGain=(audioContext.createGain)?audioContext.createGain():audioContext.createGainNode();masterGain.connect(audioContext.destination);masterGain.gain.value=playbackVolume;if(!masterOutput)masterOutput=masterGain;}
106
+ source=audioContext.createBufferSource();relVolume=parseFloat(volume);if(typeof relVolume==='undefined'||isNaN(relVolume)||relVolume<0||relVolume>1)relVolume=1;gainNode=(audioContext.createGain)?audioContext.createGain():audioContext.createGainNode();gainNode.gain.value=relVolume;if(pan&&!isNaN(pan)){try{var splitter=audioContext.createChannelSplitter(2),merger=audioContext.createChannelMerger(2),left=(audioContext.createGain)?audioContext.createGain():audioContext.createGainNode(),right=(audioContext.createGain)?audioContext.createGain():audioContext.createGainNode(),ratio=Math.max(-1,Math.min(1,parseFloat(pan))),mixer=(audioContext.createGain)?audioContext.createGain():audioContext.createGainNode();mixer.channelCount=2;mixer.channelCountMode='explicit';mixer.channelInterpretation='speakers';left.gain.value=ratio<0?1:1-ratio;right.gain.value=ratio>0?1:1+ratio;mixer.connect(splitter);splitter.connect(left,0);splitter.connect(right,1);left.connect(merger,0,0);right.connect(merger,0,1);merger.connect(gainNode);source.connect(mixer);}
107
+ catch(e){source.connect(gainNode);}}
108
+ else{source.connect(gainNode);}
109
+ if(audioAnalyser)gainNode.connect(audioAnalyser);gainNode.connect(masterOutput);audioContext.decodeAudioData(stream,function(audioData){var f=function(){webSoundEndHandler(source,gainNode,callback,true,id);};if(wsUseTimeout||typeof source.onended==='undefined'){var duration=audioData.duration;timer=setTimeout(f,duration?Math.ceil(duration*1000):10);}
110
+ else{source.onended=f;}
111
+ source.buffer=audioData;if(wsStartFromCallback){if(source.start){source.start(0);}
112
+ else{source.noteOn(0);}}},function(err){console.log('meSpeak: Web Audio Decoding Error: '+((typeof err=='object')?err.message:err));if(timer)clearTimeout(timer);if(source)source.disconnect();if(gainNode)gainNode.disconnect();if(webSoundPool[sid])delete webSoundPool[sid];if(!unloading&&typeof callback=='function')callback(false,id);return 0;});webSoundPool[sid]={'source':source,'gainNode':gainNode,'callback':callback,'id':id,'relVolume':relVolume,'timer':timer};if(!wsStartFromCallback){if(source.start){source.start(0);}
113
+ else{source.noteOn(0);}}
114
+ return id;}
115
+ catch(e){if(self.console)console.log('meSpeak: Web Audio Exception: '+e.message);if(timer){clearTimeout(timer);timer=0;}
116
+ webSoundEndHandler(source,gainNode,callback,false,id);return 0;}}
117
+ function webSoundEndHandler(source,gainNode,callback,success,id){var sid=String(id);if(sid&&webSoundPool[sid]&&webSoundPool[sid].timer)clearTimeout(webSoundPool[sid].timer);if(!unloading&&typeof callback=='function')callback(success,id);var f=function(){if(source){if(typeof source.onended!=='undefined')source.onended=null;source.disconnect();}
118
+ if(gainNode)gainNode.disconnect();if(sid&&webSoundPool[sid])delete webSoundPool[sid];};if(!success){f();}
119
+ else{setTimeout(f,500);}}
120
+ function stopWebSound(obj){try{if(obj.source.stop){obj.source.stop(0);}
121
+ else{obj.sourcesource.noteOff(0);}}
122
+ catch(e){}
123
+ webSoundEndHandler(obj.source,obj.gainNode,obj.callback,false,obj.id);}
124
+ function setFilter(){var biquadProps=['frequency','Q','gain','detune'],compressorProps=['threshold','knee','ratio','reduction','attack','release'];if(!AudioAPI)return;if(!audioContext){audioContext=new AudioAPI();}
125
+ else if(audioContext.closed){audioContext=new AudioAPI();audioAnalyser=masterOutput=masterGain=null;}
126
+ var inputNode,outputNode;for(var i=0;i<arguments.length;i++){var data=arguments[i];if(Object.prototype.toString.call(data)!=='[object Object]'){if(self.console)console.warn('meSpeak.setFilter(): argument must be an object, ignoring argument '+i+'.');continue;}
127
+ var filter,type=String(data.type).toLowerCase();switch(type){case'lowpass':case'highpass':case'bandpass':case'lowshelf':case'highshelf':case'peaking':case'notch':case'allpass':try{filter=audioContext.createBiquadFilter();filter.type=type;for(var j=0;j<biquadProps.length;j++){var p=biquadProps[j];try{if(!isNaN(data[p]))filter[p].value=data[p];}
128
+ catch(e2){if(self.console)console.warn('meSpeak.setFilter(), filter-type: "'+type+'", parameter: "'+p+'": '+e2.message);};}}
129
+ catch(e1){if(self.console)console.warn('meSpeak.setFilter(): Failed to create filter "'+type+'", '+e1.message);};break;case'dynamicscompressor':case'compressor':try{filter=audioContext.createDynamicsCompressor();for(var j=0;j<compressorProps.length;j++){var p=compressorProps[j];try{if(!isNaN(data[p]))filter[p].value=data[p];}
130
+ catch(e2){if(self.console)console.warn('meSpeak.setFilter(), filter-type: "'+type+'", parameter: "'+p+'": '+e2.message);};}
131
+ break;}
132
+ catch(e1){if(self.console)console.warn('meSpeak.setFilter(): Failed to create filter "'+type+'", '+e1.message);};default:if(self.console)console.warn('meSpeak.setFilter(): unknown filter type "'+type+'".');filter=null;break;}
133
+ if(filter){if(!inputNode){inputNode=filter;}
134
+ else{inputNode.connect(filter);}
135
+ outputNode=filter;}}
136
+ if(outputNode){if(!masterGain){masterGain=(audioContext.createGain)?audioContext.createGain():audioContext.createGainNode();masterGain.connect(audioContext.destination);masterGain.gain.value=playbackVolume;}
137
+ outputNode.connect(masterGain);masterOutput=inputNode;}
138
+ else{masterOutput=masterGain;}}
139
+ function getAudioAnalyser(){if(!AudioAPI)return;if(!audioContext){audioContext=new AudioAPI();}
140
+ else if(audioContext.closed){audioContext=new AudioAPI();audioAnalyser=masterOutput=masterGain=null;}
141
+ audioAnalyser=audioContext.createAnalyser();return audioAnalyser;}
142
+ function setWebSoundVolume(obj,v){obj.gainNode.gain.value=v;obj.relVolume=v;}
143
+ function setDefaultVoice(voice){if(voice){if(!coreReady){deferredLoaders.push({'job':setDefaultVoice,'args':[voice]});}
144
+ else if(voicesLoaded[voice]){defaultVoice=voice;}}}
145
+ function getDefaultVoice(){return defaultVoice;}
146
+ function getRelFileUrl(url){if((/^(\/|https?:|ftps?:|file:)/i).test(url))return url;else{var baseParts=(/^(https?|ftps?|file)(\:\/\/)([^\/]*\/)(.*)$/i).exec(baseUrl),basePath=baseParts[4].split('/'),filePath=url.split('/');for(var i=0;i<filePath.length;i++){var p=filePath[i];if(p==='.')continue;if(p==='..'){basePath.pop();}
147
+ else{basePath.push(p);}}
148
+ return baseParts[1]+baseParts[2]+baseParts[3]+basePath.join('/');}}
149
+ function loadVoice(url,callback){if(url&&typeof url==='string'){if(coreReady){var handler=function(success,msg){if(success)onVoiceLoaded(msg);if(typeof callback==='function')callback(success,msg);};if((/^[\w\-]+(\/[\w\-]+)?$/).test(url)){url='voices/'+url+'.json';}
150
+ url=getRelFileUrl(url);if(hasWorker){sendWorkerJob({'job':'loadVoice','args':[url]},0,handler);}
151
+ else{meSpeakCore.loadVoice(url,handler);}}
152
+ else{deferredLoaders.push({'job':loadVoice,'args':[url,callback]});}}}
153
+ function loadConfig(url){}
154
+ function loadCustomConfig(url,callback){if(url&&typeof url==='string'){if(coreReady){var handler=function(success,msg){if(success)onConfigLoaded(msg);if(typeof callback==='function')callback(success,msg);};url=getRelFileUrl(url);if(hasWorker){sendWorkerJob({'job':'loadConfig','args':[url]},0,handler);}
155
+ else{meSpeakCore.loadConfig(url,handler);}}
156
+ else{deferredLoaders.push({'job':loadCustomConfig,'args':[url,callback]});}}}
157
+ function onConfigLoaded(voiceId){if(voiceId){voicesLoaded[voiceId]=true;setDefaultVoice(voiceId);}}
158
+ function onVoiceLoaded(voiceId){if(voiceId){voicesLoaded[voiceId]=true;setDefaultVoice(voiceId);executeQueuedCalls();}}
159
+ function isVoiceLoaded(voice){return voicesLoaded[voice]?true:false;}
160
+ function isConfigLoaded(){return true;}
161
+ function getRunMode(){return hasWorker?'worker':'instance';}
162
+ function restartWithInstance(){speakQueue.length=deferredLoaders.length=0;voicesLoaded={};workerCallbacks={};defaultVoice='';stopSound();audioPool={};webSoundPool={};playbackVolume=1;if(hasWorker){if(worker)worker.terminate();worker=null;hasWorker=coreReady=false;loadCore();}}
163
+ function unloadHandler(event){unloading=true;stopSound();audioPool={};webSoundPool={};workerCallbacks={};if(worker)worker.terminate();}
164
+ function unlockAudio(event){event.returnValue=true;if(audioUnlocked)return;if(AudioAPI){try{if(!audioContext)audioContext=new AudioAPI();if(audioContext.state==='suspended')audioContext.resume();var gain=(audioContext.createGain)?audioContext.createGain():audioContext.createGainNode();}
165
+ catch(e){}}
166
+ audioUnlocked=true;self.removeEventListener('touchstart',unlockAudio);self.removeEventListener('mousedown',unlockAudio);}
167
+ loadCore();resolveAudioApi();window.addEventListener('unload',unloadHandler,false);if(isMobile&&typeof self.ontouchstart!==undefined)self.addEventListener('touchstart',unlockAudio,{'passive':true,'capture':true});else if(isSafari)self.addEventListener('mousedown',unlockAudio,true);return{'speak':speak,'speakMultipart':speakMultipart,'loadConfig':loadConfig,'loadVoice':loadVoice,'loadCustomConfig':loadCustomConfig,'setDefaultVoice':setDefaultVoice,'getDefaultVoice':getDefaultVoice,'setVolume':setVolume,'getVolume':getVolume,'play':playSound,'isConfigLoaded':isConfigLoaded,'isVoiceLoaded':isVoiceLoaded,'resetQueue':resetQueue,'canPlay':canPlaybackWav,'stop':stopSound,'setFilter':setFilter,'getRunMode':getRunMode,'restartWithInstance':restartWithInstance,'getAudioAnalyser':getAudioAnalyser,'unlockAudio':unlockAudio};})();