我正在尝试做一个项目,在项目的一部分中,我让用户说出一个被记录下来的单词。然后,这个词会消除周围的沉默,并且有一个按钮可以在没有沉默的情况下播放他们的单词。我正在使用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)
但是,当我播放音频时,我可以说它没有修剪录音。变量浏览器显示myrecording
和yt
的长度相同。当我播放被修剪的音频片段时,我也能听到。发生这种情况时,我也不会收到任何错误消息。有没有办法让librosa实际剪辑音频?我尝试调整top_db
,但并没有解决。除此之外,我不太确定自己会做错什么。
答案 0 :(得分:1)
要获得真正的答案,您必须发布示例记录,以便我们可以检查实际发生的情况。
代替这一点,我想参考this GitHub issue,其中librosa的主要作者之一就类似问题提供了建议。
本质上:您想降低top_db
阈值并降低frame_length
和hop_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)