# AutoEncoding **Repository Path**: char-x/auto-encoding ## Basic Information - **Project Name**: AutoEncoding - **Description**: 音频卡顿分析脚本AutoEncoding - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-16 - **Last Updated**: 2026-07-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 音频异常检测工具集 --- ## 安装 **macOS (Apple Silicon):** ```bash chmod +x setup_mac.sh && ./setup_mac.sh ``` **Windows / Linux:** ```bash pip install torch librosa numpy scipy matplotlib soundfile ``` --- ## Bark 尺度变换 ### 频率 → Bark ``` Bark(f) = 13·arctan(0.00076·f) + 3.5·arctan((f/7500)²) ``` ### Bark → 频率 (Newton-Raphson) ``` 初始值: f₀ = 1960·(z + 0.53) / (26.28 - z) 导数: d(f) = 13·0.00076 / (1+(0.00076f)²) + 3.5·2·(f/7500)·(1/7500) / (1+(f/7500)²) 迭代: f ← f + (z - Bark(f)) / d(f), 直到 |Δ| < 1e-6 ``` ### 24 组三角滤波器 滤波器 k 由三个边界频率定义:`[lo_k, center_k, hi_k]`。 `center_k = Bark⁻¹(linspace(Bark(0), Bark(Nyquist), 26))`。 每带响应为三角窗:边界处=0,中心=1。 Bark 带能量 = `FFT_power @ H.T`(矩阵乘,一次性完成映射)。 ### 频率表 (标准临界频带,1 Bark/带) "带号" = 该带在 Bark 尺度上的起始值。 | 带 | Bark 范围 | 下界 Hz | 中心 Hz | 上界 Hz | 带宽 Hz | |----|----------|--------|---------|--------|---------| | 1 | [0, 1) | 0 | 50 | 101 | 101 | | 2 | [1, 2) | 101 | 152 | 203 | 102 | | 3 | [2, 3) | 203 | 255 | 308 | 105 | | 4 | [3, 4) | 308 | 362 | 416 | 108 | | 5 | [4, 5) | 416 | 472 | 530 | 114 | | 6 | [5, 6) | 530 | 589 | 651 | 121 | | 7 | [6, 7) | 651 | 714 | 780 | 130 | | 8 | [7, 8) | 780 | 849 | 922 | 142 | | 9 | [8, 9) | 922 | 998 | 1078 | 156 | | 10 | [9, 10) | 1078 | 1164 | 1254 | 176 | | 11 | [10, 11) | 1254 | 1351 | 1456 | 202 | | 12 | [11, 12) | 1456 | 1568 | 1690 | 234 | | 13 | [12, 13) | 1690 | 1823 | 1968 | 278 | | 14 | [13, 14) | 1968 | 2127 | 2302 | 334 | | 15 | [14, 15) | 2302 | 2496 | 2710 | 408 | | 16 | [15, 16) | 2710 | 2948 | 3211 | 501 | | 17 | [16, 17) | 3211 | 3502 | 3822 | 611 | | 18 | [17, 18) | 3822 | 4172 | 4553 | 731 | | 19 | [18, 19) | 4553 | 4966 | 5411 | 858 | | 20 | [19, 20) | 5411 | 5892 | 6413 | 1002 | | 21 | [20, 21) | 6413 | 6984 | 7617 | 1204 | 21 带共覆盖 0–21 Bark,与 16kHz Nyquist (≈21.28 Bark) 对齐。 低频带宽约 100Hz,高频带宽达 1200Hz,符合人耳临界带宽特性。 --- ## 1. 平滑度分歧检测(推荐,无需训练) 前后拉格朗日外推分歧 + LPF 百分位自适应阈值 + 双峰边缘配对。 ```bash python3 smoothness_detect.py sample.m4a python3 smoothness_detect.py sample.m4a --save-excep --pct 99.99 ``` | 参数 | 默认值 | 说明 | |------|--------|------| | `--window` | 50 | 配对窗口 ms | | `--lpf` | 10 | LPF 基线窗口 ms | | `--pct` | 99.99 | 百分位阈值 | | `--save-excep` | — | 保存事件图到 `bimodal_events/` | | `--show` | — | GUI 弹窗 | ### 公式 ``` pf = 3·x[i-1] - 3·x[i-2] + 1·x[i-3] (前向拉格朗日) pb = 3·x[i+1] - 3·x[i+2] + 1·x[i+3] (后向拉格朗日) e = |pf-pb| + |pf-x| + |pb-x| (三向分歧) r = e / LPF(e, 10ms) (局部自归一化) ``` 阈值 = ratio 的 P0.01%。边缘配对:50ms 内方向相反 → 上报事件。 --- ## 2. 频谱自编码器(配置文件驱动) 音频分块 FFT → N 维频谱 → 全连接 AE → 重建误差检测异常。 RAW 模式:线性频点;BARK 模式:24 组三角滤波器 → log-power。 ```bash python3 speech_ae_detect.py -f config_train.json # 训练 python3 speech_ae_detect.py -f config_infer.json # 推理 ``` ### MLP 结构 按输入维度自适应(第1隐层=输入×¾,隐空间=第1隐层/2上取整): | 输入 | 结构 | 参数量 | |------|------|--------| | 10 (bark≥11) | 10→7→7→4 | ~390 | | 18 (bark全) | 18→13→13→7 | ~1,100 | | 32 (raw) | 32→24→24→12 | ~3,500 | 所有层间加 BatchNorm + ReLU,输出 Sigmoid 到 [0,1]。 ### 损失函数 统一使用 **MSE + 平坦惩罚**(Bark 和 RAW 模式相同): ``` Loss = MSE(recon, target) + λ / (σ_freq + 1e-4) σ_freq = std(recon, dim=freq) ← 重建频谱方差 λ = 0.05 (lambda_flat) ← 平坦惩罚权重(Bark模式降低) ``` ### 训练配置 `config_train.json`: ```json { "mode": "train", "train_files": ["sample.m4a", "verify.wav"], "exclude_intervals": [[[9, 12], [310, 315]], []], "exclude_csv": ["sample_exclude.csv", "verify_exclude.csv"], "fft_size": 64, "hop": 32, "spectrum_mode": "bark", "bark_min": 11, "window_type": "blackmanharris", "batch_size": 512, "epochs": 150, "lr": 0.0003, "lambda_flat": 0.5, "patience": 25, "output_model": "speech_ae_model.pt" } ``` - `train_files`: 支持多文件 - `exclude_intervals`: 硬编码排除区间,与文件一一对应 - `exclude_csv`: Audition 导出的 CSV,每行 `Start` 列 ±10ms 排除,与文件一一对应 - `hop: 32`: 64 点 FFT 下 50% 重叠,训练样本翻倍 - `bark_min: 11`: 只取 Bark ≥11 的高频带(10维输入),聚焦杂音敏感频段 - CSV 支持 `mm:ss.ms` 和秒数两种格式 ### 推理配置 `config_infer.json`: ```json { "mode": "inference", "file": "sample.m4a", "model": "speech_ae_model.pt", "batch_size": 256, "glitch_intervals": [[310, 315]], "sigma": 4.0, "save_events": true, "events_dir": "spec_events" } ``` ### 完整字段 | 字段 | 模式 | 默认值 | 说明 | |------|------|--------|------| | `mode` | 共用 | 必填 | `train` / `inference` | | `train_files` | train | 必填 | 训练文件路径列表 | | `exclude_intervals` | train | `[]` | 硬编码排除区间,与文件一一对应 | | `exclude_csv` | train | `[]` | CSV 排除文件,`Start` 列 ±10ms,与文件一一对应 | | `fft_size` | train | 64 | FFT 点数 | | `hop` | train | fft | 滑动步长(32=50%重叠) | | `spectrum_mode` | 共用 | `raw` | `raw` / `bark` | | `bark_min` | 共用 | 11 | Bark 最低带(只取高频 ≥11) | | `window_type` | 共用 | `blackmanharris` | FFT 窗 | | `batch_size` | 共用 | 512/256 | 批次大小 | | `epochs` | train | 150 | 最大轮数 | | `lr` | train | 0.001 | 学习率 | | `lambda_flat` | train | 0.5 | 平坦惩罚系数 | | `patience` | train | 25 | 早停轮数 | | `output_model` | train | — | 模型保存路径 | | `file` | inference | 必填 | 待检测文件 | | `model` | inference | 必填 | 预训练模型路径 | | `glitch_intervals` | inference | `[]` | 阈值排除区间 | | `sigma` | inference | 4.0 | 阈值倍数 | | `save_events` | inference | false | 导出事件图 | | `events_dir` | inference | `spec_events` | 事件图目录 | ### 窗类型 | 值 | 窗函数 | |----|--------| | `hann` | Hann | | `hamming` | Hamming | | `blackman` | Blackman | | `blackmanharris` | Blackman-Harris (4-term) | | `bartlett` | Bartlett | | 缺省 | Hann | ### 日志 ``` Epoch 50 | train=0.108 val_max=0.15 val_mean=0.06 lr=2.50e-04 ``` | 字段 | 含义 | |------|------| | train | 训练 Loss | | val_max | 验证集最大 MSE | | val_mean | 验证集平均 MSE | | lr | 学习率 (Plateau 自动衰减) | --- ## 3. Bark 热力图 256pt FFT + 24 组三角 Bark 滤波器 → 时间-Bark 带能量热力图。 支持格式:`.wav` / `.m4a` ```bash python3 bark_heatmap.py sample.m4a python3 bark_heatmap.py sample.m4a --n-fft 128 --t-start 310 --t-end 315 ``` | 参数 | 默认值 | 说明 | |------|--------|------| | `--n-fft` | 256 | FFT 点数 | | `--hop` | n_fft/2 | 滑动步长 (采样点) | | `--n-bark` | 24 | Bark 滤波器组数 | | `--t-start` | None | 起始时间 (秒),不指定=从头 | | `--t-end` | None | 结束时间 (秒),不指定=到尾 | | `--show` | None | 弹出 GUI 窗口 | --- ## 4. 分频带平坦度 64pt FFT 分块,0-4kHz 和 4-8kHz 分别计算频谱平坦度(几何/算术均值比)。 低于 -90dB 的频点忽略,纵轴对数坐标。 ```bash python3 flatness_plot.py sample.m4a ``` | 参数 | 默认值 | 说明 | |------|--------|------| | `--fft` | 64 | FFT 点数 | | `--win` | 32 | 滑动平滑窗口 (块数) | | `--show` | None | 弹出 GUI | --- ## 5. 急动度绘图 三阶导数 (jerk = d³x/dt³),对波形突变极度敏感。 ```bash python3 jerk_plot.py sample.m4a ``` | 参数 | 默认值 | 说明 | |------|--------|------| | `--t-start` | 311.965 | 目标区起始 (s) | | `--t-end` | 311.970 | 目标区结束 (s) | | `--show` | None | 弹出 GUI | --- ## 6. 边缘状态机 前向拉格朗日预测 + 动态阈值 + 状态机配对。 ```bash python3 edge_state_detect.py sample.m4a ``` --- ## 设备加速 自动选择 **MPS (Apple Silicon) > CUDA > CPU**。 --- ## 支持格式 `.wav`, `.m4a`。其他格式需先用 ffmpeg 转换。