当前位置: 首页 > 知识库问答 >
问题:

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

赫连泰宁
2024-06-22

问题背景

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

共有2个答案

孙德宇
2024-06-22

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

当音频文件保存为 .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;}
方鸿振
2024-06-22

对于您描述的问题,上传的 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 文件格式的具体要求,并寻求进一步的帮助。

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

 类似资料:
  • OpenEars是一个开源的iOS类库,用于在iPhone和iPad实现语音识别功能。本demo利用此开源类库实现了简单的语音识别。可以识别:CHANGE、LEFT、RIGHT、FORWARD、BACKWARD、GO等英文,其他语素需要训练。 [Code4App.com]

  • 我在设计一个可以同时录制语音和将语音转换为文本的应用程序时遇到了这个bug。我使用Google API进行语音识别部分,并使用audioRecorder对象进行录音。它没有成功,因此我转而使用onBufferReceived()来检索过程中的字节(当用户说话时)。Google API代码现在是我代码的onResults()部分,它可以在没有UI的情况下进行语音识别。 这是代码

  • 这里我有记录音频流文件的代码。问题是我想保存这个文件与正确的文件扩展名(主要是. mp3和. aac)。我该如何实现这一点?

  • 我想开发一个模块,它将使用Android中的语音到文本支持。我发现了许多与RecogenerIntent等相关的文档和演示。但我发现所有这些演示都只是在10秒左右的时间里播放声音。但我想让我的演示运行5-10分钟以上。如果不是离线运行,我不会有任何问题,因为我的应用程序总是在线运行。 我也看过Android上的Pocketsphinx,但效果不太好。此外,它只支持Android Studio,而不

  • 问题内容: 我有一把吉他,我需要我的电脑能够分辨出正在演奏的音符,并识别出音调。可以在python中做到吗,也可以在pygame中做到吗?能够在pygame中做到这一点将非常有帮助。 问题答案: 要识别音频信号的频率,可以使用FFT(快速傅立叶变换)算法。据我所知,PyGame无法记录音频,也不支持FFT转换。 首先,您需要从声卡捕获原始采样数据。这种数据称为PCM(脉冲编码调制)。在Python

  • 由于连接到不同的API,我目前正在开发一个工具,允许我阅读所有的通知。 它工作得很好,但现在我想用一些声音命令来做一些动作。 就像当软件说“一封来自Bob的邮件”时,我想说“阅读”或“存档”。 我的软件是通过一个节点服务器运行的,目前我没有任何浏览器实现,但它可以是一个计划。 在NodeJS中,启用语音到文本的最佳方式是什么? 我在它上面看到了很多线程,但主要是使用浏览器,如果可能的话,我希望在一