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

Python实现逐个执行目录文件并让AI预测后跳转的问题

问题分析与修正方案

原代码存在几个核心问题,导致无法实现遍历MP3文件并逐个预测的功能:

  1. 遍历逻辑失效:MP3文件遍历循环仅保留最后一个文件的音频数据,后续特征提取、模型操作都只针对该文件,未对所有文件进行处理
  2. 特征格式错误:直接使用Librosa提取的二维时频特征(如MFCC、Chroma)作为模型输入,这类特征是特征数×时间步的二维数组,而机器学习模型需要一维的特征向量,必须先计算统计特征(均值、标准差、最大值、最小值等)将其转换成一维
  3. 模型流程颠倒:错误地用单个文件的特征与全量标签做训练测试划分,正确流程应该是先基于已标注的完整数据集训练模型,再用训练好的模型对新的MP3文件做预测

修正后的完整代码

步骤说明

  1. 先从标注好的音频数据集(需提前准备对应标签)提取特征,训练模型
  2. 遍历目标目录的MP3文件,逐个提取特征并使用训练好的模型预测
import os
import numpy as np
import pandas as pd
import librosa
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler

# ---------------------- 第一步:训练模型(基于已标注的数据集) ----------------------
def extract_audio_features(audio_path):
    """提取音频的统计特征:MFCC、Chroma的均值、标准差、最大最小值等"""
    y, sr = librosa.load(audio_path, sr=None)
    # 提取MFCC特征(20个系数)
    mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=20)
    # 提取Chroma特征
    chroma = librosa.feature.chroma_stft(y=y, sr=sr)
    
    # 计算统计特征,将二维特征转为一维向量
    features = []
    # 对每个特征维度计算统计量
    for feature in [mfccs, chroma]:
        features.extend([
            np.mean(feature), np.std(feature),
            np.max(feature), np.min(feature),
            np.median(feature)
        ])
    return np.array(features)

# 假设你的标注数据集音频存放在这个目录,CSV标签文件对应每个音频的标签
train_audio_dir = "Train_Music"
labels_df = pd.read_csv("csvloader/tableConvert.com_y1m7y5.csv")

# 构建训练数据集
X_train = []
y_train = []
for idx, row in labels_df.iterrows():
    audio_filename = row["filename"]  # 假设CSV有一列是音频文件名
    label = row["label"]  # 假设CSV有一列是对应的标签
    audio_path = os.path.join(train_audio_dir, audio_filename)
    if os.path.exists(audio_path) and audio_filename.endswith(".mp3"):
        features = extract_audio_features(audio_path)
        X_train.append(features)
        y_train.append(label)

X_train = np.array(X_train)
y_train = np.array(y_train)

# 标准化特征
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)

# 训练随机森林模型
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train_scaled, y_train)

# ---------------------- 第二步:遍历目标目录,逐个预测MP3文件 ----------------------
target_dir = "Music"

for filename in os.listdir(target_dir):
    if filename.endswith(".mp3"):
        audio_path = os.path.join(target_dir, filename)
        print(f"正在处理文件:{filename}")
        # 提取当前文件的特征
        file_features = extract_audio_features(audio_path)
        # 标准化(使用训练时的scaler)
        file_features_scaled = scaler.transform(file_features.reshape(1, -1))
        # 预测
        prediction = clf.predict(file_features_scaled)
        print(f"预测结果:{prediction[0]}")
        print("------------------------")

关键修正点

  • 新增extract_audio_features函数,将二维时频特征转换为一维统计特征,满足模型输入要求
  • 拆分流程:先基于标注数据集训练模型,再遍历目标文件做预测
  • 修复遍历逻辑:对每个MP3文件都执行特征提取、标准化、预测的完整流程
  • 标准化时复用训练阶段的scaler,避免数据泄露

内容的提问来源于stack exchange,提问作者haha Nince

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:05:22