2017-06-15 2 views
0

Ein Neuling zu swift! Ich versuche, eine App zu implementieren, die Sprache in Text mithilfe von Spracherkennung konvertiert.iPhone Simulator 10.0 - Spracherkennung nicht verfügbar

Problem
SFSpeechRecognizer().isAvailable ist false

private let request = SFSpeechAudioBufferRecognitionRequest() 
private var task: SFSpeechRecognitionTask? 
private let engine = AVAudioEngine() 

func recognize() { 
     guard let node = engine.inputNode else { 
      return 
     } 

     let recordingFormat = node.outputFormat(forBus: 0) 
     node.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in 
      self.recognitionRequest.append(buffer); 
     } 

     engine.prepare() 
     do { 
      try engine.start() 
     } catch { 
      return print(error) 
     } 

     guard let systemRecognizer = SFSpeechRecognizer() else { 
      return 
     } 

     if !systemRecognizer.isAvailable { 
      self.log(.debug, msg: "Entered this condition and stopped!") 
      return 
     } 
} 

Frage
Ich bin nicht sicher, warum es in den Simulator anhält. Funktioniert das Mikrofon im iPhone Simulator?

aktualisieren Ich habe versucht, Tests mit einer Audio-Datei mit folgendem Code,

let audioFile = Bundle.main.url(forResource: "create_activity", withExtension: "m4a", subdirectory: "Sample Recordings") 
let recognitionRequest = SFSpeechURLRecognitionRequest(url: audioFile!) 

immer Fehler, der sagt, Error Domain=kAFAssistantErrorDomain Code=1101 "(null)"

+1

Sehen Sie dies zum Beispiel http://cleanswifter.com/sfspeechrecognizer-tips-for-ios-10/ –

+0

Also bedeutet es, dass wir es durch eine Audio-Datei nur testen können, wenn wir in einem Simulator sind. Recht? – moustacheman

+1

ja richtig, .... –

Antwort

0

es, dass Simulator sieht Zugriff auf Mikrofon mit iOS gewonnen hat 11. Leider konnte ich keine Dokumentation finden, die das bestätigt, kann diese Funktionalität aber mit dem folgenden Codebeispiel bestätigen. Funktioniert einwandfrei auf iOS 11-Simulator, tut aber nichts auf iOS 10 Simulator (oder früher).

import UIKit 
import Speech 

class ViewController: UIViewController { 

    private var recognizer = SFSpeechRecognizer() 
    private var request = SFSpeechAudioBufferRecognitionRequest() 
    private let engine = AVAudioEngine() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     requestPermissions() 
    } 

    private func requestPermissions() { 
     // 
     // Do not forget to add `NSMicrophoneUsageDescription` and `NSSpeechRecognitionUsageDescription` to `Info.plist` 
     // 

     // Request recording permission 
     AVAudioSession.sharedInstance().requestRecordPermission { allowed in 
      if allowed { 
       // Request speech recognition authorization 
       SFSpeechRecognizer.requestAuthorization { status in 
        switch status { 
        case .authorized: self.prepareSpeechRecognition() 
        case .notDetermined, .denied, .restricted: print("SFSpeechRecognizer authorization status: \(status).") 
        } 
       } 

      } else { 
       print("AVAudioSession record permission: \(allowed).") 
      } 
     } 
    } 

    private func prepareSpeechRecognition() { 
     // Check if recognizer is available (has failable initializer) 
     guard let recognizer = recognizer else { 
      print("SFSpeechRecognizer not supported.") 
      return 
     } 

     // Prepare recognition task 
     recognizer.recognitionTask(with: request) { (result, error) in 
      if let result = result { 
       print("SFSpeechRecognizer result: \(result.bestTranscription.formattedString)") 
      } else { 
       print("SFSpeechRecognizer error: \(String(describing: error))") 
      } 
     } 

     // Install tap to audio engine input node 
     let inputNode = engine.inputNode 
     let busNumber = 0 
     let recordingFormat = inputNode.outputFormat(forBus: busNumber) 
     inputNode.installTap(onBus: busNumber, bufferSize: 1024, format: recordingFormat) { buffer, time in 
      self.request.append(buffer); 
     } 

     // Prepare and start audio engine 
     engine.prepare() 

     do { 
      try engine.start() 
     } catch { 
      return print(error) 
     } 
    } 

} 

Vergessen Sie nicht, NSMicrophoneUsageDescription und NSSpeechRecognitionUsageDescription zu Info.plist hinzuzufügen.