【问题标题】:How do I cap / clip audio volume via code?如何通过代码限制/剪辑音频音量?
【发布时间】:2021-05-08 03:52:09
【问题描述】:

我正在处理一个显示突然尖峰的音频文件:

当我尝试规范化音频文件时,音频程序看到这个尖峰,注意到它处于 0 dB 并且不会再规范化音频。

为了解决这个问题,我应用了一个限制为 -3 dB 的限制器。我使用过 Steinberg Wavelab 和 Audacity Hard Limiter。相反,它们都会减小整个音量。

两者都不能消除这个尖峰。

编辑:我发现 Audacity 中的“硬剪辑”可以满足我的需要,但现在我仍然想完成自己的方法。

所以我在想它们可能无法正常工作。

然后我尝试在 VB6 中编写自己的限制器,以便完全控制正在发生的事情。

为此,我正在加载一个 wav 文件的音频数据,如下所示:

(我已经非常精简了这个过程)

Dim nSamples() As Integer
ReDim nSamples(0 To (lCountSamples - 1))

Get #iFile, , nSamples

我现在在“nSamples”中有音频数据。

    Dim i&
    For i = 1 To UBound(nSamples)
    
        Dim dblAmplitude As Double
        dblAmplitude = nSamples(i) / 32767

        Dim db As Double
        db = 20 * Log10(dblAmplitude)

        If db > -0.3 Then
            nSamples(i)=0 'how would I lower the volume here instead of just setting it to 0???
        End If

    Next

我不确定如何从样本数据中计算 dB 以便对其进行裁剪以及如何将其裁剪为 -3dB。

我现在只是尝试将裁剪值设置为“0”。

但是,这里发生了一些奇怪的事情:音频的下部消失了:

我预计将值设置为 0 会使音频静音,但在我的情况下,较低的 wav 形式消失了。

我的方法有什么问题?

谢谢!

【问题讨论】:

  • 峰是什么?这些是真正的声音还是人工制品?硬削波会导致削波,这意味着它会影响应用削波点周围的音频。可以吗?
  • @LukaszTracewski 这些是真实的声音。当我夹住尖峰时,我预计它的音量会更低。我不明白您所说的“现场音频”是什么意思。我只想降低这个尖峰的音量。周边地区根本不应该受到影响。
  • 我想你可能想错了。这更像是一个音频工程/声音设计问题,而不是一个编程问题。传统上你会做的是使用一点自动化duck这些区域周围的音量推子。压缩器而不是限制器应该处理这个问题,你需要小心,因为你需要选择正确的参数:硬拐点,快速启动和释放,没有额外的增益。如果您需要跨 100 多个音频文件执行此操作,则对流程进行编程似乎更明智,但您尝试做的事情不一定是微不足道的。
  • 是的,我有 30.000 个这样的文件。
  • 无法帮助您使用 VB6,但 Audacity 有一个 python API manual.audacityteam.org/man/scripting.html

标签: audio vb6


【解决方案1】:

从音频样本 isn't that simple 计算 dB。 听起来您想要做的是找到一个合适的阈值,然后使用以下内容剪辑音频:

If Abs(nSamples(i)) > threshold Then
  nSamples(i) = threshold * Sgn(nSamples(i))

如果所有音频剪辑的阈值都相同,则可以将阈值设置为某个固定值。否则,对样本进行排序并搜索靠近顶部和底部的点之间的较大间隙以找到您的阈值可能会更准确。

【讨论】:

  • 非常感谢!正是我需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
相关资源
最近更新 更多