conda环境下FutureWarning: Pass sr=16000, n_fft=800 as keyword args问题解决

文章讲述了在训练语音处理模型时遇到的FutureWarning关于librosa版本问题,通过分析发现是由于传参方式改变导致的。文章进一步介绍了Conda这个强大的包和环境管理工具,包括其在依赖性解决、环境隔离、创建和管理等方面的优势,以及如何使用Conda进行问题解决和环境操作。

1 问题描述

在训练语音处理模型过程中,出现如下错误:

audio.py:100: FutureWarning: Pass sr=16000, n_fft=800 as keyword args. From version 0.10 passing these as positional arguments will result in an error
  return librosa.filters.mel(hp.sample_rate, hp.n_fft, n_mels=hp.num_mels,

2 问题分析

从问题描述中可知,出现告警是因为librosa版本问题导致

FutureWarning: Pass sr=16000, n_fft=800 as keyword args. From version 0.10 passing these as positional arguments will result in an error

查看librosa版本,如下所示,当前系统版本为0.9.1, 新版本要求指定参数传参

pip list
Package               Version
--------------------- ------------
aiohttp               3.9.1
aiosignal             1.3.1
async-timeout         4.0.3
attrs                 23.2.0
audioread             3.0.1
Brotli                1.0.9
certifi               2023.11.17
cffi                  1.16.0
charset-normalizer    3.1.0
colorama              0.4.6
contourpy             1.2.0
cryptography          41.0.3
cycler                0.12.1
decorator             5.1.1
fonttools             4.47.2
frozenlist            1.4.1
fsspec                2023.12.2
idna                  3.4
importlib-resources   6.1.1
joblib                1.3.2
kiwisolver            1.4.5
librosa               0.9.1
lightning-utilities   0.10.0
llvmlite              0.41.1
madgrad               1.3
matplotlib            3.8.2
mkl-fft             
你可以通过 Python 的 `warnings` 模块来屏蔽控制台中的警告信息。以下是几种不同的方法,根据你的需求选择合适的方案: ### 方法 1:全局屏蔽所有 UserWarning(推荐用于训练时) ```python import warnings # 屏蔽所有 UserWarning 类型的警告 warnings.filterwarnings("ignore", category=UserWarning) # 或者更具体地只屏蔽 librosa 相关的警告 warnings.filterwarnings("ignore", message=".*n_fft.*too large for input signal.*") ``` ### 方法 2:精确屏蔽特定模块的警告(推荐) ```python import warnings import librosa # 只屏蔽 librosa.core.spectrum 中的特定警告 warnings.filterwarnings( "ignore", module="librosa\\.core\\.spectrum", message=".*n_fft=.*too large for input signal.*" ) ``` ### 方法 3:使用上下文管理器临时屏蔽 ```python import warnings from contextlib import suppress # 方法3a: 使用 warnings.catch_warnings with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=UserWarning) # 在这个代码块中执行会产生警告的操作 spectrogram = librosa.stft(audio, n_fft=256) # 方法3b: 使用自定义上下文管理器 @contextmanager def ignore_librosa_warnings(): with warnings.catch_warnings(): warnings.filterwarnings("ignore", module="librosa\\.core\\.spectrum") yield # 使用方式 with ignore_librosa_warnings(): spectrogram = librosa.stft(audio, n_fft=256) ``` ### 方法 4:设置环境变量(适用于脚本启动前) ```bash # 在运行脚本前设置环境变量 export PYTHONWARNINGS="ignore::UserWarning" python your_training_script.py ``` 或者在 Python 脚本开头: ```python import os os.environ['PYTHONWARNINGS'] = 'ignore::UserWarning' import warnings warnings.filterwarnings('ignore') # 确保生效 ``` ### 方法 5:针对 librosa 的最佳实践(推荐) ```python import warnings import librosa import numpy as np def safe_stft(audio, n_fft=256, **kwargs): """安全的STFT计算,自动调整n_fft""" # 自动调整n_fft以适应信号长度 actual_n_fft = min(n_fft, len(audio)) if n_fft != actual_n_fft: print(f"Adjusting n_fft from {n_fft} to {actual_n_fft} due to signal length {len(audio)}") return librosa.stft(audio, n_fft=actual_n_fft, **kwargs) # 使用时就不会有警告了 spectrogram = safe_stft(audio, n_fft=256) ``` ### 完整示例(集成到训练循环中) ```python import warnings import torch import librosa # === 配置警告过滤器 === def setup_warning_filters(): """设置警告过滤规则""" # 1. 屏蔽 librosa 频谱相关的警告 warnings.filterwarnings( "ignore", module="librosa\\.core\\.spectrum", message=".*n_fft.*too large for input signal.*" ) # 2. 屏蔽其他常见的无关警告 warnings.filterwarnings("ignore", category=FutureWarning) warnings.filterwarnings("ignore", category=DeprecationWarning) # 在程序开始时调用 setup_warning_filters() # 训练循环示例 def train_epoch(): for batch in dataloader: # 这里即使有潜在的警告也不会显示 audio = batch['audio'].numpy()[0] # 假设是单个样本 spec = librosa.stft(audio, n_fft=256) # 不再显示警告 # 继续训练... print(f"Epoch {epoch}/{total_epochs} [Train]") ``` ### 解释说明 1. **`warnings.filterwarnings()` 参数说明**: - `"ignore"`:忽略匹配的警告 - `category=UserWarning`:只影响 UserWarning 类型 - `module="librosa\\.core\\.spectrum"`:正则表达式匹配模块路径 - `message=".*n_fft.*"`:正则表达式匹配警告消息内容 2. **为什么推荐方法2**: - 精准定位问题来源 - 不会影响其他有用的警告 - 使用正则表达式可以匹配多种类似情况 3. **注意事项**: - 不要盲目屏蔽所有警告,可能会错过重要信息 - 生产环境中建议记录被屏蔽的警告 - 开发阶段最好先理解警告原因再决定是否屏蔽
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源启智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值