我已经找到了一个解决方案,但我见过的所有内容都令人困惑,所以我想我会创建一个新问题。
我正在使用语音库,我希望识别任务在没有用户输入的情况下在2秒后停止。我知道我想使用一个计时器,但我无法确定将它放在哪里以及如何更新它。
按下录制按钮时启动计时器,按下停止录制按钮后,我将其无效。
但是我在哪里检查用户是否添加了新输入?我正在考虑保存最后一个转录并将其与下一个转录进行比较:当它们不同时,重置计时器。
以下是我的代码:
recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error in
var isFinal = false
if let result = result {
self.textView.text = result.bestTranscription.formattedString
// Should I compare the result here to see if it changed?
isFinal = result.isFinal
}
// Or should I do it here? In what order is this code even running?
if error != nil || isFinal {
self.result = self.textView.text
self.audioEngine.stop()
inputNode.removeTap(onBus: 0)
self.recognitionRequest = nil
self.recognitionTask = nil
self.recordButton.isEnabled = true
self.recordButton.setTitle("Start Recording", for: [])
}
}
答案 0 :(得分:2)
到目前为止,我遇到了同样的问题。检查了你的问题,我想下面的代码可以帮助你实现我所做的一切。
recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in
var isFinal = false
if result != nil {
self.inputTextView.text = result?.bestTranscription.formattedString
isFinal = (result?.isFinal)!
}
if let timer = self.detectionTimer, timer.isValid {
if isFinal {
self.inputTextView.text = ""
self.textViewDidChange(self.inputTextView)
self.detectionTimer?.invalidate()
}
} else {
self.detectionTimer = Timer.scheduledTimer(withTimeInterval: 1.5, repeats: false, block: { (timer) in
self.handleSend()
isFinal = true
timer.invalidate()
})
}
})
检查输入是否未收到1.5秒。
答案 1 :(得分:2)
最终为我工作的是:
func restartSpeechTimer() {
timer?.invalidate()
timer = Timer.scheduledTimer(withTimeInterval: 1.5, repeats: false, block: { (timer) in
// Do whatever needs to be done when the timer expires
})
}
在识别任务中:
var isFinal = false
if letresult = result {
// do something with the result
isFinal = result.isFinal
}
if iFinal {
self.stopRecording()
}
else if error == nil {
self.restartSpeechTimer()
}