1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfunction VoiceInput(keyboard) { 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.finaResult_ = null; 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.recognizing_ = false; 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.keyboard_ = keyboard; 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.recognition_ = new webkitSpeechRecognition(); 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.recognition_.onstart = this.onStartHandler.bind(this); 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.recognition_.onresult = this.onResultHandler.bind(this); 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.recognition_.onerror = this.onErrorHandler.bind(this); 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.recognition_.onend = this.onEndHandler.bind(this); 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVoiceInput.prototype = { 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Event handler for mouse/touch down events. 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch onDown: function() { 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (this.recognizing_) { 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.recognition_.stop(); 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.recognition_.start(); 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Speech recognition started. Change microphone key's icon. 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch onStartHandler: function() { 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.recognizing_ = true; 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.finalResult_ = ''; 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!this.keyboard_.classList.contains('audio')) 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.keyboard_.classList.add('audio'); 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Speech recognizer returns a result. 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @param{Event} e The SpeechRecognition event that is raised each time 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * there 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * are any changes to interim or final results. 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch onResultHandler: function(e) { 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (var i = e.resultIndex; i < e.results.length; i++) { 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (e.results[i].isFinal) 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.finalResult_ = e.results[i][0].transcript; 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch insertText(this.finalResult_); 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Speech recognizer returns an error. 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @param{Event} e The SpeechRecognitionError event that is raised each time 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * there is an error. 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch onErrorHandler: function(e) { 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch console.error('error code = ' + e.error); 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * Speech recognition ended. Reset microphone key's icon. 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch onEndHandler: function() { 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (this.keyboard_.classList.contains('audio')) 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.keyboard_.classList.remove('audio'); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this.recognizing_ = false; 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 70