You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:05:32