我有一个跨平台(iOS和Android)应用程序,我将在其中录制音频剪辑,然后将其发送到服务器以进行一些机器学习操作。在我的iOS应用中,我使用AVAudioRecorder
录制音频。在Android应用程序中,我使用MediaRecorder录制音频。最初在移动设备中,由于尺寸限制,我使用m4a格式。到达服务器后,我将其转换为wav
格式,然后在ML操作中使用它。
我的问题是,在iOS中,默认情况下,OS的AVAudioRecorder在我们开发人员访问原始数据之前会对原始音频数据进行放大。但是在Android中,MediaRecorder不会为原始数据提供任何类型的默认放大。换句话说,在iOS中,我永远不会从麦克风中获取原始音频流,而在Android中,我永远只会从麦克风中获取原始音频流。如果您可以在iPhone和Android手机上以相同的音频源并排录制相同的音频,然后以Audacity格式导入录制的音频以进行可视化表示,则这种区别显而易见。我在下面附上了一个示例表示截图。
在图像中,第一个轨道是Android录音,第二个轨道是iOS录音。当我通过耳机听到这两个音频时,我可以模糊地分辨它们,但是当我可视化数据点时,您可以清楚地看到图像的差异。这些区别对ML操作不利。
很明显,在iPhone中,涉及到某些放大因子,我也想在Android中实现。
有人知道放大倍数吗?还是还有其他可能的选择?
答案 0 :(得分:1)
很有可能区别在于自动增益控制的效果。
您可以通过将其模式设置为AVAudioSession
来在应用程序的AVAudioSessionModeMeasurement
中禁用此功能,通常在启动时在应用程序中执行一次。这将禁用大量输入信号处理。
阅读问题描述,最好在Android上启用AGC。
如果这些都不产生结果,则您可能希望对两个信号都进行缩放,以使其仅在削波以下。
let audioSession = AVAudioSession.sharedInstance()
audio.session.setMode(AVAudioSessionModeMeasurement)