Skip to content
/ AEA Public

AEA(Audio Event Analysis)实现对音频事件的检测

Notifications You must be signed in to change notification settings

boomytc/AEA

Repository files navigation

音频事件检测系统(AEA)

基于机器学习的音频事件检测系统,可以准确识别音频中的多个事件状态(如停车、慢车、飞行、悬停、转弯等)及其转换时刻。系统采用多进程并行处理,显著提高了训练和检测速度。

Todo

Todo List

  • 模型训练

    • 使用xgboost进行分类训练模型
    • 优化模型参数
    • 添加模型评估指标
  • 事件预测功能

    • 实现event_guess.py支持模型选择
    • 添加批量预测功能
    • 优化预测速度
  • Web界面开发

    • 实现webui.py支持模型选择
    • 修复XGBoost模型在Web界面中的预测问题
    • 添加更多可视化功能
    • 优化用户交互体验

主要特点

  • 高效处理:多进程并行特征提取,训练和检测速度提升显著
  • 多模型支持:支持随机森林和XGBoost两种模型,XGBoost模型提供更高的预测准确率和置信度
  • 多状态检测:支持多种事件状态检测(停车、慢车、飞行、悬停、转弯等)
  • 状态转换识别:能够检测从一种状态到另一种状态的转换过程
  • 高准确率:平均准确率达到85%以上
  • 实时分析:支持实时状态转换检测
  • 置信度评估:提供预测结果的置信度,有助于判断可靠性
  • 用户友好:提供Web界面,便于可视化分析
  • 轻量级依赖:仅依赖常见Python库

实现原理

1. 音频特征提取

系统使用以下音频特征进行事件检测:

  1. MFCC(梅尔频率倒谱系数)

    • 捕捉音频的音色特征
    • 使用13个系数
    • 包含均值和标准差统计量
  2. 梅尔频谱

    • 表示音频的频率特征
    • 使用40个梅尔频带
    • 包含均值和标准差统计量
  3. 光谱对比度

    • 捕捉音频的动态特征
    • 使用6个频带
    • 包含均值和标准差统计量
  4. 零交叉率(ZCR)

    • 作为音高的替代特征
    • 反映信号的频率变化
    • 包含均值和标准差统计量
  5. RMS能量

    • 作为响度的替代特征
    • 反映信号的能量变化
    • 包含均值和标准差统计量

特征提取技术细节

特征提取过程在utils/feature_extract.py中实现,主要包括以下步骤:

  1. 音频加载与预处理

    • 支持从文件路径或内存缓冲区加载音频
    • 将音频重采样至22050Hz,确保特征提取的一致性
    • 将立体声音频转换为单声道
  2. 特征计算

    • 使用librosa库提取各类音频特征
    • 对于每个特征,计算其均值和标准差作为统计特征
    • 使用较大的hop_length(1024)和n_fft(2048)参数优化计算效率
  3. 特征向量构建

    • 将所有提取的特征连接成一个特征向量
    • 最终特征向量维度为:(13×2) + (40×2) + (6×2) + 4 = 122维
  4. 分段特征提取

    • 支持将长音频分割成固定时长的段
    • 对每个段独立提取特征,便于捕捉时间变化特征

2. 音频分离技术

系统使用Demucs音频分离技术,将音频分离为人声和非人声部分,主要实现在utils/audio_separator.pyaudio_separate.py中:

  1. Demucs模型

    • 默认使用htdemucs预训练模型
    • 支持GPU加速,显著提高分离速度
    • 可配置的随机移位(shifts)参数提高分离质量
  2. 分离过程

    • 将音频分割成小块进行处理,减少内存占用
    • 支持配置分割重叠率(overlap)提高分离质量
    • 使用多进程并行处理,加速分离过程
  3. 分离结果处理

    • 自动将分离结果重命名为更直观的文件名(如"_vocals"改为"_voice","_no_vocals"改为"_ambient")
    • 支持仅保留无人声部分用于后续分析
    • 提供临时目录管理,确保资源有效利用
  4. 应用于事件检测

    • 在事件检测前先进行音频分离,仅使用无人声部分进行分析
    • 这种方法可以有效减少人声对事件检测的干扰
    • 通过events_guess_only_ambient.py中的函数实现无缝集成

