python - 使用 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 显示myrecording
和yt
是相同的长度。当我播放应该是修剪过的音频剪辑时,我也能听到它。发生这种情况时,我也没有收到任何错误消息。有没有办法让 librosa 实际剪辑音频?我试过调整top_db
,但没有解决。除此之外,我不太确定我做错了什么。
解决方案
要获得真正的答案,您必须发布示例录音,以便我们可以检查到底发生了什么。
取而代之的是,我想参考这个 GitHub 问题,其中 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)
推荐阅读
- java - 使用 Elytron 的 WildFly 和 Java EE 安全配置
- mysql - 选择不存在的地方:多个选择查询和连接查询和连接查询
- java - 如何为当前用户更新 SecurityContextHolder 用户名
- asp.net - 加强跨站点脚本:Response.Binarywrite 中的持久问题
- java - 无法启动使用 Windows bat 文件分发的 kafka 连接
- elasticsearch - 以编程方式设置索引的 read_only_allow_delete 属性
- php - 无法在浏览器中显示图片
- c# - 如何在我的应用程序上显示存储在移动设备中的图像?
- php - 使用其中一列中的数据对 MySQL 输出进行分组
- apache-kafka - 通过 Nifi 进行微批处理