我正在尝试录制语音消息,当我保存URL并使用AVAudioPlayer播放时,该消息是如此之低,以至于几乎听不到它。我什至将音量设置为1.0
这是我录制音频消息的功能:
func startRecordingSpeech() {
if recognitionTask != nil {
recognitionTask?.cancel()
recognitionTask = nil
}
let audioSession = AVAudioSession()
do {
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try audioSession.setMode(AVAudioSessionModeMeasurement)
try audioSession.setActive(true)
AVAudioSessionCategoryOptions.mixWithOthers
} catch {
print("audioSession properties weren't set because of an error.")
}
recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
let inputNode = audioEngine.inputNode
recognitionRequest!.shouldReportPartialResults = true
recognitionTask = speechRecognizer!.recognitionTask(with: recognitionRequest!, resultHandler: { (result, error) in
var isFinal = false
if result != nil {
self.audioMessage.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 uuid = NSUUID().uuidString
audioReactionUrl = getDocumentsDirectory().appendingPathComponent("recording\(uuid).m4a")
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.")
}
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
do {
self.audioRecorder = try AVAudioRecorder(url: audioReactionUrl!, settings: settings)
self.audioRecorder.record()
} catch {
finishRecording(success: false)
}
}
上面的代码片段显示了一个功能,该功能可以测量语音并将其转换为文本,同时还将完成的录音保存为URL的音频文件。
下面是在下一个视图控制器上播放音频文件时调用的函数。
func play(url:URL) {
print("playing \(url)")
do {
try AVAudioSession().setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.defaultToSpeaker)
self.player = try AVAudioPlayer(contentsOf: url)
player!.prepareToPlay()
player!.volume = 1.0
player!.play()
} catch let error as NSError {
//self.player = nil
print(error.localizedDescription)
} catch {
print("AVAudioPlayer init failed")
}
}