首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SpeechKit框架中持续监听用户的声音并检测语音沉默的结束

在SpeechKit框架中持续监听用户的声音并检测语音沉默的结束
EN

Stack Overflow用户
提问于 2018-04-06 12:55:45
回答 1查看 2.5K关注 0票数 10

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

在我以两种方式集成SpeechKit框架的地方,请找到下面的代码。

( A)通过关闭(recognitionTask(with request: SFSpeechRecognitionRequest, resultHandler: @escaping (SFSpeechRecognitionResult?, Error?) -> Swift.Void) -> SFSpeechRecognitionTask)

代码语言:javascript
复制
let audioEngine = AVAudioEngine()
let speechRecognizer = SFSpeechRecognizer()
let request = SFSpeechAudioBufferRecognitionRequest()
var recognitionTask: SFSpeechRecognitionTask?

func startRecording() throws {

        let node = audioEngine.inputNode
        let recordingFormat = node.outputFormat(forBus: 0)

        node.installTap(onBus: 0, bufferSize: 1024,
                        format: recordingFormat) { [unowned self]
                            (buffer, _) in
                            self.request.append(buffer)
        }

        audioEngine.prepare()
        try audioEngine.start()

        weak var weakSelf = self

        recognitionTask = speechRecognizer?.recognitionTask(with: request) {
            (result, error) in

            if result != nil {

                if let transcription = result?.bestTranscription {
                    weakSelf?.idenifyVoiceCommand(transcription)
                }
            }
        }            
}

但是,当我说任何像“打开设置”这样的单词/句子时,闭包(recognitionTask(with:))会多次调用,并将方法(idenifyVoiceCommand)放入闭包中,多次调用,所以如何限制只调用一次。

我还在谷歌上查看计时器逻辑(SFSpeechRecognizer - detect end of utterance),但在我的场景中,它不能工作,因为我没有停止音频引擎,因为它像Siri那样不断地监听用户的声音。

( B)通过委托(SFSpeechRecognitionTaskDelegate)

SpeechRecognizer.recognitionTask(与: self.request,委托: self)

代码语言:javascript
复制
func speechRecognitionTaskWasCancelled(_ task: SFSpeechRecognitionTask) {

}

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

}

我发现,当结束时处理的委托不会调用它,有时会意外地调用它。

EN

回答 1

Stack Overflow用户

发布于 2019-07-15 19:22:33

到目前为止我也有同样的问题。

我检查了您的问题,我想下面的代码可以帮助您实现我所做的同样的事情:

代码语言:javascript
复制
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秒内未收到输入

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49693320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档