3. 模型训练与优化

系统支持两种机器学习模型:随机森林(RF)和XGBoost,分别在train.pytrain_xgboost.py中实现:

3.1 数据准备

  1. 数据加载

    • data_list.txt文件加载音频文件路径和对应标签
    • 支持状态转换标签(如"慢车到飞行"),自动分割音频并为每个部分分配相应标签
  2. 并行处理

    • 使用ProcessPoolExecutor实现多进程并行特征提取
    • 自动根据CPU核心数选择最优进程数
    • 使用内存缓冲区代替临时文件,提高IO效率
  3. 特征标准化

    • 使用StandardScaler对特征进行标准化
    • 保存标准化器以便在预测时使用
    • 确保不同音频文件的特征具有相同的分布

3.2 随机森林模型

  1. 模型配置

    • 使用100棵决策树构建随机森林
    • 并行训练提高效率
    • 随机种子固定为42,确保结果可复现
  2. 训练过程

    • 将数据分为80%训练集和20%测试集
    • 使用训练集训练模型
    • 在测试集上评估模型性能
  3. 模型评估

    • 使用分类报告(classification_report)评估模型
    • 包括精确率、召回率、F1分数等指标
    • 平均准确率达到85%以上

3.3 XGBoost模型

  1. 模型配置

    • 使用多分类目标函数(multi:softprob)
    • 配置学习率、树深度、特征采样等超参数
    • 使用直方图算法(hist)加速训练
  2. 训练过程

    • 将标签转换为数值索引
    • 创建DMatrix对象进行高效训练
    • 使用100轮迭代训练模型
  3. 模型保存

    • 同时保存模型和标签映射关系
    • 标签映射用于将预测索引转回原始标签
    • 模型和映射关系存储在同一个文件中

4. 事件检测与预测

事件检测是系统的核心功能,主要在events_guess.pyevents_guess_only_ambient.py中实现:

4.1 滑动窗口分析

  1. 窗口设计

    • 使用固定大小的时间窗口(默认2秒)
    • 窗口之间有重叠(默认步长1秒)
    • 可通过参数调整窗口大小和步长
  2. 并行处理

    • 使用ThreadPoolExecutor并行处理多个窗口
    • 每个窗口独立提取特征和预测
    • 提高长音频文件的处理效率
  3. 置信度过滤

    • 为每个预测结果计算置信度
    • 使用置信度阈值过滤低可信度预测
    • 默认阈值为0.55,可通过参数调整

4.2 模型预测

  1. 特征提取

    • 对每个窗口提取与训练相同的特征
    • 使用保存的标准化器进行特征标准化
    • 确保特征分布与训练数据一致
  2. 模型选择

    • 支持随机森林和XGBoost两种模型
    • 根据模型类型选择不同的预测方法
    • XGBoost模型需要额外处理标签映射
  3. 预测结果处理

    • 针对XGBoost模型的预测结果进行特殊处理
    • 确保使用整数索引访问标签映射
    • 将numpy字符串转换为Python字符串

4.3 结果合并与优化

  1. 相邻预测合并

    • 合并相邻的相同事件预测
    • 计算合并事件的平均置信度
    • 减少结果碎片化,提高可读性
  2. 结果输出

    • 输出每个检测到的事件、开始时间、结束时间和置信度
    • 按时间顺序排列事件
    • 提供格式化的输出便于阅读

5. Web界面实现

系统提供了基于Streamlit的Web界面,在webui.py中实现:

5.1 用户界面设计

  1. 参数配置

    • 侧边栏提供模型选择(随机森林/XGBoost)
    • 可调整窗口大小、步长和置信度阈值
    • 支持选择是否仅使用无人声部分进行检测
  2. 高级选项

    • 支持自定义模型路径
    • 提供参数说明帮助用户理解各选项作用
    • 使用折叠面板保持界面简洁
  3. 文件上传

    • 支持上传WAV和MP3格式音频文件
    • 自动处理上传文件并创建临时文件
    • 分析完成后自动清理临时文件

