Не можете кодировать аудиофайл в Base64? - PullRequest
1 голос
/ 14 октября 2019

Цель: Dialog Flow Voice Bot Api

Мне нужно отправить файл wav в Dialog Flow 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)

Поэтому, когда я пытаюсь декодировать эту закодированную строку, используя онлайн-конвертер , он отображает некоторые поврежденные байты Decoded output

Мысли ??

1 Ответ

1 голос
/ 14 октября 2019

Итак, я нашел ответ на вопрос. Причина, по которой мой байтовый массив не смог поддерживать правильные заголовки, заключалась в том, что ключ, который я пропустил в переменной 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 автоматически подготовит файл из формата определено в файле. 101

Но оказывается, что тоже не помогло ?

Так что, пока я играл с настройками, я нашел это очень важным ключ AVAudioFileTypeKey, который помогал поддерживать правильные заголовки и, следовательно, действительный файл .wav ?

Вот так выглядит файл wav с действительными заголовками A valid file

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...