Home | History | Annotate | Download | only in ttsdemo
      1 /**
      2  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
      3  * Use of this source code is governed by a BSD-style license that can be
      4  * found in the LICENSE file.
      5  */
      6 
      7 var text;
      8 var ttsStatus;
      9 var ttsStatusBox;
     10 var lang;
     11 var enqueue;
     12 var voices;
     13 var voiceInfo;
     14 var voiceArray;
     15 var utteranceIndex = 0;
     16 
     17 function load() {
     18   text = document.getElementById('srctext');
     19   ttsStatus = document.getElementById('ttsStatus');
     20   ttsStatusBox = document.getElementById('ttsStatusBox');
     21   lang = document.getElementById('lang');
     22   enqueue = document.getElementById('enqueue');
     23   voices = document.getElementById('voices');
     24   voiceInfo = document.getElementById('voiceInfo');
     25 
     26   chrome.tts.getVoices(function(va) {
     27     voiceArray = va;
     28     for (var i = 0; i < voiceArray.length; i++) {
     29       var opt = document.createElement('option');
     30       opt.setAttribute('value', voiceArray[i].voiceName);
     31       opt.innerText = voiceArray[i].voiceName;
     32       voices.appendChild(opt);
     33     }
     34   });
     35   voices.addEventListener('change', function() {
     36     var i = voices.selectedIndex - 1;
     37     if (i >= 0) {
     38       voiceInfo.innerText = JSON.stringify(voiceArray[i], null, 2);
     39     } else {
     40       voiceInfo.innerText = '';
     41     }
     42   }, false);
     43 }
     44 
     45 function speak(str, options, highlightText) {
     46   if (!options) {
     47     options = {};
     48   }
     49   if (enqueue.value) {
     50     options.enqueue = Boolean(enqueue.value);
     51   }
     52   var voiceIndex = voices.selectedIndex - 1;
     53   if (voiceIndex >= 0) {
     54     options.voiceName = voiceArray[voiceIndex].voiceName;
     55   }
     56   var rateValue = Number(rate.value);
     57   if (rateValue >= 0.1 && rateValue <= 10.0) {
     58     options.rate = rateValue;
     59   }
     60   var pitchValue = Number(pitch.value);
     61   if (pitchValue >= 0.0 && pitchValue <= 2.0) {
     62     options.pitch = pitchValue;
     63   }
     64   var volumeValue = Number(volume.value);
     65   if (volumeValue >= 0.0 && volumeValue <= 1.0) {
     66     options.volume = volumeValue;
     67   }
     68   utteranceIndex++;
     69   console.log(utteranceIndex + ': ' + JSON.stringify(options));
     70   options.onEvent = function(event) {
     71     console.log(utteranceIndex + ': ' + JSON.stringify(event));
     72     if (highlightText) {
     73       text.setSelectionRange(0, event.charIndex);
     74     }
     75     if (event.type == 'end' ||
     76         event.type == 'interrupted' ||
     77         event.type == 'cancelled' ||
     78         event.type == 'error') {
     79       chrome.tts.isSpeaking(function(isSpeaking) {
     80         if (!isSpeaking) {
     81           ttsStatus.innerHTML = 'Idle';
     82           ttsStatusBox.style.background = '#fff';
     83         }
     84       });
     85     }
     86   };
     87   chrome.tts.speak(
     88       str, options, function() {
     89     if (chrome.runtime.lastError) {
     90       console.log('TTS Error: ' + chrome.runtime.lastError.message);
     91     }
     92   });
     93   ttsStatus.innerHTML = 'Busy';
     94   ttsStatusBox.style.background = '#ffc';
     95 }
     96 
     97 function stop() {
     98   chrome.tts.stop();
     99 }
    100 
    101 function speakUserText() {
    102   var options = {};
    103   if (lang.value) {
    104     options.lang = lang.value;
    105   }
    106   speak(text.value, options, true);
    107 }
    108 
    109 document.addEventListener('DOMContentLoaded', load);
    110