// text2speech
(function( _public, $, undefined ) {
"use strict";
var context = null;
var player = null;
var playList = [];
var words = ['null','eins','zwei','drei','vier','fünf','sechs',
'sieben','acht','neun','zehn','elf','zwölf','sech','sieb',
'zwanzig','dreißig','vierzig','fünfzig','sechzig','siebzig','achtzig','neunzig','hundert','tausend',
'billiarde','billiarden','billion','billionen','cent','ein','eine','euro','komma',
'milliarde','milliarden','million','millionen','minus','plus','und'];
var sounds = {};
function SamplePlayer (context, urls) {
this.context = context;
this.urls = urls;
this.buffer = [];
}
SamplePlayer.prototype.loadSound = function(url, index) {
var request = new XMLHttpRequest();
request.open('get', url, true);
request.responseType = 'arraybuffer';
var thisBuffer = this;
request.onload = function() {
thisBuffer.context.decodeAudioData(request.response, function(buffer) {
thisBuffer.buffer[index] = buffer;
thisBuffer.loaded(index);
});
};
request.send();
};
SamplePlayer.prototype.loadAll = function() {
var that = this;
this.urls.forEach(function(url, index) {
that.loadSound(url, index);
})
}
SamplePlayer.prototype.loaded = function(index) {
if (index != 0) {return;}
var samples = this.buffer[0].getChannelData(0); // assume mono
var sr = this.buffer[0].sampleRate;
var i = 0;
var idx = 0;
var start = 0;
var cnt = 0;
var found = false;
var spl = 0.0015;
var o = {};
for (i = 0; i < samples.length; i++) {
if (Math.abs(samples[i] < spl)) {
cnt++;
} else {
cnt = 0;
found = false;
}
if (cnt > sr/48 && !found) {
o = new Object();
o.start = start;
start = i/sr;
o.duration = start - o.start;
if (o.duration < 0.2) {
sounds[words[idx-1]].duration += o.duration; // Fehlerkorrektur
continue;
}
sounds[words[idx]] = o;
idx++;
found = true;
}
}
o = new Object();
o.start = start;
o.duration = samples.length/sr - o.start;
sounds[words[idx]] = o;
}
SamplePlayer.prototype.getSoundByIndex = function(index) {
return this.buffer[index];
}
SamplePlayer.prototype.play = function(index) {
playList.push(index);
if (playList.length == 1) {
player.playLi();
}
}
SamplePlayer.prototype.playLi = function() {
var index = playList[0];
var source = context.createBufferSource();
source.buffer = this.getSoundByIndex(0);
source.connect(this.context.destination);
source.onended = function(e) {
index = playList.shift();
if (playList.length > 0) {
player.playLi();
}
}
source.start(0,sounds[index].start,sounds[index].duration);
}
SamplePlayer.prototype.playWTF = function() {
var source = context.createBufferSource();
source.buffer = this.getSoundByIndex(1);
source.connect(this.context.destination);
source.start();
}
_public.init = function (){
context = new (window.AudioContext || window.webkitAudioContext)();
var soundUrl = [
'//upload.wikimedia.org/wiktionary/de/3/3a/De-SFX~Jeuwre~cg.ogg',
'//upload.wikimedia.org/wikipedia/commons/f/fc/De-wer_lesen_kann_ist_klar_im_Vorteil.ogg'
];
player = new SamplePlayer(context, soundUrl);
player.loadAll();
}
_public.speak = function (){
var i = 0;
var zahl = ZahlOMat.getZahl().toLowerCase();
if (zahl.indexOf('trill') >= 0) {
player.playWTF();
return;
}
zahl = zahl.replace(/[()]/g," ");
zahl = zahl.replace(/zehn/g," zehn");
zahl = zahl.replace(/und/g," und ");
zahl = zahl.replace(/h und ert/g," hundert ");
zahl = zahl.replace(/tausend/g," tausend ");
var a = zahl.split(/ */);
for (i = 0; i <a.length; i++) {
if (sounds.hasOwnProperty(a[i])) {
player.play(a[i]);
}
}
}
var form,node;
form = newNode(
'form',
{'class':'noprint'},
newNode('input',{'type':'button','value':'aussprechen'})
);
form.lastChild.onclick = text2speech.speak;
form.onsubmit = text2speech.speak;
node = document.getElementById("ZOMssp");
node.parentNode.insertBefore(form,node);
}( window.text2speech = window.text2speech || {}, jQuery ));
jQuery(document).ready(text2speech.init);