Python实现逐个执行目录文件并让AI预测后跳转的问题
问题分析与修正方案
原代码存在几个核心问题,导致无法实现遍历MP3文件并逐个预测的功能:
- 遍历逻辑失效:MP3文件遍历循环仅保留最后一个文件的音频数据,后续特征提取、模型操作都只针对该文件,未对所有文件进行处理
- 特征格式错误:直接使用Librosa提取的二维时频特征(如MFCC、Chroma)作为模型输入,这类特征是
特征数×时间步的二维数组,而机器学习模型需要一维的特征向量,必须先计算统计特征(均值、标准差、最大值、最小值等)将其转换成一维 - 模型流程颠倒:错误地用单个文件的特征与全量标签做训练测试划分,正确流程应该是先基于已标注的完整数据集训练模型,再用训练好的模型对新的MP3文件做预测
修正后的完整代码
步骤说明
- 先从标注好的音频数据集(需提前准备对应标签)提取特征,训练模型
- 遍历目标目录的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
相关产品推荐
相关产品推荐

