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