Swift:沉默 x 秒后停止语音识别

问题描述 投票:0回答:3

我一直在寻找解决方案,但我看到的所有解决方案都令人困惑,所以我想我应该创建一个新问题。

我正在使用语音库,我希望识别任务在没有用户输入的情况下 2 秒后停止。我知道我想使用计时器,但我无法弄清楚将其放在哪里以及如何更新它。

按下录制按钮时启动计时器,按下停止录制按钮时使其无效。

但是我在哪里检查用户是否添加了新输入?我正在考虑保存最后一个转录并将其与下一个转录进行比较:当它们不同时,重置计时器。

这是我的代码的样子:

recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error in
    var isFinal = false

    if let result = result {
        self.textView.text = result.bestTranscription.formattedString
    // Should I compare the result here to see if it changed?
        isFinal = result.isFinal
    }

    // Or should I do it here? In what order is this code even running?

    if error != nil || isFinal {
        self.result = self.textView.text

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

        self.recognitionRequest = nil
        self.recognitionTask = nil

        self.recordButton.isEnabled = true
        self.recordButton.setTitle("Start Recording", for: [])
    }
}
ios swift timer speech
3个回答
7
投票

这就是最终为我工作的:

func restartSpeechTimer() {
    timer?.invalidate()
    timer = Timer.scheduledTimer(withTimeInterval: 1.5, repeats: false, block: { (timer) in
        // Do whatever needs to be done when the timer expires
    })
}

识别任务内部:

var isFinal = false
if letresult = result {
    // do something with the result
    isFinal = result.isFinal
}
if iFinal {
    self.stopRecording()
}
else if error == nil {
    self.restartSpeechTimer()
}

2
投票

直到现在我也遇到了同样的问题。检查了你的问题,我想下面的代码可以帮助你实现我所做的同样的事情。

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 秒内未收到输入。


0
投票

取得阶级财产

var beforeRecordingTime: CFAbsoluteTimeGetCurrent?
let pauseDurationTimeout: Double = 3

并且就在

recognitionTask
方法初始化之前

beforeRecordingTime = CFAbsoluteTimeGetCurrent()

recognitionTask = speechRecognizer?.recognitionTask(with: request, resultHandler: { [weak self] result, error in
            guard let self else { return }
            if let result = result {
                
                let bestString = result.bestTranscription.formattedString
                
                if let beforeRecordingTime = self.beforeRecordingTime {
                    let durationOfPause = CFAbsoluteTimeGetCurrent() - beforeRecordingTime
                    if durationOfPause > pauseDurationTimeout {
                        //You can stop recording here 👈
                        return
                    }
                }
            } 
        })

不要忘记在 stopRecording 方法中设置

beforeRecordingTime
nil 。

© www.soinside.com 2019 - 2024. All rights reserved.