首页 > 解决方案 > 使用 librosa.effects.trim 命令执行静音删除很困难

问题描述

我正在尝试做一个项目,在项目的一部分,我让用户说出一个被记录下来的词。然后这个词会消除它周围的沉默,并且有一个按钮可以在没有沉默的情况下播放他们的词。我正在使用 librosa 的librosa.effects.trim命令来实现这一点。

例如:

def record_audio():
    global myrecording
    global yt
    playsound(beep1)
    myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=1)
    sd.wait() 
    playsound(beep2)

    #trimming the audio
    yt, index = librosa.effects.trim(myrecording, top_db=60)

但是,当我播放音频时,我可以看出它没有修剪录音。变量 explorer 显示myrecordingyt是相同的长度。当我播放应该是修剪过的音频剪辑时,我也能听到它。发生这种情况时,我也没有收到任何错误消息。有没有办法让 librosa 实际剪辑音频?我试过调整top_db,但没有解决。除此之外,我不太确定我做错了什么。

标签: pythonaudiolibrosa

解决方案


要获得真正的答案,您必须发布示例录音,以便我们可以检查到底发生了什么。

取而代之的是,我想参考这个 GitHub 问题,其中 librosa 的主要作者之一为一个非常相似的问题提供了建议。

本质上:您想降低top_db阈值并减少frame_lengthhop_length。例如:

yt, index = librosa.effects.trim(myrecording, top_db=50, frame_length=256, hop_length=64)

减小hop_length有效地增加了修剪的分辨率。减小top_db使功能不那么敏感,即低级噪声也被视为静音。使用电脑麦克风时,您可能确实有相当多的低级背景噪音。

如果这一切都没有帮助,您可能需要考虑使用 SOX 或其 Python 包装器pysox。它还具有修剪功能。

更新查看音频的波形。它在开始的某个地方有一个尖峰吗?可能有一些破裂的声音。这将使 librosa 无法正确修剪。也许手动丢弃第一秒(=fs样本)然后修剪可以解决问题:

librosa.effects.trim(myrecording[fs:], top_db=50, frame_length=256, hop_length=64)

推荐阅读