2017-06-21 81 views
0

我目前在Swift中制作的应用程序将帮助盲人使用这一综合解决方案导航世界。我正在寻找一个应用程序的通用函数,当被调用时,它将立即开始录制,倾听用户说出的内容,一旦用户停止说话,它将自动停止录制,将录制内容转换为字符串,然后返回它。该功能应该可以在单个视图控制器中多次使用。Swift中的声音

我一直在使用从这篇文章的技术尝试,并没有奏效:https://medium.com/ios-os-x-development/speech-recognition-with-swift-in-ios-10-50d5f4e59c48

的记录将被收集的建筑物或建筑物中的房间的名称,所以它并不需要是录制时间非常长 - 即使是5秒钟的设定时间也可以工作。我希望能像Speech一样使用像Siri这样的框架,但如果它更好地工作,我并不反对使用像Watson这样的外部框架。请帮忙!

回答

0

有一个美丽的Appcoda教程here,完全适合这一点。

这是他们用来用语音结果更新文本字段的代码。将文本字段中的文本引导到用于处理结果的任何变量/函数中并不困难。

// 
// 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

不幸的是,教程不起作用。我打开教程,完成了整个事情,但它不起作用。它一直说“致命错误:在解包可选值时意外发现零”,不仅如此,而且代码本身看起来不能在多个实例中运行。感谢您的帮助,但这并没有解决问题 –