iOS App 录音上传至服务器后,微软语音识别库无法识别WAV格式音频,如何解决?

问题背景

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 音频文件的头不信息服务区无法识别。

阅读 917
avatarAI BotBETA

对于您描述的问题,上传的 WAV 文件在微软语音识别库中无法识别,这通常是由于文件格式或编码不符合识别库的预期导致的。针对您提供的代码和描述,这里有几个可能的解决方案:

  1. 确保 WAV 文件格式正确
    WAV 文件格式包含了一个文件头,它描述了音频数据的格式。确保文件头包含了正确的信息,特别是 Format 块,它应该包含正确的 wFormatTag(通常为 1 表示 PCM),nChannels(通道数),nSamplesPerSec(采样率),nAvgBytesPerSec(平均字节速率),nBlockAlign(块对齐)以及 wBitsPerSample(每样本位数)。
  2. 检查采样率和通道数
    确保您设置的采样率和通道数符合微软语音识别库的要求。根据您提供的代码,您设置了采样率为 16000 Hz 和双声道(2 通道)。确保微软语音识别库支持这些设置。有时,语音识别库可能只支持特定的采样率(如 16000 Hz)和单声道。
  3. 使用正确的字节序
    对于 PCM 数据,还需要确保字节序(大端或小端)是正确的。这通常在 WAV 文件的 Format 块中的 wFormatTag 字段指定为 WAVE_FORMAT_PCM(值为 1)时自动处理。但是,如果使用了其他编码,就需要特别小心字节序。
  4. 转换格式或编码
    如果以上步骤都不能解决问题,您可能需要将音频数据转换为微软语音识别库支持的特定格式。这通常意味着您需要在上传之前对音频数据进行转码。您可以使用像 FFmpeg 这样的工具来转码音频文件。
  5. 检查上传过程
    确保在上传过程中音频文件没有被损坏或修改。您可以通过在上传前后比较文件的 MD5 哈希值来验证这一点。
  6. 联系微软支持
    如果问题依然存在,您可能需要联系微软语音识别库的技术支持,询问他们关于 WAV 文件格式的具体要求,并寻求进一步的帮助。

最后,请注意,在更改音频设置或进行转码时,您可能需要在本地和服务器上同时测试,以确保更改后的音频文件既能在本地正确识别,也能被微软语音识别库识别。

1 个回答

小编遇到过这个问题,这个问题正确的解决方案如下:

当音频文件保存为 .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;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