4

我正在使用浏览器技术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秒的定时器来延迟重启,因为提前重启对恢复语音识别没有帮助,但这是一个很长的时间。


4

0 回答 0