【问题标题】:Stop recognition in Swift3 without stop word在没有停用词的情况下停止 Swift3 中的识别
【发布时间】:2017-02-16 00:11:31
【问题描述】:

我正在尝试在文本视图中简化语音框架的使用。我可以使用基于输入文本视图、启动代码或其他操作的代码轻松启动语音识别过程。但是,我也想在没有用户触摸的情况下结束语音识别。我无法在语音框架中找到任何内容来表明有可用的方法来执行此操作。我精心设计了一种方法来完成它,方法是将一个单词定义为停止转录的触发器,然后从转录中删除该单词。它确实有效,但当然用户永远不会说出那个词。有没有更好的方法来处理这个概念? iOS 10、Swift 3、Xcode 8.2.1

这是识别任务的代码子集:

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

【问题讨论】:

  • 您需要定义何时停止识别,是否要在开始后立即停止?那么启动它有什么意义呢?还是您希望它在延迟一段时间后停止它?超时应该会有所帮助。
  • 我想在用户说出指定单词时停止。在上面的代码中,当用户说“关系”时,它会停止。然后从文本中删除关系。没有我的任何代码,用户可以说“逗号”并得到一个逗号。用户可以说“问号”并得到一个问号。我找不到对停用词的引用。
  • 你尝试过使用 NSTimer 吗?
  • 时间并不是真正的问题——我不想等待超时。

标签: ios swift3 speech-recognition sfspeechrecognizer


【解决方案1】:

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

我认为实现目标的最简单方法如下:

  • 您必须建立“静音间隔”,这意味着如果用户不说话的时间大于您停止说话的间隔(即 2 秒)。

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

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

  • 当您在recognitionTaskinvalidate 中获得新的转录并重新启动您的计时器时

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

  • 如果计时器到期,这意味着用户在 2 秒内没有说话。您可以安全地停止音频会话并退出

【讨论】:

    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 2021-10-19
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多