首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SFSpeechRecognizer -检测话语的结束

SFSpeechRecognizer -检测话语的结束
EN

Stack Overflow用户
提问于 2017-03-01 11:34:11
回答 5查看 11.5K关注 0票数 29

我是黑客使用iOS 10内置语音识别的一个小项目。我有使用设备的麦克风的工作结果,我的讲话非常准确地识别。

我的问题是,对于每个可用的部分转录,都会调用识别任务回调,我希望它能够检测停止说话的,并调用isFinal属性设置为true的回调。这是不可能的-应用程序正在无限期地监听。

SFSpeechRecognizer是否有能力检测句子的结尾?

这是我的代码-它是基于在互联网上发现的例子,它主要是一个样板,需要从麦克风源识别。我修改了它,增加了识别taskHint。我还将shouldReportPartialResults设置为false,但它似乎被忽略了。

代码语言:javascript
复制
    func startRecording() {

    if recognitionTask != nil {
        recognitionTask?.cancel()
        recognitionTask = nil
    }

    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSessionCategoryRecord)
        try audioSession.setMode(AVAudioSessionModeMeasurement)
        try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
    } catch {
        print("audioSession properties weren't set because of an error.")
    }

    recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
    recognitionRequest?.shouldReportPartialResults = false
    recognitionRequest?.taskHint = .search

    guard let inputNode = audioEngine.inputNode else {
        fatalError("Audio engine has no input node")
    }

    guard let recognitionRequest = recognitionRequest else {
        fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object")
    }

    recognitionRequest.shouldReportPartialResults = true

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

        var isFinal = false

        if result != nil {
            print("RECOGNIZED \(result?.bestTranscription.formattedString)")
            self.transcriptLabel.text = result?.bestTranscription.formattedString
            isFinal = (result?.isFinal)!
        }

        if error != nil || isFinal {
            self.state = .Idle

            self.audioEngine.stop()
            inputNode.removeTap(onBus: 0)

            self.recognitionRequest = nil
            self.recognitionTask = nil

            self.micButton.isEnabled = true

            self.say(text: "OK. Let me see.")
        }
    })

    let recordingFormat = inputNode.outputFormat(forBus: 0)
    inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
        self.recognitionRequest?.append(buffer)
    }

    audioEngine.prepare()

    do {
        try audioEngine.start()
    } catch {
        print("audioEngine couldn't start because of an error.")
    }

    transcriptLabel.text = "Say something, I'm listening!"

    state = .Listening
}
EN

回答 5

Stack Overflow用户

发布于 2017-03-21 11:21:12

当用户按预期停止说话时,isFinal标志似乎不成立。我想这是苹果想要的行为,因为“用户停止交谈”事件是一个未定义的事件。

我相信,要达到你的目标,最简单的方法是做以下工作:

  • 你必须建立一个“沉默的间隔”。这意味着,如果用户说话的时间不超过您的时间间隔,他已经停止说话(即2秒)。
  • 开始时创建一个audio session计时器

var timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "didFinishTalk", userInfo: nil, repeats: false)

  • 当您在recognitionTask中获得新的转录时,请使定时器失效并重新启动。 timer.invalidate() timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "didFinishTalk", userInfo: nil, repeats: false)
  • 如果计时器过期,这意味着用户不会在2秒内说话。您可以安全地停止音频会话并退出
票数 25
EN

Stack Overflow用户

发布于 2018-09-03 08:33:11

根据我在iOS10上的测试,当shouldReportPartialResults设置为false时,您必须等待60秒才能得到结果。

票数 4
EN

Stack Overflow用户

发布于 2018-04-24 14:47:24

我正在使用语音短信,目前在一个应用程序,它是好的工作对我。我的recognitionTask块如下:

代码语言:javascript
复制
recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in
        var isFinal = false

        if let result = result, result.isFinal {
            print("Result: \(result.bestTranscription.formattedString)")
            isFinal = result.isFinal
            completion(result.bestTranscription.formattedString, nil)
        }

        if error != nil || isFinal {
            self.audioEngine.stop()
            inputNode.removeTap(onBus: 0)

            self.recognitionRequest = nil
            self.recognitionTask = nil
            completion(nil, error)
        }
    })
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42530634

复制
相关文章

相似问题

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