Audio 如何通过代码限制/剪辑音频音量?

Audio 如何通过代码限制/剪辑音频音量?,audio,vb6,Audio,Vb6,我正在处理一个显示突然尖峰的音频文件: 当我尝试规范化音频文件时,音频程序会看到这个尖峰,注意到它是0 dB,不再规范化音频 为了解决这个问题,我应用了一个限制在-3dB的限制器。我使用了斯坦伯格波浪实验室和Audacity硬限制器。相反,它们都会降低整个音频音量 两者都不能消除这个尖峰 编辑:我发现Audacity中的“硬剪辑”可以满足我的需要,但现在我仍然想完成我自己的方法 所以我在想,它们可能工作不正常 然后我尝试用VB6编写自己的限制器,以便完全控制正在发生的事情 为此,我加载了wav

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

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

为了解决这个问题,我应用了一个限制在-3dB的限制器。我使用了斯坦伯格波浪实验室和Audacity硬限制器。相反,它们都会降低整个音频音量

两者都不能消除这个尖峰

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

所以我在想,它们可能工作不正常

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

为此,我加载了wav文件的音频数据,如下所示:

(我已经非常简化了流程)

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

我不确定如何从样本数据中计算dB来剪裁它,以及如何将其剪裁为-3dB

我现在只是简单地将剪切值设置为“0”进行了尝试

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

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

我的方法有什么错


谢谢大家!

从音频样本计算dB。 听起来你想做的是找到一个合适的阈值,然后用如下方式剪辑音频:

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

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

峰值是什么?这些是真实的声音还是人工制品?硬剪辑会导致剪辑,这意味着它会影响应用剪辑的位置周围的音频。“这样行吗?”卢卡斯·茨特拉切夫斯基这些声音都是真的。当我剪辑尖峰时,我希望它的音量会更低。我不明白你说的“现场音频”是什么意思。我只想降低这个尖峰的音量。周围地区根本不应该受到影响。我想你可能想得不对。这更多的是一个音频工程/声音设计问题,而不是一个编程问题。传统上,你要做的是用一点自动化的方法在这些区域周围放置音量控制器。一个压缩机而不是一个有限的应该处理这个问题,你需要小心,因为你需要选择正确的参数:硬膝盖,快速攻击和释放,没有额外的收益。如果您需要在100多个音频文件中执行此操作,编程过程似乎更合理,但您尝试执行的操作不一定是琐碎的。是的,我有30.000个此类文件。无法帮助您使用VB6,但Audacity有一个python API非常感谢!正是我需要的。
    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
If Abs(nSamples(i)) > threshold Then
  nSamples(i) = threshold * Sgn(nSamples(i))