ios:如何检测UITextView是否使用了语音听写?或者在键盘上轻敲麦克风按钮

时间:2016-12-27 11:49:14

标签: objective-c uitextview voice-recognition microphone

如何检测语音听写是否用于UITextView?或者在UI textview中用键盘敲击麦克风按钮

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以使用Siri用于语音识别的Speech Kit框架。 首先导入演讲套件框架,然后确认代表 这是快捷版。这可能会有所帮助

    import Speech

    class ViewController: UIViewController, SFSpeechRecognizerDelegate {

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

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

      override func viewDidLoad() {
        super.viewDidLoad()
        self.authorizeSpeech()
      }

      private func authorizeSpeech() {
        SFSpeechRecognizer.requestAuthorization { (authStatus) in  //4

         var isButtonEnabled = false

         switch authStatus {  //5
          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() {
            print(isButtonEnabled) //this tells that speech authorized or not
         }
       }
      }


    }

现在在您 info.plist

中添加一些自定义消息
   <key>NSMicrophoneUsageDescription</key>  <string>Your microphone will be used to record your speech when you press the Start Recording button.</string>

    <key>NSSpeechRecognitionUsageDescription</key>  <string>Speech recognition will be used to determine which words you speak into this device microphone.</string>

现在创建一个名为startRecording()

的新函数
func startRecording() {

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

let audioSession = AVAudioSession.sharedInstance()
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()

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

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

recognitionRequest.shouldReportPartialResults = true

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

    var isFinal = false

    if result != nil {

        your_text_view.text = result?.bestTranscription.formattedString
        isFinal = (result?.isFinal)!
    }

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

        self.recognitionRequest = nil
        self.recognitionTask = nil


    }
})

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

audioEngine.prepare()

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

}

确认代表

    func speechRecognizer(_ speechRecognizer: SFSpeechRecognizer, availabilityDidChange available: Bool) {
     if available {
        startRecording()
     } else {
      //print("not implement")
     }
    }

答案 1 :(得分:0)

如果要搜索隐藏标签的占位符,请在下面找到一个。

public func textViewDidChange(_ textView: UITextView) {
    if (textView.text?.isEmpty)! {
        lblPlaceholder?.isHidden = false
    } else {
        lblPlaceholder?.isHidden = true
    }
}