每2分钟录制一次用户语音和明文文件

时间:2018-03-20 08:31:53

标签: ios swift text-files speech-recognition

我是swift的新手,我在记录用户声音的项目中工作,并且每两分钟将声音文件转换为文本文件。我使用计时器每2分钟重复一次步骤。

问题是录音机在第二次通话时被禁用。此外,文本文件不会清除准备下次调用的内容。

这是完整的代码。

import UIKit
import Speech
import AVFoundation



class ViewController: UIViewController {
var audioRecorder:AVAudioRecorder!
var inString = ""
let fileName = "Test"
  var str=""
appropriateFor: nil, create: true)
let recordSettings = [AVSampleRateKey : NSNumber(value: Float(44100.0)),
                      AVFormatIDKey : NSNumber(value: Int32(kAudioFormatMPEG4AAC)),
                      AVNumberOfChannelsKey : NSNumber(value: Int32(1)),
                      AVEncoderAudioQualityKey : NSNumber(value: Int32(AVAudioQuality.high.rawValue))]
var  timer = Timer()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    var audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try audioRecorder = AVAudioRecorder(url: directoryURL()!, settings: recordSettings)
        audioRecorder.prepareToRecord()
    } catch {

        print("error")
    }
    audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
        requestSpeechAuth()
    } catch {}
    timer = Timer.scheduledTimer(timeInterval: 120, target: self, selector: #selector (ViewController.stopAudio), userInfo: nil, repeats: true)
}

@objc func stopAudio() {
    audioRecorder.stop()
    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setActive(false)

        let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ar_SA"))
        let request = SFSpeechURLRecognitionRequest(url: audioRecorder.url)
        recognizer?.recognitionTask(with: request) { (result, error) in
            if let error = error {
                print("There was an error: \(error)")
            } else {
                let dir = try? FileManager.default.url(for: .documentDirectory,
                                                       in: .userDomainMask, appropriateFor: nil, create: true)
                if let fileURL = dir?.appendingPathComponent(self.fileName).appendingPathExtension("txt") {
                    do {
                        self.str=""
                        self.str = (result?.bestTranscription.formattedString)!
                        try self.str.write(to: fileURL, atomically: true, encoding: .utf8)
                    } catch {
                        print("Failed writing to URL: \(fileURL), Error: " + error.localizedDescription)
                    }
                    do {
                        self.inString = try String(contentsOf: fileURL)
                    } catch {
                        print("Failed reading from URL: \(fileURL), Error: " + error.localizedDescription)
                    }
                    self.getIqama(fileN: self.inString,status: self.str)
                }
            }//end elsd

        } //end result

    } catch {} //end do for false
    // requestSpeechAuth()
}

func directoryURL() -> URL? {
    let fileManager = FileManager.default
    let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
    let documentDirectory = urls[0] as URL
    let soundURL = documentDirectory.appendingPathComponent("AqimAlsalat.m4a")
    return soundURL
}






func getIqama(fileN : String, status:String)
{

    var st: String!
  st = "السلام عليكم ورحمة الله السلام عليكم ورحمة الله"

    let st1 : String!
    st1 = String (fileN)
    print(st1)
    if st1 == st {

        // audioEngine.stop()
        //speechRecognitionRequest?.endAudio()
        print(st1)
          print("JJalal")
    }
    else {
        print("Dalal")
        print(fileN)
    }
}

func requestSpeechAuth(){
    SFSpeechRecognizer.requestAuthorization { authStatus in
        if authStatus == SFSpeechRecognizerAuthorizationStatus.authorized {
            let audioSession = AVAudioSession.sharedInstance()
            do {
                try audioSession.setActive(true)
                self.audioRecorder.record()
            } catch {}
        }
    }
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

任何建议或想法?

由于

1 个答案:

答案 0 :(得分:0)

在停止录制以将声音文件转换为文本后,您似乎需要再次调用self.audioRecorder.record()Apple docs表示调用record()会创建或删除音频文件,因此应解决您的问题。

但是,在转录文本时,您可能会遇到另一个错过录制时间的问题。您可以考虑通过在两个录像机之间来回切换来解决该问题,或者您可以尝试在开始再次录制之前更改录音机的文件位置(或更改上一个文件的位置)。