gpt4 book ai didi

ios - SFSpeechRecognizer - 检测话语结束

转载 作者:IT王子 更新时间:2023-10-29 08:11:29 24 4
gpt4 key购买 nike

我正在使用 iOS 10 内置语音识别来破解一个小项目。我使用设备的麦克风得到了工作结果,我的语音被非常准确地识别。

我的问题是为每个可用的部分转录调用识别任务回调,我希望它检测停止说话的人并调用回调并将 isFinal 属性设置为真的。它没有发生 - 应用程序正在无限期地监听。

SFSpeechRecognizer 是否能够检测句末?

这是我的代码 - 它基于在 Internet 上找到的示例,它主要是从麦克风源识别所需的样板。我通过添加识别 taskHint 对其进行了修改。我还将 shouldReportPartialResults 设置为 false,但它似乎已被忽略。

    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
}

最佳答案

当用户按预期停止说话时,isFinal 标志似乎没有变为真。我猜这是 Apple 想要的行为,因为“用户停止说话”事件是未定义的事件。

我认为实现目标的最简单方法是执行以下操作:

  • 你必须建立一个“沉默的间隔”。这意味着如果用户没有说话的时间超过你的间隔,他就停止说话了(即 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 秒后不再说话。您可以安全地停止 Audio Session 并退出

关于ios - SFSpeechRecognizer - 检测话语结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42530634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com