在没有停用词的情况下停止Swift3中的识别

时间:2017-02-16 00:11:32

标签: ios swift3 speech-recognition sfspeechrecognizer

我正在尝试在textview中简化Speech框架的使用。我可以使用基于输入textview,启动代码或其他操作的代码轻松启动语音识别过程。但是,我还想在没有用户触摸的情况下结束语音识别。我无法在Speech框架中找到任何表明有可用的方法来执行此操作。我通过定义一个单词作为阻止转录的触发器,然后从转录中删除单词,制定了一种方法来实现它。它确实有效,但用户当然不能说出这个词。有没有更好的方法来处理这个概念? iOS 10,Swift 3,Xcode 8.2.1

这是recognitionTask的代码子集:

private var bufferedString = String()
private var stopWord = "myStopWord"

recognitionRequest.shouldReportPartialResults = true
let startText = self.sayTextView.text
bufferedString = ""

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

    if let result = result {

        self.bufferedString = startText! + result.bestTranscription.formattedString
            self.sayTextView.text = self.bufferedString
            finished = result.isFinal

    }//if let result

    //for testing
    self.stopWord = "Relationship"
    //for testing

    if self.bufferedString.lowercased().contains(self.stopWord.lowercased()) {
        print("buffered string contains \(self.stopWord)")

        if let stopWordRange = self.bufferedString.lowercased().range(of: self.stopWord.lowercased()) {
            self.bufferedString.replaceSubrange(stopWordRange, with: "")
            self.sayTextView.text = self.bufferedString
        }//if let

        self.stopRecording(self)

    }//if contains - look for stopWord

    if error != nil || finished {

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

        self.recognitionRequest = nil
        self.recognitionTask = nil
        self.startRecordingButton.isEnabled = true

    }//if error
})//recognitionTask resultHandler

1 个答案:

答案 0 :(得分:2)

当用户停止按预期说话时,似乎isFinal标志不会变为真。我猜这是Apple的通缉行为,因为“User stop talk”事件是一个未定义的事件。

我相信实现目标的最简单方法是:

  • 你必须建立一个“沉默间隔”,这意味着如果用户没有说话的时间超过他停止说话的时间间隔(即2秒)。

  • 在音频会话开始时创建一个计时器:

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秒内通话。您可以安全地停止音频会话并退出