title: ios speech recognition Error Domain=kAFAssistantErrorDomain Code=216 "(null)"
body: <p>Basically I am learning ios speech recognition module following this tutorial:
  <a href="https://medium.com/ios-os-x-development/speech-recognition-with-swift-in-ios-10-50d5f4e59c48" rel="noreferrer">https://medium.com/ios-os-x-development/speech-recognition-with-swift-in-ios-10-50d5f4e59c48</a></p>
  
  <p>But when I test it on my iphone6, I always got this error:
  Error Domain=kAFAssistantErrorDomain Code=216 "(null)"</p>
  
  <p>I searched it on the internet, but find very rare info about this.</p>
  
  <p>Here is my code:</p>
  
  <pre><code>//
  //  ViewController.swift
  //  speech_sample
  //
  //  Created by Peizheng Ma on 6/22/17.
  //  Copyright © 2017 Peizheng Ma. All rights reserved.
  //
  
  import UIKit
  import AVFoundation
  import Speech
  
  class ViewController: UIViewController, SFSpeechRecognizerDelegate {
  
  //MARK: speech recognize variables
  let audioEngine = AVAudioEngine()
  let speechRecognizer: SFSpeechRecognizer? = SFSpeechRecognizer(locale: Locale.init(identifier: "en-US"))
  var request = SFSpeechAudioBufferRecognitionRequest()
  var recognitionTask: SFSpeechRecognitionTask?
  var isRecording = false
  
  override func viewDidLoad() {
      // super.viewDidLoad()
      // get Authorization
      self.requestSpeechAuthorization()
  }
  
  override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
  }
  
  //MARK: properties
  @IBOutlet weak var detectText: UILabel!
  @IBOutlet weak var startButton: UIButton!
  
  //MARK: actions
  @IBAction func startButtonTapped(_ sender: UIButton) {
      if isRecording == true {
  
  
          audioEngine.stop()
  //            if let node = audioEngine.inputNode {
  //                node.removeTap(onBus: 0)
  //            }
          audioEngine.inputNode?.removeTap(onBus: 0)
          // Indicate that the audio source is finished and no more audio will be appended
          self.request.endAudio()
  
          // Cancel the previous task if it's running
          if let recognitionTask = recognitionTask {
              recognitionTask.cancel()
              self.recognitionTask = nil
          }
  
  
          //recognitionTask?.cancel()
          //self.recognitionTask = nil
          isRecording = false
          startButton.backgroundColor = UIColor.gray
      } else {
          self.recordAndRecognizeSpeech()
          isRecording = true
          startButton.backgroundColor = UIColor.red
      }
  }
  
  //MARK: show alert
  func showAlert(title: String, message: String, handler: ((UIAlertAction) -&gt; Swift.Void)? = nil) {
      DispatchQueue.main.async { [unowned self] in
          let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
          alertController.addAction(UIAlertAction(title: "OK", style: .cancel, handler: handler))
          self.present(alertController, animated: true, completion: nil)
      }
  }
  
  //MARK: Recognize Speech
  func recordAndRecognizeSpeech() {
      // Setup Audio Session
      guard let node = audioEngine.inputNode else { return }
      let recordingFormat = node.outputFormat(forBus: 0)
      node.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
          self.request.append(buffer)
      }
      audioEngine.prepare()
      do {
          try audioEngine.start()
      } catch {
          self.showAlert(title: "SpeechNote", message: "There has been an audio engine error.", handler: nil)
          return print(error)
      }
      guard let myRecognizer = SFSpeechRecognizer() else {
          self.showAlert(title: "SpeechNote", message: "Speech recognition is not supported for your current locale.", handler: nil)
          return
      }
      if !myRecognizer.isAvailable {
          self.showAlert(title: "SpeechNote", message: "Speech recognition is not currently available. Check back at a later time.", handler: nil)
          // Recognizer is not available right now
          return
      }
      recognitionTask = speechRecognizer?.recognitionTask(with: request, resultHandler: { result, error in
          if let result = result {
  
              let bestString = result.bestTranscription.formattedString
              self.detectText.text = bestString
  
  //                var lastString: String = ""
  //                for segment in result.bestTranscription.segments {
  //                    let indexTo = bestString.index(bestString.startIndex, offsetBy: segment.substringRange.location)
  //                    lastString = bestString.substring(from: indexTo)
  //                }
  //                self.checkForColorsSaid(resultString: lastString)
          } else if let error = error {
              self.showAlert(title: "SpeechNote", message: "There has been a speech recognition error.", handler: nil)
              print(error)
          }
      })
  }
  
  //MARK: - Check Authorization Status
  func requestSpeechAuthorization() {
      SFSpeechRecognizer.requestAuthorization { authStatus in
          OperationQueue.main.addOperation {
              switch authStatus {
              case .authorized:
                  self.startButton.isEnabled = true
              case .denied:
                  self.startButton.isEnabled = false
                  self.detectText.text = "User denied access to speech recognition"
              case .restricted:
                  self.startButton.isEnabled = false
                  self.detectText.text = "Speech recognition restricted on this device"
              case .notDetermined:
                  self.startButton.isEnabled = false
                  self.detectText.text = "Speech recognition not yet authorized"
              }
          }
      }
  }
  
  
  }
  </code></pre>
  
  <p>Thank you very much.</p>