使用SEGAN代码计算语音指标时遇'NoneType不可迭代'错误求助
修正后的语音指标计算代码(解决'NoneType'不可迭代错误)
以下是针对问题修复后的代码,解决了文件匹配、读取校验等导致的迭代错误,可直接用于计算824对干净/噪声语音的STOI、CSIG、CBAK等指标:
import os import glob import soundfile as sf import numpy as np from pystoi import stoi # 导入segan_pytorch内置的metrics模块,确保项目路径已添加到Python环境 from segan.metrics import composite def main(): # 替换为你的实际文件夹路径 clean_dir = "/your/path/to/clean_wavs" noisy_dir = "/your/path/to/noisy_wavs" # 获取并排序文件夹内所有wav文件,保证文件名一一对应 clean_wavs = sorted(glob.glob(os.path.join(clean_dir, "*.wav"))) noisy_wavs = sorted(glob.glob(os.path.join(noisy_dir, "*.wav"))) # 前置校验文件数量 if len(clean_wavs) != len(noisy_wavs): print(f"⚠️ 文件数量不匹配:干净语音{len(clean_wavs)}个,噪声语音{len(noisy_wavs)}个") return # 初始化指标存储列表 stoi_scores = [] csig_scores = [] cbak_scores = [] covl_scores = [] ssnr_scores = [] # 遍历处理每一对文件 for clean_path, noisy_path in zip(clean_wavs, noisy_wavs): # 跳过不存在的文件 if not os.path.exists(clean_path) or not os.path.exists(noisy_path): print(f"跳过缺失文件对:{os.path.basename(clean_path)}") continue # 读取音频并捕获异常 try: clean_audio, clean_sr = sf.read(clean_path) noisy_audio, noisy_sr = sf.read(noisy_path) except Exception as e: print(f"读取失败 {os.path.basename(clean_path)}: {str(e)}") continue # 校验采样率(SEGAN默认16000Hz) target_sr = 16000 if clean_sr != target_sr or noisy_sr != target_sr: print(f"跳过采样率不符文件:{os.path.basename(clean_path)}") continue # 统一音频长度 min_len = min(len(clean_audio), len(noisy_audio)) clean_audio = clean_audio[:min_len] noisy_audio = noisy_audio[:min_len] # 计算各项指标 stoi_val = stoi(clean_audio, noisy_audio, target_sr, extended=False) _, cbak_val, ssnr_val, csig_val, covl_val = composite(clean_audio, noisy_audio, target_sr) # 存入列表 stoi_scores.append(stoi_val) csig_scores.append(csig_val) cbak_scores.append(cbak_val) covl_scores.append(covl_val) ssnr_scores.append(ssnr_val) # 输出平均结果 print("\n===== 平均指标结果 =====") print(f"STOI: {np.mean(stoi_scores):.4f}") print(f"CSIG: {np.mean(csig_scores):.4f}") print(f"CBAK: {np.mean(cbak_scores):.4f}") print(f"COVL: {np.mean(covl_scores):.4f}") print(f"SSNR: {np.mean(ssnr_scores):.4f}") if __name__ == "__main__": main()
关键修复点
- 用
sorted(glob.glob)确保文件列表有序,保证干净/噪声文件严格配对 - 增加文件存在性检查和读取异常捕获,避免因无效文件返回
None触发迭代错误 - 强制校验采样率为SEGAN默认的16000Hz,避免指标计算时的参数不匹配
- 统一音频长度,防止因长度差异导致计算失败
内容的提问来源于stack exchange,提问作者aozora-hime
相关产品推荐
相关产品推荐

