如何在语音识别期间访问语音输入级别

How do I access speech input level during voice recognition

我已经设置好我的语音识别文本区域,所以我可以对着文本区域说话

<span id="button" onclick="toggleStartStop()">CLICK ME!</span>

<script type="text/javascript">
  var recognizing;
  var recognition = new webkitSpeechRecognition();
  recognition.continuous = true;
  recognition.onresult = function (event) {
    for (var i = event.resultIndex; i < event.results.length; ++i) {
      if (event.results[i].isFinal) {
        TEXTAREA.value += event.results[i][0].transcript;
      }
    }
  }

  function reset() {
    recognizing = false;
    button.innerHTML = "Click to Speak";
  }

  function toggleStartStop() {
    if (recognizing) {
      recognition.stop();
      reset();
    } else {
      recognition.start();
      recognizing = true;
      button.innerHTML = "Click to Stop";
    }

    function speak(text, callback) {
      var u = new SpeechSynthesisUtterance();
      u.text = text;
      u.lang = 'en-US';
      u.onend = function () {
        if (callback) {
          callback();
        }
      };

      u.onerror = function (e) {
        if (callback) {
          callback(e);
        }
      };
      speechSynthesis.speak(u);
    }
  }
</script>

但我正在尝试向其添加语音指示,就像 google 的语音搜索一样。

http://www.stateofdigital.com/wp-content/uploads/2015/04/google-voice-search.png

我搜索了所有我能想到的东西,只找到语音搜索的结果,与 google 中的输入电平指示(比如根据你说话的音量增大的圆圈)无关。所以我想我会问,我怎样才能做这样的事情?

此外,我找到的所有语音识别教程都是我能做到的最好的,我对 js 了解不多。所以另一个问题是如何制作我所说的代码,我现在拥有的方式只会在我暂停时插入文本。

您可以在讲话的同时获取音频流并自行计算电平。目前语音识别不支持该级别 API。代码应如下所示:

navigator.webkitGetUserMedia(
    {
        audio: true
    }, 
    function(stream) 
    {
        // "that" is my wrapping object's scope
        that.stream = stream;

        var liveSource = context.createMediaStreamSource(stream);
        var levelChecker = context.createJavaScriptNode(that.bufSize, 1 ,1);

        liveSource.connect(levelChecker);
        levelChecker.connect(context.destination);
        levelChecker.onaudioprocess = function(event) 
        {
            var buf = event.inputBuffer.getChannelData(0);
            var len = buf.length;
            var rms = 0;

            // Iterate through buffer
            for (var i = 0; i < len; i++) 
            {
                rms += Math.abs(buf[i]);
            }
            rms = Math.sqrt(rms / len);
            that.levelCheckerCB(rms);
        };
    }
);

有用的讨论是here