5.2 可视化展示

  1. 音频波形图

    • 显示完整音频的时域波形
    • 直观展示音频的振幅变化
    • 帮助用户识别音频中的明显变化
  2. 梅尔频谱图

    • 展示音频的频率特性
    • 使用梅尔刻度更符合人耳感知
    • 帮助识别不同事件的频率特征
  3. MFCC特征图

    • 显示提取的MFCC特征
    • 展示音频的音色特征
    • 便于理解模型使用的特征

5.3 结果展示

  1. 事件列表

    • 使用可展开面板显示每个检测到的事件
    • 显示事件类型、开始时间、结束时间和置信度
    • 按时间顺序排列事件
  2. 音频信息

    • 显示音频的基本信息(采样率、时长等)
    • 显示使用的模型类型
    • 显示是否使用了无人声部分进行分析
  3. 进度反馈

    • 使用进度条显示处理进度
    • 提供状态文本实时更新处理状态
    • 显示详细的错误信息(如果有)

6. 系统集成与优化

整个系统通过多个模块的紧密集成实现高效的音频事件检测:

  1. 模块化设计

    • 特征提取、模型训练、事件预测和界面展示各自独立
    • 模块间通过清晰的接口进行交互
    • 便于维护和扩展
  2. 性能优化

    • 多进程并行处理提高特征提取速度
    • 多线程并行处理提高预测速度
    • 使用内存缓冲区代替临时文件减少IO开销
  3. 错误处理

    • 完善的异常捕获和处理机制
    • 详细的错误信息输出
    • 对XGBoost模型的特殊处理确保预测结果正确
  4. 智能模型选择

    • 根据模型类型自动选择正确的模型路径
    • 支持自定义模型路径满足高级需求
    • 对不同模型的预测结果进行适当处理

7. 系统特点总结

  1. 高准确率:通过精心设计的特征提取和模型训练,系统能够以85%以上的准确率识别各种音频事件。

  2. 实时性能:多进程并行处理和优化的算法设计使系统能够快速处理音频文件,支持实时分析。

  3. 抗干扰能力:通过音频分离技术,系统能够有效过滤人声干扰,提高在复杂环境中的检测准确率。

  4. 易用性:直观的Web界面和丰富的可视化功能使系统易于使用,无需专业知识即可进行音频事件分析。

  5. 可扩展性:模块化设计和清晰的代码结构使系统易于扩展,可以添加新的特征、模型和功能。

系统要求

  • Python 3.8+
  • Linux/macOS/Windows

安装

  1. 克隆仓库:
git clone https://github.com/boomytc/AEA.git
cd AEA
  1. 创建并激活虚拟环境(推荐):
conda create -n AEA python=3.10 -y
conda activate AEA
  1. 安装依赖:
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界面

使用方法

1. 准备数据

创建一个data_list.txt文件,每行包含音频文件路径和对应的标签:

/path/to/audio1.wav 停车
/path/to/audio2.wav 慢车到飞行
/path/to/audio3.wav 飞行

状态标签包括:

  • 单一状态:停车慢车飞行悬停转弯
  • 状态转换:停车到慢车慢车到飞行飞行到慢车慢车到停车

2. 训练模型

训练随机森林模型:

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

3. 预测音频状态

可以通过两种方式使用训练好的模型:

3.1 使用Python API进行预测

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%}")

3.2 使用Web界面进行可视化分析

启动Web界面:

streamlit run webui.py

Web界面功能:

  • 上传音频文件进行分析
  • 调整分析参数(窗口大小、滑动步长、置信度阈值)
  • 可视化音频波形、梅尔频谱和MFCC特征
  • 显示事件检测结果和时间线
  • 提供音频播放功能

脚本使用示例

