xamarin iOS:录制时如何显示语音的音频幅度

Posted

技术标签:

【中文标题】xamarin iOS:录制时如何显示语音的音频幅度【英文标题】:xamarin iOS: How to show the audio amplitude of the voice when recording 【发布时间】:2017-01-14 21:18:49 【问题描述】:

android 上,我发现可以定期使用 getMaxAmplitude 来显示录音的幅度。 ios有同样的功能吗?我想在从麦克风录音时显示输入语音音量表。

【问题讨论】:

【参考方案1】:

假设您使用的是AVAudioRecorder,您可以启用计量并读取每个音频通道的平均和峰值音量(以分贝为单位)。

每秒采样 10 次麦克风:

# AVAudioSettings setup ...
~~~
avAudioRecorder = AVAudioRecorder.Create(this.audioFilePath, new AudioSettings(settings), out error);
avAudioRecorder.MeteringEnabled = true;

var peakPower = 0.0;
var averagePower = 0.0;
// Note: No await, run the following Task synchronously!
Task.Run(async() => // Personally I would create my own Thread, but this works for a quick example

    while (true) // Do not create object/release objects or subtasks in this loop, it will cause poor performance due to GC.
    
        if (!avAudioRecorder.Recording)
            return;
        avAudioRecorder.UpdateMeters();
        peakPower = avAudioRecorder.PeakPower(0);
        averagePower = avAudioRecorder.AveragePower(0);
        Console.WriteLine($"averagePower:peakPower");
        Thread.Sleep(100);
    
);

输出:

2017-01-14 19:26:16.271 Sound[33399:19078946] -52.9222717285156:-48.1419296264648
2017-01-14 19:26:17.271 Sound[33399:19078946] -53.7662239074707:-45.7719497680664
2017-01-14 19:26:18.274 Sound[33399:19078946] -49.105827331543:-43.4426803588867
2017-01-14 19:26:19.275 Sound[33399:19078946] -9.97611618041992:4.59128427505493
2017-01-14 19:26:20.276 Sound[33399:19078946] -37.2582626342773:5.28962087631226
2017-01-14 19:26:21.276 Sound[33399:19078946] -24.4357891082764:4.00279855728149
2017-01-14 19:26:22.277 Sound[33399:19078946] -11.7632217407227:4.34794473648071
2017-01-14 19:26:23.278 Sound[33399:19078946] -32.4504356384277:5.66976404190063
2017-01-14 19:26:24.279 Sound[33399:19078946] -18.5233268737793:0.0205818619579077
2017-01-14 19:26:25.280 Sound[33399:19078946] -28.790828704834:-5.83084678649902

参考:https://developer.apple.com/reference/avfoundation/avaudiorecorder

以分贝为单位,用于录制的声音。返回值 0 dB 表示满量程或最大功率;返回值 -160 dB 表示最小功率(即接近静音)。

如果提供给录音机的信号超过±满量程,则返回值可能超过0(即可能进入正值范围)。

【讨论】:

谢谢,我试过了。什么时候做音量计?我应该去哪一个。平均值或峰值。当我在我的 iPhone 上尝试时,尽管我没有说我可以看到大约 70 的数字(目前我转换为百分比)。那是因为我周围的噪音,但不是可听见的声音。 @LittleFunny 70%? -160db 到 0db,分贝是 2 次方的对数单位……是的,您通常会看到稳定的背景电平,即输入噪声。此级别将根据背景噪声级别、麦克风类型(不同的 iPhone 型号)而有所不同...平均或峰值,您应该使用什么?...如果您在哪里创建 VU Meter,您可能会使用平均值和峰值指标峰值的点亮超过了某个设定值... @LittleFunny 真的取决于你想要传达给用户的意图,在一个简单的线性“LED”阵列中平均以向他们显示他们的语音波动正在被记录,如果平均值可能总是接近峰值,那么录音可能会失真,他们应该将手机从嘴边移开并停止对手机大喊大叫;-) 我明白了.. 我也在为 android 做这件事,我正在使用 getMaxAmplitude 所以我假设 getMaxAmplitude 与 peak 的想法相同,但如何获得平均值。 @LittleFunny 在使用getAudioSourceMax 的Android 上,他们完全让您以稳定的速率进行采样并计算要显示的平均值,因此您负责存储“峰值”。返回的值更像是“声压”,因为它是模数转换的 16 位数字化。这里有一些很好的答案:***.com/questions/10655703/…

以上是关于xamarin iOS:录制时如何显示语音的音频幅度的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中录制语音时如何以编程方式生成音频波形?

如何在android中录制音频时做Visualizer

基于matlab的声音信号采集与处理

如何使用带有 Xamarin 的 AudioUnit 录制音频

融云 IMKit 音频录制参数

如何以 .m4a 格式录制语音