使用librosa.effects.trim命令难以执行静音消除

时间:2020-06-23 04:31:01

标签: python audio librosa

我正在尝试做一个项目,在项目的一部分中,我让用户说出一个被记录下来的单词。然后,这个词会消除周围的沉默,并且有一个按钮可以在没有沉默的情况下播放他们的单词。我正在使用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)

但是,当我播放音频时,我可以说它没有修剪录音。变量浏览器显示myrecordingyt的长度相同。当我播放被修剪的音频片段时,我也能听到。发生这种情况时,我也不会收到任何错误消息。有没有办法让librosa实际剪辑音频?我尝试调整top_db,但并没有解决。除此之外,我不太确定自己会做错什么。

1 个答案:

答案 0 :(得分:1)

要获得真正的答案,您必须发布示例记录,以便我们可以检查实际发生的情况。

代替这一点,我想参考this GitHub issue,其中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)