2017-02-16 1 views
1

Je tente de simplifier l'utilisation de la structure de la parole dans une vue de texte. Je peux facilement démarrer le processus de reconnaissance vocale avec du code basé sur l'entrée dans le texte, le code de démarrage ou d'autres actions. Cependant, je veux également mettre fin à la reconnaissance vocale sans les touches de l'utilisateur. Je n'ai pas été en mesure de trouver quelque chose dans le cadre de discours pour indiquer qu'il existe des méthodes disponibles pour le faire. J'ai conçu un moyen de l'accomplir en définissant un mot pour être le déclencheur pour arrêter la transcription, puis pour enlever le mot de la transcription. Cela fonctionne, mais bien sûr, l'utilisateur ne peut jamais prononcer ce mot. Y a-t-il une meilleure façon de gérer ce concept? iOS 10, Swift 3, Xcode 8.2.1Arrêter la reconnaissance dans Swift3 sans mot d'arrêt

Voici le sous-ensemble du code pour le 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

Vous devez définir quand vous voulez arrêter la reconnaissance, voulez-vous l'arrêter juste après le démarrage? Quel est le sens de commencer alors? Ou voulez-vous l'arrêter après un certain temps? Timeout devrait aider alors. –

+0

Je veux arrêter lorsque l'utilisateur dit un mot spécifié. Dans le code ci-dessus, lorsque l'utilisateur dit "Relation" il s'arrête. La relation est ensuite supprimée du texte. Sans aucun code de ma part, l'utilisateur peut dire "virgule" et obtenir une virgule. L'utilisateur peut dire "point d'interrogation" et obtenir un point d'interrogation. Je ne trouve pas de référence à un mot d'arrêt. – user2698617

+0

Avez-vous essayé d'utiliser un NSTimer? – Devang

Répondre

2

Il semble que le drapeau isFinal ne devient vrai lorsque l'utilisateur cesse de parler comme prévu. Je suppose qu'il s'agit d'un comportement recherché par Apple, car l'événement "User stops talk" est un événement non défini.

Je crois que la meilleure façon d'atteindre votre objectif est la suivante:

  • Vous devez estabilish un « intervalle de silence » qui signifie que si l'utilisateur ne parle pas pour un temps supérieur à votre intervalle, il a cessé de parler (soit 2 secondes).

  • Créer une minuterie au début de la session audio:

timer var = NSTimer.scheduledTimerWithTimeInterval (2, cible: auto, sélecteur: "didFinishTalk", userInfo: néant, répète: false)

  • lorsque vous obtenez de nouvelles transcriptions dans recognitionTask invalidate et redémarrez votre minuterie

    timer.invalidate() timer = NSTimer.scheduledTimerWithTimeInterval (2, cible: auto, sélecteur: "didFinishTalk", userInfo: néant, répète: false)

  • si la minuterie arrive à expiration, cela signifie que l'utilisateur ne parle pas de 2 secondes. Vous pouvez arrêter en toute sécurité la session audio et quitter