持续创作,加速成长!这是我参加「日新方案 6 月更文应战」的第6天,点击检查活动详情

问题背景

App 完成录音保存音频文件,并完成本地语音辨认匹配功用。

经过网络请求上传经过语音匹配的音频文件。

服务器接收到文件并进行语音辨认,运用的是第三方微软语音辨认,只支撑 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;
}