[英]Stop recognition in Swift3 without stop word
我正在尝试简化Textview中语音框架的使用。 我可以使用基于输入textview的代码,启动代码或其他操作轻松地启动语音识别过程。 但是,我也想在没有用户触摸的情况下结束语音识别。 我无法在Speech框架中找到任何东西来表明有可用的方法来执行此操作。 我通过定义一个单词作为停止转录的触发器,然后从转录中删除该单词,精心设计了一种实现方法。 它确实有效,但是用户当然不能说这个单词。 有没有更好的方法来处理这个概念? iOS 10,Swift 3,Xcode 8.2.1
这是识别任务的代码子集:
private var bufferedString = String()
private var stopWord = "myStopWord"
recognitionRequest.shouldReportPartialResults = true
let startText = self.sayTextView.text
bufferedString = ""
recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in
var finished = false
if let result = result {
self.bufferedString = startText! + result.bestTranscription.formattedString
self.sayTextView.text = self.bufferedString
finished = result.isFinal
}//if let result
//for testing
self.stopWord = "Relationship"
//for testing
if self.bufferedString.lowercased().contains(self.stopWord.lowercased()) {
print("buffered string contains \(self.stopWord)")
if let stopWordRange = self.bufferedString.lowercased().range(of: self.stopWord.lowercased()) {
self.bufferedString.replaceSubrange(stopWordRange, with: "")
self.sayTextView.text = self.bufferedString
}//if let
self.stopRecording(self)
}//if contains - look for stopWord
if error != nil || finished {
self.audioEngine.stop()
inputNode.removeTap(onBus: 0)
self.recognitionRequest = nil
self.recognitionTask = nil
self.startRecordingButton.isEnabled = true
}//if error
})//recognitionTask resultHandler
当用户停止按预期讲话时,isFinal标志似乎没有变为真。 我猜这是Apple的通缉行为,因为“用户停止通话”事件是未定义的事件。
我相信实现目标的最简单方法是:
您必须建立一个“沉默间隔”,这意味着如果用户不讲话的时间长于您停止讲话的时间(即2秒钟)。
在音频会话开始时创建一个计时器:
var timer = NSTimer.scheduledTimerWithTimeInterval(2,目标:自我,选择器:“ didFinishTalk”,userInfo:无,重复:false)
当您在Recognition中获得新的转录时, recognitionTask
无效并重新启动计时器
timer.invalidate()timer = NSTimer.scheduledTimerWithTimeInterval(2,目标:自我,选择器:“ didFinishTalk”,userInfo:无,重复:false)
如果计时器到期,则表示用户2秒钟后不会讲话。 您可以安全地停止音频会话并退出
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.