本节提供各个脚本的实际使用示例。

train.py - 模型训练

# 训练模型
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")

events_guess.py - 事件预测

# 使用随机森林模型(默认)
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 vs 随机森林

两种模型的对比:

  1. 性能比较

    • XGBoost模型通常提供更高的准确率和置信度
    • 随机森林在处理噪声数据时可能更加稳健
  2. 预测置信度

    • XGBoost模型的置信度通常更高,在测试中比随机森林高出约10-20%
    • 更高的置信度有助于降低误判率
  3. 运行速度

    • XGBoost模型的预测速度略快于随机森林
    • 对于实时分析场景,XGBoost可能是更好的选择
  4. 使用建议

    • 对于需要高精度识别的场景,推荐使用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

XGBoost模型结果

检测到的事件:
事件: 飞行, 开始时间: 2.00s, 结束时间: 32.00s, 置信度: 84.34%
事件: 慢车, 开始时间: 32.00s, 结束时间: 34.50s, 置信度: 88.54%

总执行时间: 0.76秒

随机森林模型结果

检测到的事件:
事件: 慢车, 开始时间: 34.00s, 结束时间: 36.50s, 置信度: 74.57%

总执行时间: 1.28秒

结果分析

  1. 检测能力对比

    • XGBoost模型检测到了两个事件(飞行和慢车)
    • 随机森林模型只检测到一个事件(慢车)
    • XGBoost模型检测到了更早发生的慢车事件(32.00s vs 34.00s)
  2. 置信度对比

    • XGBoost模型的置信度明显更高(飞行:84.34%,慢车:88.54%)
    • 随机森林模型的置信度较低(慢车:74.57%)
    • XGBoost模型在窗口级别的置信度普遍高出随机森林10-30个百分点
  3. 运行速度对比

    • XGBoost模型总执行时间:0.76秒
    • 随机森林模型总执行时间:1.28秒
    • XGBoost模型执行速度快约40%
  4. 检测窗口比较

    • 在窗口级别的分析中,XGBoost能够在高置信度下(>70%)识别更多窗口
    • 随机森林在大部分窗口的置信度都低于70%,因此被过滤掉

这些测试结果验证了XGBoost模型在音频事件检测任务中的优势,包括更高的检测准确率、更高的置信度评分以及更快的执行速度。

项目总结

本项目成功完成了在音频事件检测系统中将随机森林模型替换为XGBoost模型的全流程实现,并增强了系统的灵活性和性能。

主要成果

  1. 模型实现

    • 成功实现了train_xgboost.py脚本,用于训练XGBoost模型
    • 修改了特征提取和数据处理逻辑,以适应XGBoost的需求
    • 实现了模型保存和加载机制,便于后续使用
  2. 预测功能增强

    • 更新了events_guess.py脚本,支持两种模型类型的选择
    • 添加了命令行参数(--model_type),允许用户灵活选择模型
    • 改进了预测逻辑,支持不同模型的输出格式和置信度计算
  3. Web界面优化

    • 增强了webui.py,添加模型选择功能
    • 提供了高级选项,支持自定义模型路径
    • 优化了用户界面,显示当前使用的模型类型和相关信息
  4. 性能提升

    • 测试结果表明,XGBoost模型在准确率上显著优于随机森林
    • XGBoost的置信度普遍高出10-30个百分点
    • 执行速度提高约40%,更适合实时应用场景
  5. 文档完善

    • 更新了README.md文件,添加了XGBoost相关说明
    • 提供了两种模型的使用对比和建议
    • 添加了测试结果和性能分析

技术要点

  1. XGBoost参数配置

    • 通过调整学习率、最大深度、子采样率等参数优化模型表现
    • 利用早停技术避免过拟合
    • 设置适当的目标函数和评估指标
  2. 特征工程适配

    • 确保特征集适合XGBoost的数据结构要求
    • 优化特征提取过程,提高信息提取效率
  3. 预测逻辑优化

    • 根据XGBoost和随机森林的不同特性,优化预测代码
    • 为不同模型实现适当的置信度计算方法
  4. 用户界面设计

    • 精心设计用户界面,提供直观的模型选择功能
    • 优化结果展示,更清晰地传达预测信息

