解决使用 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; }
「其他文章」
- 刷算法题常用的 JS 基础扫盲
- 跨区域、Kubernetes集群运行数据库实践指南
- 13个你应该知道的 Webpack 优化技巧
- Python进行数据可视化,你会用什么库来做呢?
- Python常见报错及解决方案,建议收藏!
- 介绍一款进阶版的 Pandas 数据分析神器:Polars
- Python包管理工具之Pipenv
- 「Spring」Boot Docker 认证指南(上)
- 基于Electron开发Hosts切换工具的“踩坑”之旅
- 2022 年需求中优秀的 DevOps 工具
- 一日一技:如何实现带Timeout的Input?
- 13 个非常有用的 Python 代码片段,建议收藏!
- [科普文] 浅谈 Function Programing 编程范式
- 什么是Pulsar函数流处理应用?
- Flask vs Django: 该如何选择Python框架?
- 十个用图表解释JavaScript 闭包的面试题
- 漫谈 CSS 方法论
- 超详细的日常开发必备神器 HttpUtil
- 理想中的接口自动化项目你了解吗?
- 让我们一起聊聊 Django 框架