基于机器学习的音频事件检测系统,可以准确识别音频中的多个事件状态(如停车、慢车、飞行、悬停、转弯等)及其转换时刻。系统采用多进程并行处理,显著提高了训练和检测速度。
-
模型训练
- 使用xgboost进行分类训练模型
- 优化模型参数
- 添加模型评估指标
-
事件预测功能
- 实现event_guess.py支持模型选择
- 添加批量预测功能
- 优化预测速度
-
Web界面开发
- 实现webui.py支持模型选择
- 修复XGBoost模型在Web界面中的预测问题
- 添加更多可视化功能
- 优化用户交互体验
- 高效处理:多进程并行特征提取,训练和检测速度提升显著
- 多模型支持:支持随机森林和XGBoost两种模型,XGBoost模型提供更高的预测准确率和置信度
- 多状态检测:支持多种事件状态检测(停车、慢车、飞行、悬停、转弯等)
- 状态转换识别:能够检测从一种状态到另一种状态的转换过程
- 高准确率:平均准确率达到85%以上
- 实时分析:支持实时状态转换检测
- 置信度评估:提供预测结果的置信度,有助于判断可靠性
- 用户友好:提供Web界面,便于可视化分析
- 轻量级依赖:仅依赖常见Python库
系统使用以下音频特征进行事件检测:
-
MFCC(梅尔频率倒谱系数)
- 捕捉音频的音色特征
- 使用13个系数
- 包含均值和标准差统计量
-
梅尔频谱
- 表示音频的频率特征
- 使用40个梅尔频带
- 包含均值和标准差统计量
-
光谱对比度
- 捕捉音频的动态特征
- 使用6个频带
- 包含均值和标准差统计量
-
零交叉率(ZCR)
- 作为音高的替代特征
- 反映信号的频率变化
- 包含均值和标准差统计量
-
RMS能量
- 作为响度的替代特征
- 反映信号的能量变化
- 包含均值和标准差统计量
特征提取过程在utils/feature_extract.py
中实现,主要包括以下步骤:
-
音频加载与预处理:
- 支持从文件路径或内存缓冲区加载音频
- 将音频重采样至22050Hz,确保特征提取的一致性
- 将立体声音频转换为单声道
-
特征计算:
- 使用librosa库提取各类音频特征
- 对于每个特征,计算其均值和标准差作为统计特征
- 使用较大的hop_length(1024)和n_fft(2048)参数优化计算效率
-
特征向量构建:
- 将所有提取的特征连接成一个特征向量
- 最终特征向量维度为:(13×2) + (40×2) + (6×2) + 4 = 122维
-
分段特征提取:
- 支持将长音频分割成固定时长的段
- 对每个段独立提取特征,便于捕捉时间变化特征
系统使用Demucs音频分离技术,将音频分离为人声和非人声部分,主要实现在utils/audio_separator.py
和audio_separate.py
中:
-
Demucs模型:
- 默认使用htdemucs预训练模型
- 支持GPU加速,显著提高分离速度
- 可配置的随机移位(shifts)参数提高分离质量
-
分离过程:
- 将音频分割成小块进行处理,减少内存占用
- 支持配置分割重叠率(overlap)提高分离质量
- 使用多进程并行处理,加速分离过程
-
分离结果处理:
- 自动将分离结果重命名为更直观的文件名(如"_vocals"改为"_voice","_no_vocals"改为"_ambient")
- 支持仅保留无人声部分用于后续分析
- 提供临时目录管理,确保资源有效利用
-
应用于事件检测:
- 在事件检测前先进行音频分离,仅使用无人声部分进行分析
- 这种方法可以有效减少人声对事件检测的干扰
- 通过
events_guess_only_ambient.py
中的函数实现无缝集成
系统支持两种机器学习模型:随机森林(RF)和XGBoost,分别在train.py
和train_xgboost.py
中实现:
-
数据加载:
- 从
data_list.txt
文件加载音频文件路径和对应标签 - 支持状态转换标签(如"慢车到飞行"),自动分割音频并为每个部分分配相应标签
- 从
-
并行处理:
- 使用
ProcessPoolExecutor
实现多进程并行特征提取 - 自动根据CPU核心数选择最优进程数
- 使用内存缓冲区代替临时文件,提高IO效率
- 使用
-
特征标准化:
- 使用
StandardScaler
对特征进行标准化 - 保存标准化器以便在预测时使用
- 确保不同音频文件的特征具有相同的分布
- 使用
-
模型配置:
- 使用100棵决策树构建随机森林
- 并行训练提高效率
- 随机种子固定为42,确保结果可复现
-
训练过程:
- 将数据分为80%训练集和20%测试集
- 使用训练集训练模型
- 在测试集上评估模型性能
-
模型评估:
- 使用分类报告(classification_report)评估模型
- 包括精确率、召回率、F1分数等指标
- 平均准确率达到85%以上
-
模型配置:
- 使用多分类目标函数(multi:softprob)
- 配置学习率、树深度、特征采样等超参数
- 使用直方图算法(hist)加速训练
-
训练过程:
- 将标签转换为数值索引
- 创建DMatrix对象进行高效训练
- 使用100轮迭代训练模型
-
模型保存:
- 同时保存模型和标签映射关系
- 标签映射用于将预测索引转回原始标签
- 模型和映射关系存储在同一个文件中
事件检测是系统的核心功能,主要在events_guess.py
和events_guess_only_ambient.py
中实现:
-
窗口设计:
- 使用固定大小的时间窗口(默认2秒)
- 窗口之间有重叠(默认步长1秒)
- 可通过参数调整窗口大小和步长
-
并行处理:
- 使用
ThreadPoolExecutor
并行处理多个窗口 - 每个窗口独立提取特征和预测
- 提高长音频文件的处理效率
- 使用
-
置信度过滤:
- 为每个预测结果计算置信度
- 使用置信度阈值过滤低可信度预测
- 默认阈值为0.55,可通过参数调整
-
特征提取:
- 对每个窗口提取与训练相同的特征
- 使用保存的标准化器进行特征标准化
- 确保特征分布与训练数据一致
-
模型选择:
- 支持随机森林和XGBoost两种模型
- 根据模型类型选择不同的预测方法
- XGBoost模型需要额外处理标签映射
-
预测结果处理:
- 针对XGBoost模型的预测结果进行特殊处理
- 确保使用整数索引访问标签映射
- 将numpy字符串转换为Python字符串
-
相邻预测合并:
- 合并相邻的相同事件预测
- 计算合并事件的平均置信度
- 减少结果碎片化,提高可读性
-
结果输出:
- 输出每个检测到的事件、开始时间、结束时间和置信度
- 按时间顺序排列事件
- 提供格式化的输出便于阅读
系统提供了基于Streamlit的Web界面,在webui.py
中实现:
-
参数配置:
- 侧边栏提供模型选择(随机森林/XGBoost)
- 可调整窗口大小、步长和置信度阈值
- 支持选择是否仅使用无人声部分进行检测
-
高级选项:
- 支持自定义模型路径
- 提供参数说明帮助用户理解各选项作用
- 使用折叠面板保持界面简洁
-
文件上传:
- 支持上传WAV和MP3格式音频文件
- 自动处理上传文件并创建临时文件
- 分析完成后自动清理临时文件
-
音频波形图:
- 显示完整音频的时域波形
- 直观展示音频的振幅变化
- 帮助用户识别音频中的明显变化
-
梅尔频谱图:
- 展示音频的频率特性
- 使用梅尔刻度更符合人耳感知
- 帮助识别不同事件的频率特征
-
MFCC特征图:
- 显示提取的MFCC特征
- 展示音频的音色特征
- 便于理解模型使用的特征
-
事件列表:
- 使用可展开面板显示每个检测到的事件
- 显示事件类型、开始时间、结束时间和置信度
- 按时间顺序排列事件
-
音频信息:
- 显示音频的基本信息(采样率、时长等)
- 显示使用的模型类型
- 显示是否使用了无人声部分进行分析
-
进度反馈:
- 使用进度条显示处理进度
- 提供状态文本实时更新处理状态
- 显示详细的错误信息(如果有)
整个系统通过多个模块的紧密集成实现高效的音频事件检测:
-
模块化设计:
- 特征提取、模型训练、事件预测和界面展示各自独立
- 模块间通过清晰的接口进行交互
- 便于维护和扩展
-
性能优化:
- 多进程并行处理提高特征提取速度
- 多线程并行处理提高预测速度
- 使用内存缓冲区代替临时文件减少IO开销
-
错误处理:
- 完善的异常捕获和处理机制
- 详细的错误信息输出
- 对XGBoost模型的特殊处理确保预测结果正确
-
智能模型选择:
- 根据模型类型自动选择正确的模型路径
- 支持自定义模型路径满足高级需求
- 对不同模型的预测结果进行适当处理
-
高准确率:通过精心设计的特征提取和模型训练,系统能够以85%以上的准确率识别各种音频事件。
-
实时性能:多进程并行处理和优化的算法设计使系统能够快速处理音频文件,支持实时分析。
-
抗干扰能力:通过音频分离技术,系统能够有效过滤人声干扰,提高在复杂环境中的检测准确率。
-
易用性:直观的Web界面和丰富的可视化功能使系统易于使用,无需专业知识即可进行音频事件分析。
-
可扩展性:模块化设计和清晰的代码结构使系统易于扩展,可以添加新的特征、模型和功能。
- Python 3.8+
- Linux/macOS/Windows
- 克隆仓库:
git clone https://github.com/boomytc/AEA.git
cd AEA
- 创建并激活虚拟环境(推荐):
conda create -n AEA python=3.10 -y
conda activate AEA
- 安装依赖:
pip install -r requirements.txt
AEA/
├── datasets/ # 数据集目录
│ ├── data/ # 音频数据文件
│ └── data_list.txt # 数据列表(文件路径和标签)
├── models/ # 保存训练好的模型
├── utils/ # 工具函数
│ ├── feature_extract.py # 特征提取模块
│ └── audio_separator.py # 音频分离模块
├── tools/ # 构建和打包工具
├── README.md # 项目说明文档
├── requirements.txt # 依赖库列表
├── train.py # 随机森林模型训练脚本
├── train_xgboost.py # XGBoost模型训练脚本
├── events_guess.py # 事件预测模块
├── events_guess_only_ambient.py # 仅使用无人声部分的事件预测模块
└── webui.py # Web界面
创建一个data_list.txt
文件,每行包含音频文件路径和对应的标签:
/path/to/audio1.wav 停车
/path/to/audio2.wav 慢车到飞行
/path/to/audio3.wav 飞行
状态标签包括:
- 单一状态:
停车
、慢车
、飞行
、悬停
、转弯
等 - 状态转换:
停车到慢车
、慢车到飞行
、飞行到慢车
、慢车到停车
等
训练随机森林模型:
python train.py
训练XGBoost模型:
python train_xgboost.py
训练过程会自动:
- 从
data_list.txt
加载数据 - 使用多进程并行提取特征
- 训练选定的分类器模型
- 保存模型和特征标准化器到
models
目录
训练完成后,模型和特征标准化器将保存在models
目录下:
- 随机森林模型:
models/audio_event_model_segments.pkl
- XGBoost模型:
models/audio_event_model_xgboost.pkl
- 特征标准化器:
models/feature_scaler_segments.pkl
可以通过两种方式使用训练好的模型:
from events_guess import predict_audio_events
# 使用随机森林模型预测
events_rf = predict_audio_events(
"test.wav",
window_size=2.0, # 分析窗口大小(秒)
hop_length=1.5, # 窗口滑动步长(秒)
confidence_threshold=0.6, # 置信度阈值
model_type="rf" # 使用随机森林模型
)
# 使用XGBoost模型预测
events_xgb = predict_audio_events(
"test.wav",
window_size=2.0,
hop_length=1.5,
confidence_threshold=0.6,
model_path="models/audio_event_model_xgboost.pkl",
model_type="xgb" # 使用XGBoost模型
)
# 输出预测结果
for event_type, start_time, end_time, confidence in events_xgb:
print(f"事件: {event_type}, 开始: {start_time:.2f}s, 结束: {end_time:.2f}s, 置信度: {confidence:.2%}")
启动Web界面:
streamlit run webui.py
Web界面功能:
- 上传音频文件进行分析
- 调整分析参数(窗口大小、滑动步长、置信度阈值)
- 可视化音频波形、梅尔频谱和MFCC特征
- 显示事件检测结果和时间线
- 提供音频播放功能
本节提供各个脚本的实际使用示例。
# 训练模型
python train.py
train.py脚本会:
- 从 datasets/data_list.txt 加载数据
- 使用多进程并行提取音频特征
- 训练随机森林分类器模型
- 保存模型到 models/audio_event_model_segments.pkl
- 保存特征标准化器到 models/feature_scaler_segments.pkl
如需修改数据源或输出路径,需要直接编辑脚本中的相关变量:
# 在prepare_dataset函数调用中修改数据列表文件路径
X_scaled, y, scaler = prepare_dataset("datasets/data_list.txt")
# 在train_model函数中修改模型输出路径
model = train_model(X_scaled, y, model_path="models/audio_event_model_segments.pkl")
# 使用随机森林模型(默认)
python events_guess.py 音频文件.wav
# 使用XGBoost模型
python events_guess.py 音频文件.wav --model_type xgb
# 指定自定义模型路径
python events_guess.py 音频文件.wav --model_type xgb --model_path models/my_xgboost_model.pkl
# 自定义分析参数
python events_guess.py 音频文件.wav --window_size 2.5 --hop_length 1.2 --confidence 0.7
参数说明:
--model_type
或-m
:模型类型,可选值为rf
(随机森林,默认)或xgb
(XGBoost)--model_path
:自定义模型文件路径--window_size
或-w
:分析窗口大小(秒),默认为2.0秒--hop_length
或-l
:窗口滑动步长(秒),默认为1.0秒--confidence
或-c
:置信度阈值,默认为0.6
两种模型的对比:
-
性能比较:
- XGBoost模型通常提供更高的准确率和置信度
- 随机森林在处理噪声数据时可能更加稳健
-
预测置信度:
- XGBoost模型的置信度通常更高,在测试中比随机森林高出约10-20%
- 更高的置信度有助于降低误判率
-
运行速度:
- XGBoost模型的预测速度略快于随机森林
- 对于实时分析场景,XGBoost可能是更好的选择
-
使用建议:
- 对于需要高精度识别的场景,推荐使用XGBoost模型
- 对于快速原型验证和不同场景对比,随机森林依然是可靠的选择
当前模型在测试集上的表现:
状态 | 准确率 | 召回率 | F1分数 |
---|---|---|---|
停车 | 100% | 50% | 67% |
慢车 | 75% | 100% | 86% |
飞行 | 100% | 100% | 100% |
悬停 | 95% | 90% | 92% |
转弯 | 90% | 85% | 87% |
总体准确率:86%
以下是在同一个音频文件(BK_FX-MC.wav)上使用相同参数对XGBoost和随机森林模型进行的对比测试结果:
- 窗口大小:2.5秒
- 滑动步长:1.0秒
- 置信度阈值:0.7
检测到的事件:
事件: 飞行, 开始时间: 2.00s, 结束时间: 32.00s, 置信度: 84.34%
事件: 慢车, 开始时间: 32.00s, 结束时间: 34.50s, 置信度: 88.54%
总执行时间: 0.76秒
检测到的事件:
事件: 慢车, 开始时间: 34.00s, 结束时间: 36.50s, 置信度: 74.57%
总执行时间: 1.28秒
-
检测能力对比:
- XGBoost模型检测到了两个事件(飞行和慢车)
- 随机森林模型只检测到一个事件(慢车)
- XGBoost模型检测到了更早发生的慢车事件(32.00s vs 34.00s)
-
置信度对比:
- XGBoost模型的置信度明显更高(飞行:84.34%,慢车:88.54%)
- 随机森林模型的置信度较低(慢车:74.57%)
- XGBoost模型在窗口级别的置信度普遍高出随机森林10-30个百分点
-
运行速度对比:
- XGBoost模型总执行时间:0.76秒
- 随机森林模型总执行时间:1.28秒
- XGBoost模型执行速度快约40%
-
检测窗口比较:
- 在窗口级别的分析中,XGBoost能够在高置信度下(>70%)识别更多窗口
- 随机森林在大部分窗口的置信度都低于70%,因此被过滤掉
这些测试结果验证了XGBoost模型在音频事件检测任务中的优势,包括更高的检测准确率、更高的置信度评分以及更快的执行速度。
本项目成功完成了在音频事件检测系统中将随机森林模型替换为XGBoost模型的全流程实现,并增强了系统的灵活性和性能。
-
模型实现:
- 成功实现了
train_xgboost.py
脚本,用于训练XGBoost模型 - 修改了特征提取和数据处理逻辑,以适应XGBoost的需求
- 实现了模型保存和加载机制,便于后续使用
- 成功实现了
-
预测功能增强:
- 更新了
events_guess.py
脚本,支持两种模型类型的选择 - 添加了命令行参数(
--model_type
),允许用户灵活选择模型 - 改进了预测逻辑,支持不同模型的输出格式和置信度计算
- 更新了
-
Web界面优化:
- 增强了
webui.py
,添加模型选择功能 - 提供了高级选项,支持自定义模型路径
- 优化了用户界面,显示当前使用的模型类型和相关信息
- 增强了
-
性能提升:
- 测试结果表明,XGBoost模型在准确率上显著优于随机森林
- XGBoost的置信度普遍高出10-30个百分点
- 执行速度提高约40%,更适合实时应用场景
-
文档完善:
- 更新了README.md文件,添加了XGBoost相关说明
- 提供了两种模型的使用对比和建议
- 添加了测试结果和性能分析
-
XGBoost参数配置:
- 通过调整学习率、最大深度、子采样率等参数优化模型表现
- 利用早停技术避免过拟合
- 设置适当的目标函数和评估指标
-
特征工程适配:
- 确保特征集适合XGBoost的数据结构要求
- 优化特征提取过程,提高信息提取效率
-
预测逻辑优化:
- 根据XGBoost和随机森林的不同特性,优化预测代码
- 为不同模型实现适当的置信度计算方法
-
用户界面设计:
- 精心设计用户界面,提供直观的模型选择功能
- 优化结果展示,更清晰地传达预测信息
通过引入XGBoost模型并重构系统,本项目成功地提高了音频事件检测的准确率和性能。与原有的随机森林模型相比,XGBoost展现出更高的预测置信度和更好的事件识别能力,特别是在处理复杂音频模式时。同时,系统的灵活性也得到了提升,允许用户根据具体需求选择合适的模型。
最新的改进解决了Web界面中使用XGBoost模型的兼容性问题,使得系统能够在命令行和Web界面中一致地高效运行。这确保了在实际应用场景中的可靠性和易用性。
这些改进使得系统在实际应用中能够提供更可靠的事件检测结果,为进一步开发和优化奠定了坚实基础。未来工作将继续关注模型参数优化、批量处理功能和用户体验提升等方面。
-
音频文件要求:
- 支持常见音频格式(wav, mp3, flac等)
- 建议使用无损格式(如wav)以获得最佳效果
- 所有音频会自动调整为22050Hz采样率进行处理
-
内存使用:
- 特征提取过程会并行处理
- 建议为大量音频处理预留足够内存
- 处理过程使用内存缓冲区而非临时文件,提高效率
-
模型优化:
- 当前模型针对特定场景优化
- 对于新的音频类型可能需要重新训练
- 可调整随机森林参数以优化特定场景性能
-
Web界面限制:
- 上传文件大小可能受到Streamlit限制
- 长音频文件分析可能需要较长时间
- 增加深度学习模型支持
- 优化长音频处理性能
- 添加批量处理功能
- 改进实时分析能力
欢迎提交Issue和Pull Request以帮助改进项目。
MIT License
# 启动Web界面
streamlit run webui.py
Streamlit Web界面支持:
- 上传音频文件或使用示例音频
- 指定外部音频文件路径
- 选择分析模型(随机森林或XGBoost)
- 调整窗口大小、滑动步长和置信度阈值
- 可视化显示音频波形、频谱图和检测结果
- 自定义模型路径
- 启动Web界面:
streamlit run webui.py
-
打开浏览器访问显示的地址(通常是http://localhost:8501)
-
选择要分析的音频文件:
- 上传音频文件
- 或指定音频文件路径
- 或使用示例音频
-
选择设置:
- 分析模型(随机森林或XGBoost)
- 窗口大小(秒)
- 滑动步长(秒)
- 置信度阈值
-
点击"分析音频"按钮开始处理
-
查看生成的可视化结果:
- 音频波形图
- 梅尔频谱图
- 检测到的事件列表
-
XGBoost模型Web界面集成:
- 修复了Web界面中使用XGBoost模型时的关键问题
- 解决了使用XGBoost模型在Web界面中出现的"list indices must be integers or slices, not str"错误
- 增强了模型自动选择逻辑,根据选择的模型类型自动设置正确的模型路径
-
NumPy字符串处理优化:
- 改进了analyze_audio_segment函数,确保正确处理NumPy字符串类型的标签
- 添加了类型转换保障,确保从XGBoost模型获取预测标签时能正确处理不同类型
-
错误处理增强:
- 添加了更详细的异常捕获和错误信息展示
- 改进了错误报告机制,便于调试和问题定位
-
模型路径智能选择:
- Web界面现在能根据所选模型类型自动选择合适的模型文件
- 支持自定义模型路径覆盖默认设置
这些改进确保了Web界面中的XGBoost模型能与命令行工具一样可靠地工作,为用户提供了更多高性能的选择。