我正在使用浏览器技术SpeechRecognition/webkitSpeechRecognition在浏览器中进行语音识别。我需要麦克风在打开页面后始终收听命令,并且在用户说出所需的短语后,我会根据命令更改视频的状态(例如,播放/暂停)。
在 Chrome 浏览器的桌面上,一切正常,麦克风在打开页面后开始监听(rec.start(),浏览器在页面上显示允许使用麦克风的通知并且用户同意)如果用户什么也没说,然后浏览器会在 7-10 秒的静音后停止录制,但在停止麦克风后我重新启动它并不会导致任何问题。
一个在 Chrome 桌面上运行良好的简化示例:
let rec = null;
let isRecording = false;
function startRecording() {
if (rec && !isRecording) rec.start();
}
function stopRecording() {
if (rec && isRecording) rec.stop();
}
// Сhecking the technology support in the browser
try {
var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
rec = new SpeechRecognition();
} catch(e) {
console.log(e);
}
// If the technology is supported, then we set up the recording
if (rec) {
rec.continuous = true;
rec.lang = 'en-US';
rec.interimResults = false;
// Event after receiving voice transcription as text
rec.onresult = function(e) {
// Сode that compares what the user said with existing commands,
// after which some action takes place with the video on the page
}
// The event is triggered after recording has started
// rec.start();
rec.onstart = function(e) {
isRecording = true;
}
// Event after recording stopped
// rec.stop(); or after an error occurs
rec.onend = function(e) {
isRecording = false;
startRecording(); // Restart recording
}
// Event that occurs when audio recording fails
rec.onerror = function(e) {
console.log('Speech recognition error detected: ' + e.error);
}
// Start recording after page load
startRecording();
}
在 safari 浏览器(iOS 上)中,用户第一次说出这句话后,脚本处理了onresult事件后,将不再触发该事件,但录制不会返回错误(onerror事件)并且不会停止(onend事件),在地址栏中继续显示一个红色的麦克风图标。为什么会这样?
我尝试在处理完第一个乐句后重新开始录音并开始工作,但不幸的是它不是很稳定,因为有时麦克风会因为其他原因停止处理命令,我也无法使用录音中的内置事件进行跟踪。我只需要想出某种定期重启,例如,通过计时器,但我认为这不是最好的选择。
有助于在 Safari 中收听多个短语的更改:
// Event after receiving voice transcription as text
rec.onresult = function(e) {
// Сode that compares what the user said with existing commands,
// after which some action takes place with the video on the page
// Restart recording;
restartRecording();
}
我还注意到,如果我不使用带麦克风的耳机,那么浏览器或设备在录制时会将扬声器中的视频声音降至最低,这应该是这样吗?
UPD
经过多次测试,我意识到这不是唯一可用的识别问题,而是视频和SpeechRecognition之间的冲突,如果启动SpeechRecognition并且此时视频出现播放/暂停,则识别失败并且停止提供反馈,尽管错误事件或停止不起作用,但如果之后您重新开始录制,那么一切都会重新开始。最难的是找到合适的重启时间,现在我设置了一个3.5-5秒的定时器来延迟重启,因为提前重启对恢复语音识别没有帮助,但这是一个很长的时间。