Swift 在SpeechKit框架中持续聆听用户语音并检测语音结束时的静音

Swift 在SpeechKit框架中持续聆听用户语音并检测语音结束时的静音,swift,speech-recognition,ios10,speech-to-text,speechkit,Swift,Speech Recognition,Ios10,Speech To Text,Speechkit,我正在使用一个应用程序,其中我们需要根据语音命令打开特定屏幕,比如如果用户说“打开设置”,那么它应该打开设置屏幕,到目前为止,我已经使用了SpeechKit框架,但我无法检测到语音沉默的结束。比如Siri是如何做到的。我想检测用户是否结束了他的句子/短语 请找到下面的代码,我用两种方式集成了SpeechKit框架 A) 通过闭包(recognitionTask(带请求:SFSpeechRecognitionRequest,resultHandler:@escaping(SFSpeechRecog

我正在使用一个应用程序,其中我们需要根据语音命令打开特定屏幕,比如如果用户说“打开设置”,那么它应该打开设置屏幕,到目前为止,我已经使用了
SpeechKit
框架,但我无法检测到语音沉默的结束。比如Siri是如何做到的。我想检测用户是否结束了他的句子/短语

请找到下面的代码,我用两种方式集成了
SpeechKit
框架

A) 通过闭包(
recognitionTask(带请求:SFSpeechRecognitionRequest,resultHandler:@escaping(SFSpeechRecognitionResult?,Error?)->Swift.Void)->SFSpeechRecognitionTask

但是当我说任何单词/句子,比如“Open Setting”,然后闭包(
recognitionTask(with:)
)被多次调用,我把方法(
idenifyVoiceCommand
)放在闭包中,多次调用,那么我如何限制只调用一次呢

我也会在谷歌搜索时查看计时器逻辑(),但在我的场景中,它不起作用,因为我没有停止音频引擎,因为它像Siri那样不断地听用户的声音

B) 通过委托(
SFSpeechRecognitionTaskDelegate

SpeechRecognitor.recognitionTask(带:self.request,委托:self)


我发现,当演讲结束时处理该问题的代理不会调用它,有时会意外地在结束后调用它。

直到现在,我都遇到了同样的问题

我检查了您的问题,我想下面的代码可以帮助您实现与我相同的目标:

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秒内没有收到,这是一个很好的问题,在这个问题上取了很多次没有解决任何人知道的问题,请给出一些solution@muhammedessa-感谢分享此代码。self.handleSend()调用做什么?@Westley handleSend是我自己的函数。这只是我的要求,你可以忽略它。
func speechRecognitionTaskWasCancelled(_ task: SFSpeechRecognitionTask) {

}

func speechRecognitionTask(_ task: SFSpeechRecognitionTask, didFinishSuccessfully successfully: Bool) {

}
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()
        })
    }

})