结论

通过引入XGBoost模型并重构系统,本项目成功地提高了音频事件检测的准确率和性能。与原有的随机森林模型相比,XGBoost展现出更高的预测置信度和更好的事件识别能力,特别是在处理复杂音频模式时。同时,系统的灵活性也得到了提升,允许用户根据具体需求选择合适的模型。

最新的改进解决了Web界面中使用XGBoost模型的兼容性问题,使得系统能够在命令行和Web界面中一致地高效运行。这确保了在实际应用场景中的可靠性和易用性。

这些改进使得系统在实际应用中能够提供更可靠的事件检测结果,为进一步开发和优化奠定了坚实基础。未来工作将继续关注模型参数优化、批量处理功能和用户体验提升等方面。

注意事项

  1. 音频文件要求

    • 支持常见音频格式(wav, mp3, flac等)
    • 建议使用无损格式(如wav)以获得最佳效果
    • 所有音频会自动调整为22050Hz采样率进行处理
  2. 内存使用

    • 特征提取过程会并行处理
    • 建议为大量音频处理预留足够内存
    • 处理过程使用内存缓冲区而非临时文件,提高效率
  3. 模型优化

    • 当前模型针对特定场景优化
    • 对于新的音频类型可能需要重新训练
    • 可调整随机森林参数以优化特定场景性能
  4. Web界面限制

    • 上传文件大小可能受到Streamlit限制
    • 长音频文件分析可能需要较长时间

未来计划

  • 增加深度学习模型支持
  • 优化长音频处理性能
  • 添加批量处理功能
  • 改进实时分析能力

贡献

欢迎提交Issue和Pull Request以帮助改进项目。

许可

MIT License

webui.py - Web界面

# 启动Web界面
streamlit run webui.py

Streamlit Web界面支持:

  • 上传音频文件或使用示例音频
  • 指定外部音频文件路径
  • 选择分析模型(随机森林或XGBoost)
  • 调整窗口大小、滑动步长和置信度阈值
  • 可视化显示音频波形、频谱图和检测结果
  • 自定义模型路径

如何使用Web界面

  1. 启动Web界面:
streamlit run webui.py
  1. 打开浏览器访问显示的地址(通常是http://localhost:8501)

  2. 选择要分析的音频文件:

    • 上传音频文件
    • 或指定音频文件路径
    • 或使用示例音频
  3. 选择设置:

    • 分析模型(随机森林或XGBoost)
    • 窗口大小(秒)
    • 滑动步长(秒)
    • 置信度阈值
  4. 点击"分析音频"按钮开始处理

  5. 查看生成的可视化结果:

    • 音频波形图
    • 梅尔频谱图
    • 检测到的事件列表

最新更新 (2025年3月3日)

  1. XGBoost模型Web界面集成

    • 修复了Web界面中使用XGBoost模型时的关键问题
    • 解决了使用XGBoost模型在Web界面中出现的"list indices must be integers or slices, not str"错误
    • 增强了模型自动选择逻辑,根据选择的模型类型自动设置正确的模型路径
  2. NumPy字符串处理优化

    • 改进了analyze_audio_segment函数,确保正确处理NumPy字符串类型的标签
    • 添加了类型转换保障,确保从XGBoost模型获取预测标签时能正确处理不同类型
  3. 错误处理增强

    • 添加了更详细的异常捕获和错误信息展示
    • 改进了错误报告机制,便于调试和问题定位
  4. 模型路径智能选择

    • Web界面现在能根据所选模型类型自动选择合适的模型文件
    • 支持自定义模型路径覆盖默认设置

这些改进确保了Web界面中的XGBoost模型能与命令行工具一样可靠地工作,为用户提供了更多高性能的选择。

性能指标


About

AEA(Audio Event Analysis)实现对音频事件的检测

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages