解決使用 AVAudioRecorder 錄音儲存 .WAV 檔案遇到的問題
問題背景
伺服器接收到檔案並進行語音識別,使用的是微軟語音,只支援 PCM 資料來源的 WAV 格式。
問題程式碼
- (NSDictionary *)getAudioSetting { NSMutableDictionary *dicM=[NSMutableDictionary dictionary]; //設定錄音格式 [dicM setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey]; //設定錄音取樣率,8000是電話取樣率,對於一般錄音已經夠了 [dicM setObject:@(16000) forKey:AVSampleRateKey]; //設定通道,這裡採用單聲道 1 2 [dicM setObject:@(2) forKey:AVNumberOfChannelsKey]; //每個取樣點位數,分為8、16、24、32 [dicM setObject:@(16) forKey:AVLinearPCMBitDepthKey]; //是否使用浮點數取樣 [dicM setObject:@(NO) forKey:AVLinearPCMIsFloatKey]; //....其他設定等 return dicM; }
在沒有使用微軟語音識別庫之前,使用上面的程式碼沒有任何問題。識別庫更新之後,不識別上傳的的音訊檔案。
一開始以為是因為沒有使用浮點數取樣導致音訊檔案被壓縮。修改後依然沒有解決問題。
經過和伺服器的聯調,發現 .wav 音訊檔案的頭不資訊服務區無法識別。
解決方案
當音訊檔案儲存為 .wav 格式的時候,iOS11 以下的系統,.wav 檔案的頭部資訊是沒問題,但是在 iOS11+ .wav 檔案的頭部資訊服務區識別不了。
需要設定 AVAudioFileTypeKey 來解決這個問題。程式碼如下:
- (NSDictionary *)getAudioSetting { NSMutableDictionary *dicM=[NSMutableDictionary dictionary]; //設定錄音格式 [dicM setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey]; if (@available(iOS 11.0, *)) { [dicM setObject:@(kAudioFileWAVEType) forKey:AVAudioFileTypeKey]; } else { // Fallback on earlier versions } //設定錄音取樣率,8000是電話取樣率,對於一般錄音已經夠了 [dicM setObject:@(16000) forKey:AVSampleRateKey]; //設定通道,這裡採用單聲道 1 2 [dicM setObject:@(2) forKey:AVNumberOfChannelsKey]; //每個取樣點位數,分為8、16、24、32 [dicM setObject:@(16) forKey:AVLinearPCMBitDepthKey]; //是否使用浮點數取樣 [dicM setObject:@(NO) forKey:AVLinearPCMIsFloatKey]; //....其他設定等 return dicM; }
「其他文章」
- 一文給你搞定Elasticsearch技術掃盲
- Go程式語言的真正優點是什麼?
- 用Python爬了我的微信好友,他們是這樣的...
- 位元組面試也會問SPI機制?
- Volatile關鍵字能保證原子性麼?
- 種草 Vue3 中幾個好玩的外掛和配置
- Vue 狀態管理未來樣子
- 一門語言的作用域和函式呼叫是如何實現的
- 關於多執行緒同步的一切:偽共享
- Swift 與 Go:蘋果與谷歌的較量
- Android 自定義View - 柱狀波形圖 wave view
- Android技術分享|【Android踩坑】懷疑人生,主執行緒修改UI也會崩潰?
- 安卓TV外掛化9.0內聯崩潰原因及解決方案
- 測試員進階技能:如何有效地利用單元測試報告?
- Tekton 實戰完整示例
- 位元組的前端監控 SDK 是怎樣設計的
- 用Python繪製了若干張詞雲圖,驚豔了所有人
- 馬化騰:為什麼你們不在乎QQ等級,不用QQ了嗎?
- 幾個友好Java程式碼習慣建議
- Python 實現單例模式的五種寫法