2017-06-21 4 views
0

Die App, die ich gerade in Swift mache, wird Blinden helfen, mit dieser umfassenden Lösung durch die Welt zu navigieren. Ich suche nach einer generischen Funktion für die App, die, wenn sie aufgerufen wird, sofort mit der Aufnahme beginnt, dem Benutzer zuhört, etwas zu sagen, und sobald der Benutzer aufhört zu sprechen, stoppt er automatisch die Aufnahme, wandelt die Aufzeichnung in eine Zeichenkette um und kehrt zurück es. Diese Funktion sollte in einem einzelnen View-Controller mehr als einmal verwendet werden können.Voice to String in Swift

Ich habe mit der Technik aus diesem Artikel versucht und es hat nicht funktioniert: https://medium.com/ios-os-x-development/speech-recognition-with-swift-in-ios-10-50d5f4e59c48

Der Recorder den Namen eines Gebäude oder ein Zimmer in einem Gebäude zu sammeln werden, so dass es muß nicht sein Aufnahme für schrecklich lange - selbst eine eingestellte Zeit von 5 Sekunden würde funktionieren. Ich hoffe, ein Framework wie Speech oder etwas mit Siri zu verwenden, aber ich bin nicht dagegen, ein externes Framework wie Watson zu verwenden, wenn es besser funktioniert. Bitte helfen Sie!

Antwort

0

Es gibt eine schöne appcoda Tutorial here, die perfekt passt.

Dies ist der Code, den sie verwendet haben, um ein Textfeld mit den Sprachresultaten zu aktualisieren. Es kann nicht allzu schwierig sein, den Text in seinem Textfeld in eine Variable/Funktion zu kanalisieren, die Sie zur Bearbeitung des Ergebnisses verwenden.

// 
// ViewController.swift 
// Siri 
// 
// Created by Sahand Edrisian on 7/14/16. 
// Copyright © 2016 Sahand Edrisian. All rights reserved. 
// 

import UIKit 
import Speech 

class ViewController: UIViewController, SFSpeechRecognizerDelegate { 

    @IBOutlet weak var textView: UITextView! 
    @IBOutlet weak var microphoneButton: UIButton! 

    private let speechRecognizer = SFSpeechRecognizer(locale: Locale.init(identifier: "en-US"))! 

    private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest? 
    private var recognitionTask: SFSpeechRecognitionTask? 
    private let audioEngine = AVAudioEngine() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     microphoneButton.isEnabled = false 

     speechRecognizer.delegate = self 

     SFSpeechRecognizer.requestAuthorization { (authStatus) in 

      var isButtonEnabled = false 

      switch authStatus { 
      case .authorized: 
       isButtonEnabled = true 

      case .denied: 
       isButtonEnabled = false 
       print("User denied access to speech recognition") 

      case .restricted: 
       isButtonEnabled = false 
       print("Speech recognition restricted on this device") 

      case .notDetermined: 
       isButtonEnabled = false 
       print("Speech recognition not yet authorized") 
      } 

      OperationQueue.main.addOperation() { 
       self.microphoneButton.isEnabled = isButtonEnabled 
      } 
     } 
    } 

    @IBAction func microphoneTapped(_ sender: AnyObject) { 
     if audioEngine.isRunning { 
      audioEngine.stop() 
      recognitionRequest?.endAudio() 
      microphoneButton.isEnabled = false 
      microphoneButton.setTitle("Start Recording", for: .normal) 
     } else { 
      startRecording() 
      microphoneButton.setTitle("Stop Recording", for: .normal) 
     } 
    } 

    func startRecording() { 

     if recognitionTask != nil { //1 
      recognitionTask?.cancel() 
      recognitionTask = nil 
     } 

     let audioSession = AVAudioSession.sharedInstance() //2 
     do { 
      try audioSession.setCategory(AVAudioSessionCategoryRecord) 
      try audioSession.setMode(AVAudioSessionModeMeasurement) 
      try audioSession.setActive(true, with: .notifyOthersOnDeactivation) 
     } catch { 
      print("audioSession properties weren't set because of an error.") 
     } 

     recognitionRequest = SFSpeechAudioBufferRecognitionRequest() //3 

     guard let inputNode = audioEngine.inputNode else { 
      fatalError("Audio engine has no input node") 
     } //4 

     guard let recognitionRequest = recognitionRequest else { 
      fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object") 
     } //5 

     recognitionRequest.shouldReportPartialResults = true //6 

     recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in //7 

      var isFinal = false //8 

      if result != nil { 

       self.textView.text = result?.bestTranscription.formattedString //9 
       isFinal = (result?.isFinal)! 
      } 

      if error != nil || isFinal { //10 
       self.audioEngine.stop() 
       inputNode.removeTap(onBus: 0) 

       self.recognitionRequest = nil 
       self.recognitionTask = nil 

       self.microphoneButton.isEnabled = true 
      } 
     }) 

     let recordingFormat = inputNode.outputFormat(forBus: 0) //11 
     inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in 
      self.recognitionRequest?.append(buffer) 
     } 

     audioEngine.prepare() //12 

     do { 
      try audioEngine.start() 
     } catch { 
      print("audioEngine couldn't start because of an error.") 
     } 

     textView.text = "Say something, I'm listening!" 

    } 

    func speechRecognizer(_ speechRecognizer: SFSpeechRecognizer, availabilityDidChange available: Bool) { 
     if available { 
      microphoneButton.isEnabled = true 
     } else { 
      microphoneButton.isEnabled = false 
     } 
    } 
} 
+0

--------------- :) – SahandTheGreat

+0

Leider funktioniert dieses Tutorial nicht. Ich habe das Tutorial geöffnet, die ganze Sache abgeschlossen und es funktioniert nicht. Er sagt immer wieder "fataler Fehler: unerwartet wurde Null gefunden, wenn ein optionaler Wert ausgepackt wird" und nicht nur das, aber der Code selbst scheint nicht in der Lage zu sein, in mehr als einer Instanz ausgeführt zu werden. Danke für die Hilfe, aber das hat das Problem nicht gelöst –