简体   繁体   English

用户讲话时自动开始录音

[英]Automatically Start audio recording when user speaks

I am trying to start recording when the user starts to talk and stops recording when the user is done talking. 我正在尝试在用户开始讲话时开始录制,而在用户完成讲话后停止录制。 And I want to limit the maximum record audio length.I could not be able to find enough function in AVAudioRecorderDelegate.Hope you understand my problem.Thanks in Advance 我想限制最大录制音频长度。我无法在AVAudioRecorderDelegate中找到足够的功能。希望您理解我的问题。

@IBAction func recordAudio(_ sender: Any) {
    recordingLabel.text = "Recording in progress..."
    let dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask, true)[0] as String
    let recordingName = "recordedVoice.wav"
    let pathArray = [dirPath, recordingName]
    let filePath = URL(string: pathArray.joined(separator: "/"))

    let session = AVAudioSession.sharedInstance()
    try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, with:AVAudioSessionCategoryOptions.defaultToSpeaker)

    try! audioRecorder = AVAudioRecorder(url: filePath!, settings: [:])
    audioRecorder.delegate = self
    audioRecorder.isMeteringEnabled = true
    audioRecorder.prepareToRecord()
    audioRecorder.record()
}

@IBAction func stopRecording(_ sender: Any) {
    recordButton.isEnabled = true
    stopRecordingButton.isEnabled = false
    recordingLabel.text = "Tap to record..."

    audioRecorder.stop()
    let audioSession = AVAudioSession.sharedInstance()
    try! audioSession.setActive(false)
}

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
    if (flag) {
        //Success
    } else {
        print("Could not save audio recording!")
    }
}

To Record Audio When user tak1 you need some steps 录制音频当用户tak1时,您需要一些步骤

1. Permission from User to all your app to use Mic 1.用户对您所有应用程序使用Mic的许可

In your Info Plist Add Privacy - Microphone Usage Description in user Plist and add Text Description 在您的信息列表中,在用户列表中添加Privacy - Microphone Usage Description ,并添加文字说明

2. Location to save Recorded File user FileManager 2.保存记录文件用户FileManager

3. To End After time : use audioRecorder.record(forDuration: 30) // record for 30 Sec 3.结束时间 :使用audioRecorder.record(forDuration: 30) // record for 30 Sec

Check complete code : 检查完整的代码:

import UIKit
import AVFoundation

class ViewController: UIViewController  {

   @IBOutlet weak var recordButton: UIButton!
    var recordingSession: AVAudioSession!
    var audioRecorder: AVAudioRecorder!


    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func recordAudio(_ sender: Any) {
        self.requestRecordPermission()
    }

    func requestRecordPermission() {
        recordingSession = AVAudioSession.sharedInstance()
        do {
            try recordingSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
            try recordingSession.setActive(true)
            recordingSession.requestRecordPermission() { [unowned self] allowed in
                DispatchQueue.main.async {
                    if allowed {
                        // User allow you to record

                        // Start recording and change UIbutton color
                        self.recordButton.backgroundColor = .red
                        self.startRecording()

                    } else {
                        // failed to record!
                    }
                }
            }
        } catch {
            // failed to record!
        }
    }
    func startRecording() {

        let audioFilename = getDocumentsDirectory().appendingPathComponent("recordedFile.m4a")

        let settings = [
            AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
            AVSampleRateKey: 12000,
            AVNumberOfChannelsKey: 1,
            AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
        ]

        do {
            audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
            audioRecorder.delegate = self
            audioRecorder.record(forDuration: 30)  // record for 30 Sec
            recordButton.setTitle("Tap to Stop", for: .normal)
            recordButton.backgroundColor = .green

        } catch {
            finishRecording(success: false)
        }
    }
    func getDocumentsDirectory() -> URL {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        return paths[0]
    }

    @objc func recordTapped() {
        if audioRecorder == nil {
            startRecording()
        } else {
            finishRecording(success: true)
        }
    }

    public func finishRecording(success: Bool) {
        audioRecorder.stop()
        audioRecorder = nil

        if success {
            // record sucess
            recordButton.backgroundColor = .green
        } else {
            // record fail

            recordButton.backgroundColor = .yellow

        }
    }

}


extension ViewController :AVAudioRecorderDelegate{


    func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
        if !flag {
            finishRecording(success: false)
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM