无法将音频文件编码为 Base64?
Can't encode an Audio file to Base64?
Objective:对话流语音机器人 Api
我需要将一个 wav 文件发送到对话流 Api,格式和设置已预先定义。
- 所以我使用
AVAudioRecorder
以 .wav
格式录制了一段音频
以下设置
audioFilename = getDocumentsDirectory().appendingPathComponent("input.wav")
let settings: [String: Any] = [
AVFormatIDKey: Int(kAudioFormatLinearPCM),
AVSampleRateKey: 16000,
AVNumberOfChannelsKey: 2,
AVLinearPCMBitDepthKey: 16,
AVLinearPCMIsBigEndianKey: false,
AVEncoderAudioQualityKey: AVAudioQuality.max.rawValue
]
do {
audioRecorder = try AVAudioRecorder(url: audioFilename!, settings: settings)
audioRecorder.isMeteringEnabled = true
audioRecorder.prepareToRecord()
audioRecorder.delegate = self
audioRecorder.record()
recordButton.setTitle("Tap to Stop", for: .normal)
} catch {
print(error.localizedDescription)
finishRecording(success: false)
}
}
- 然后我尝试将其转换成
Base64
音频格式
let outputFile = try Data.init(contentsOf: fileUrl)
let base64String = outputFile.base64EncodedString(options: NSData.Base64EncodingOptions.init(rawValue: 0))
print(base64String)
因此,每当我尝试使用 online converter 解码该编码字符串时,它都会显示一些损坏的字节
想法??
所以我找到了问题的答案。
我的字节数组无法保持正确 headers 的原因是因为我在 settings
变量
中省略了一个键
AVAudioFileTypeKey: kAudioFileWAVEType
let settings: [String: Any] = [
AVSampleRateKey: 16000,
AVNumberOfChannelsKey: 1,
AVAudioFileTypeKey: kAudioFileWAVEType, //MANDATORY
AVFormatIDKey: kAudioFormatLinearPCM,
AVLinearPCMIsBigEndianKey: false,
AVLinearPCMIsNonInterleaved: true,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
文档 中给出,如果您不提供设置,即
audioRecorder = try AVAudioRecorder(url: audioFilename!, settings: [:] /*empty settings*/)
然后
❌ AVAudio recorder will automatically prepare the file from the Format defined in the file. ❌
但事实证明,也没有帮助
所以当我在玩这些设置时,我发现这个非常重要键AVAudioFileTypeKey
,它有助于保持正确的headers,因此有效 .wav
文件
Objective:对话流语音机器人 Api
我需要将一个 wav 文件发送到对话流 Api,格式和设置已预先定义。
- 所以我使用
AVAudioRecorder
以.wav
格式录制了一段音频 以下设置
audioFilename = getDocumentsDirectory().appendingPathComponent("input.wav")
let settings: [String: Any] = [
AVFormatIDKey: Int(kAudioFormatLinearPCM),
AVSampleRateKey: 16000,
AVNumberOfChannelsKey: 2,
AVLinearPCMBitDepthKey: 16,
AVLinearPCMIsBigEndianKey: false,
AVEncoderAudioQualityKey: AVAudioQuality.max.rawValue
]
do {
audioRecorder = try AVAudioRecorder(url: audioFilename!, settings: settings)
audioRecorder.isMeteringEnabled = true
audioRecorder.prepareToRecord()
audioRecorder.delegate = self
audioRecorder.record()
recordButton.setTitle("Tap to Stop", for: .normal)
} catch {
print(error.localizedDescription)
finishRecording(success: false)
}
}
- 然后我尝试将其转换成
Base64
音频格式
let outputFile = try Data.init(contentsOf: fileUrl)
let base64String = outputFile.base64EncodedString(options: NSData.Base64EncodingOptions.init(rawValue: 0))
print(base64String)
因此,每当我尝试使用 online converter 解码该编码字符串时,它都会显示一些损坏的字节
想法??
所以我找到了问题的答案。
我的字节数组无法保持正确 headers 的原因是因为我在 settings
变量
AVAudioFileTypeKey: kAudioFileWAVEType
let settings: [String: Any] = [
AVSampleRateKey: 16000,
AVNumberOfChannelsKey: 1,
AVAudioFileTypeKey: kAudioFileWAVEType, //MANDATORY
AVFormatIDKey: kAudioFormatLinearPCM,
AVLinearPCMIsBigEndianKey: false,
AVLinearPCMIsNonInterleaved: true,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
文档 中给出,如果您不提供设置,即
audioRecorder = try AVAudioRecorder(url: audioFilename!, settings: [:] /*empty settings*/)
然后
❌ AVAudio recorder will automatically prepare the file from the Format defined in the file. ❌
但事实证明,也没有帮助
所以当我在玩这些设置时,我发现这个非常重要键AVAudioFileTypeKey
,它有助于保持正确的headers,因此有效 .wav
文件