2017-07-14 5 views
1

Ich habe nach einer Lösung gesucht, aber alle die ich gesehen habe, sind verwirrend, also dachte ich, ich würde eine neue Frage erstellen.Swift: Stoppen Sie die Spracherkennung nach x Sekunden Stille

Ich verwende die Sprachbibliothek und ich möchte, dass die Erkennungsaufgabe nach 2 Sekunden ohne Eingabe vom Benutzer beendet wird. Ich weiß, dass ich einen Timer verwenden möchte, aber ich habe Probleme herauszufinden, wo ich ihn hinstellen und wie ich ihn aktualisieren kann.

Ich starte den Timer, wenn die Aufnahmetaste gedrückt wird, und ich mache ihn ungültig, wenn die Stopptaste gedrückt wird.

Aber wo überprüfe ich, ob der Benutzer neue Eingaben hinzugefügt hat? Ich dachte daran, die letzte Transkription zu speichern und sie mit der nächsten zu vergleichen: Wenn sie anders sind, setze den Timer zurück.

Hier ist, was mein Code wie folgt aussieht:

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: []) 
    } 
} 

Antwort

0

ich bis jetzt hatte das gleiche Problem. Haben Sie Ihre Frage überprüft und ich nehme an, dass der folgende Code Ihnen hilft, dasselbe zu erreichen, was ich getan habe.

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() 
      }) 
     } 

    }) 

Dies überprüft, ob die Eingabe für 1,5 Sekunden nicht empfangen wurde.

0

Dies ist, was für mich arbeiten endete:

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

Und innerhalb der Erkennungsaufgabe:

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