Benutzer:Formatierer/js/text2speech.js

Aus Wiktionary, dem freien Wörterbuch
// 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);