无法将音频文件编码为 Base64?

Can't encode an Audio file to Base64?

Objective:对话流语音机器人 Api

我需要将一个 wav 文件发送到对话流 Api,格式和设置已预先定义。

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)
    }
}
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 文件

这是有效 headers 的 wav 文件的样子