如何在语音识别期间访问语音输入级别
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。
我已经设置好我的语音识别文本区域,所以我可以对着文本区域说话
<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。