Posts

Post not yet marked as solved
0 Replies
330 Views
@objc func recordingStart() { self.inputContainerView.uploadImageView.setBackgroundImage( UIImage(named: "recordred") , for: .normal) // flashing mic button self.timerToBlinkMicButton = Timer.scheduledTimer(timeInterval: TimeInterval(1), target: self, selector: #selector(recordBlink), userInfo: nil, repeats: true) timer for continuous blinking of mic button self.fullsTring = "" audioEngine.reset() if recognitionTask != nil { recognitionTask?.cancel() recognitionTask = nil } let audioSession = AVAudioSession.sharedInstance() if audioSession.availableInputs!.count > 1 { try? audioSession.setCategory(.playAndRecord, mode: .default ,options: [.allowBluetooth, .allowBluetoothA2DP,.allowAirPlay, .defaultToSpeaker]) //for normal phone microphone if let headphones = audioSession.availableInputs?.first(where: { $0.portType == .bluetoothHFP || $0.portType == .bluetoothA2DP || $0.portType == .headphones }) { do { try audioSession.setPreferredInput(headphones) } catch { Alert.showBasic(title: "Bluetooth", message: "Cannot connect your bluetooth", vc: self) } } else { do { try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: .measurement ,options: .defaultToSpeaker) } catch{ Alert.showBasic(title: "Could not access microphone", message: "Try again or Reload Page", vc: self) return } //Alert.showBasic(title: "Charger", message: "charger connected", vc: self) } } else { do { try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: .measurement ,options: [.defaultToSpeaker, .allowBluetooth, .allowBluetoothA2DP]) } catch { Alert.showBasic(title: "Could not access microphone", message: "Try again or Reload Page", vc: self) return } } do{ // try audioSession.setMode(AVAudioSession.Mode.measurement) try audioSession.setPreferredSampleRate(44100.0) try audioSession.setActive(true, options: .notifyOthersOnDeactivation) print("micrange") if audioSession.isInputGainSettable { let error : NSErrorPointer = nil let success = try? audioSession.setInputGain(Float(micrange)) if success == nil{ print ("audio error") // return } if (success != nil) { print("\(String(describing: error))") } } else { print("Cannot set input gain") } } catch { print("audioSession properties weren't set because of an error.") stopRecording() } recognitionRequest = SFSpeechAudioBufferRecognitionRequest() if #available(iOS 13, *) { recognitionRequest?.requiresOnDeviceRecognition = true } else { // Fallback on earlier versions } let inputNode = audioEngine.inputNode guard let recognitionRequest = recognitionRequest else { fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object") } recognitionRequest.shouldReportPartialResults = true //6 self.timerToAgainStartRecording = Timer.scheduledTimer(timeInterval: TimeInterval(40), target: self, selector: #selector(againStartRec), userInfo: nil, repeats: false) recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest, resultHandler: { (result, error ) in //7 var isFinal = false if result != nil { self.timerDidFinishTalk.invalidate() self.timerDidFinishTalk = Timer.scheduledTimer(timeInterval: TimeInterval(self.listeningTime ), target: self, selector: #selector(self.didFinishTalk), userInfo: nil, repeats: false) let bestString = result?.bestTranscription.formattedString self.fullsTring = bestString! isFinal = result!.isFinal } if isFinal { self.audioEngine.stop() inputNode.removeTap(onBus: 0) self.recognitionRequest = nil self.recognitionTask = nil isFinal = false } if error != nil{ print(self.isButtonEnabled) URLCache.shared.removeAllCachedResponses() self.timerToBlinkMicButton.invalidate() DispatchQueue.main.async { self.inputContainerView.uploadImageView.setBackgroundImage( UIImage(named: "microphone") , for: .normal) self.inputContainerView.uploadImageView.alpha = 1.0 } self.recognitionRequest?.endAudio() self.audioEngine.stop() inputNode.removeTap(onBus: 0) guard let task = self.recognitionTask else { return } task.cancel() task.finish() } }) // let recordingFormat = AVAudioFormat(standardFormatWithSampleRate: 44100, channels: 1) audioEngine.reset() inputNode.removeTap(onBus: 0) audioEngine.attach(player) let bus = 0 let recordingFormat = inputNode.inputFormat(forBus: bus) audioEngine.connect(player, to: audioEngine.mainMixerNode, format: recordingFormat) 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.") } self.timerToStartRecording.invalidate() self.hasrecorded = true }
Posted
by smokyweb.
Last updated
.