2017-02-16 54 views
1

我試圖在textview中簡化語音框架的使用。我可以基於輸入文本視圖,啓動代碼或其他操作輕鬆啓動語音識別過程。但是,我也想在沒有用戶接觸的情況下結束語音識別。我一直無法在Speech框架中找到任何內容來表明有可用的方法來執行此操作。我已經制定了一種方法來完成它,方法是定義一個詞作爲停止轉錄的觸發器,然後從轉錄中刪除該詞。它確實有效,但用戶當然不會說這個詞。有沒有更好的方法來處理這個概念? iOS的10,斯威夫特3時,Xcode 8.2.1在Swift3中停止識別而不停用詞

這裏是代號爲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 
+0

您需要定義何時要停止識別,是否要在開始後立即停止識別?那麼啓動它有什麼意義?或者你想讓它在一段時間之後停下來嗎?超時應該有幫助。 –

+0

我想在用戶說出指定的單詞時停止。在上面的代碼中,當用戶說「關係」時,它停止。然後關係從文本中刪除。沒有我的任何代碼,用戶可以說「逗號」並得到一個逗號。用戶可以說「問號」並獲得一個問號。我找不到一個停用詞的參考。 – user2698617

+0

你嘗試過使用NSTimer嗎? – Devang

回答

2

看來,當用戶停止說話預期isFinal標誌不會成真。我想這是蘋果想要的行爲,因爲事件「用戶停止說話」是一個未定義的事件。

我認爲,要實現自己的目標的最簡單的方法是如下:

  • 你必須estabilish的,這意味着如果用戶沒有持續時間超過交談更大的「沉默的間隔」你他已經停止說話的時間間隔(即2秒)。

變種計時器= NSTimer.scheduledTimerWithTimeInterval:

  • 在音頻會議開始創建一個定時器(2,目標:自,選擇器: 「didFinishTalk」,用戶信息:無,重複:假)

    • 當你在recognitionTask無效,並重新啓動定時器

      timer.invalidate新的轉錄() timer = NSTimer.scheduledTimerWithTimeInterval(2,target:self,selector:「didFinishTalk」,userInfo:nil,repeatats:false)

    • 如果定時器到期,這意味着用戶不會從2秒開始通話。您可以安全地停止音頻會話並退出