基于炬芯ATS308X的MLP DNN深度学习KWS语音识别实现(单唤醒词版本-谷歌mini Speech Commands数据集)

0 数据集准备

1上位机python训练

python application/bt_watch/tools/wakeword/prepare_public_kws.py --archive "D:\data\public_kws\downloads\mini_speech_commands.zip" --out "D:\data\public_kws\mini_speech_commands_stop" --word yes

可更换训练词:yes / no / up / down / left / right / stop / go` 八类

2 训练完成后,把wake_model.bin 复制到板子u盘。

3 实现代码上位机+下位机

4 嵌入式串口指令

识别命中yes

  1. 算法与部署原理

```mermaid

flowchart TD

RECPC MIC / 导入板端 WAV --> DATA正负样本清单与独立 train / valid / test

DATA --> TRAINNumPy:反向传播 + Adam 训练 MLP

TRAIN --> QUANT仅 train 校准量化;仅 valid 选择阈值

QUANT --> BINwake_model.bin + 训练和评估记录

BIN --> NAND复制到设备 NAND,加载前校验

MIC板端 MIC0 / 16 kHz / s16 --> DMADMA 搬运 / 单消费者 PCM 缓存

DMA --> VAD10 ms 块 VAD、50 ms 前滚、300 ms 尾静音

VAD --> MFCCMFCC + 逐句 CMN

MFCC --> NN32 格插值 / INT8 MLP / 概率门限

NAND --> NN

NN --> EVENT唤醒事件序号、词名、概率

```

1.1 网络类型、层数与参数量

当前神经网络是 **MLP(Multilayer Perceptron,多层感知机/全连接前馈网络)**,采用 NumPy 实现训练、C 实现板端推理。没有卷积层,不属于 CNN;没有循环状态,不属于 RNN/LSTM,也没有使用 Transformer。MFCC 是网络前的固定信号处理算法,不是额外的可训练神经层;新 `app wake` 不调用旧 `app asr` 的 DTW 模板分类器。

结构为 **416 → 48 → 24 → 2**。按带权重的层计算是 **3 层**:两个隐藏层和一个输出层;若把输入层也计入,通常称为 **4 层网络**。ReLU 和 Softmax 属于激活/输出变换,不另计为带参数层。

```mermaid

flowchart LR

X"输入:416 个特征" --> H1"全连接 416→48 + ReLU"

H1 --> H2"全连接 48→24 + ReLU"

H2 --> Z"全连接 24→2:两个 logits"

Z --> P"Softmax:other / wake"

P --> G"wake 分数与阈值比较"

```

| 部分 | 单条数据的形状 | 激活 | 权重形状,输出×输入 | 权重数 | 偏置数 | 参数合计 |

| --- | --- | --- | --- | ---: | ---: | ---: |

| 输入层 | `416` | 无 | 无 | 0 | 0 | 0 |

| 第 1 全连接层/隐藏层 1 | `416 → 48` | ReLU | `48,416` | 19968 | 48 | 20016 |

| 第 2 全连接层/隐藏层 2 | `48 → 24` | ReLU | `24,48` | 1152 | 24 | 1176 |

| 第 3 全连接层/输出层 | `24 → 2` | 先输出 logits,再做 Softmax | `2,24` | 48 | 2 | 50 |

| 合计 | --- | --- | --- | **21168** | **74** | **21242** |

三层点积合计每次推理 **21168 MACs(乘加)**。这不包含 MFCC、时间插值、量化、激活和 Softmax 的计算量,也不能直接换算为板端耗时。采用小型 MLP 是为了让模型文件、计算和 C 部署保持简单;复杂环境下的准确率仍由数据、前端和实测决定,不能仅由层数判断。

1.2 原始输入:WAV/PCM 到 MFCC

PC 端输入是 **16000 Hz、单声道、有符号 16-bit PCM WAV**。板端从 MIC 采集同规格 PCM;WAV 文件头只供 PC 读文件时解析,不送入神经网络。1 秒音频约有 16000 个采样点、32000 字节 PCM。工具不自动把 8 kHz/44.1 kHz、双声道文件转换为此格式,导入前需先转换并试听。

| 顺序 | 处理 | 参数与输出 |

| --- | --- | --- |

| 1 | 幅值归一化 | `xn = int16_sample / 32768.0`,得到浮点样本 |

| 2 | 预加重 | `yn = xn - 0.97 × xn-1`,强调较高频率成分 |

| 3 | 分帧与能量筛选 | 每帧 400 点/25 ms,步长 160 点/10 ms;最后不足一帧时按实现补零;预加重帧的均方能量达到 `1e-6` 才保留 |

| 4 | 加窗与频谱 | Hamming 窗,补零至 512 点 FFT;功率谱使用 `|FFT|² / 512` |

| 5 | Mel 滤波 | 26 个三角滤波器,覆盖 80~7600 Hz,对各频带功率加权求和 |

| 6 | 13 维 MFCC | `c0` 为线性 Mel 能量平均后取自然对数;`c1..c12` 为对数 Mel 能量的归一化 DCT-II 系数 |

| 7 | 逐句 CMN | 对每一维系数,减去该句所有保留帧的均值;不除标准差、不增加 delta/delta-delta 特征 |

本工程的 `c0` 具体为 `ln((1e-12 + Σ E_m) / 26)`,其中 `E_m` 是各 Mel 频带的线性能量。它不是通用 MFCC 库默认的 DCT 第 0 项。训练和板端使用同一前端合同,不能直接用另一个库的默认 MFCC 替换后沿用现有模型。

板端在这套逐帧特征计算之外,还有短语级 VAD:按 10 ms 块处理,保留约 50 ms 前滚,等待约 300 ms 尾静音后完成一句;启动时先安静校准底噪约 500 ms。PC `predict --wav` 直接处理指定 WAV,不模拟整段连续录音的板端短语切分,所以实际测试还需要检查 MIC、VAD、丢样和噪声。

1.3 神经网络为什么固定输入 416 维

一条录音经过特征提取后得到 `T,13`,`T` 是保留的有效语音帧数。当前训练入口和板端运行器要求 **20 ≤ T ≤ 160**;静音、过短或过长在进入正常分类前被拒绝。这里约 0.2~1.6 秒描述的是保留语音帧规模,不是 WAV 总时长;录音可以包含前后静音。

为了让不同语速的短语都进入同一网络,沿 MFCC 的时间轴均匀线性插值到 **32 个时间点**:

```text

原始 PCM N N 随录音时长变化

MFCC + 逐句 CMN T,13 T 为有效帧数,20~160

时间线性插值 32,13 32 个时间点,每点 13 个系数

按时间顺序展平 416 32 × 13 = 416

训练/PC 批量输入 B,416 B 为批量大小,默认 32

```

插值位置为 `p(t) = t × (T-1) / 31`,`t=0..31`;每个位置由左右两帧按距离加权。展平顺序为 `t0:c0..c12, t1:c0..c12, ... , t31:c0..c12`。这保留了特征的相对先后顺序,但把语速对应的时长归一到固定长度。

这里的 32 是 **MFCC 时间点数**,不是 32 个原始采样点,也不是 32 个词;13 是每帧 MFCC 维数,不是类别数。时间插值作用于特征,不改变原始音频的 16 kHz 采样率。

PC 的 `feature_vector()` 生成浮点 `416`,单条预测会按 `1,416` 计算。板端 `wake_nn_predict()` 接口接收已做 CMN 的浮点 `T,13`,在函数内部完成插值、展平和输入量化后送入全连接层。

1.4 输出层、类别与命中条件

浮点前向计算为:

```text

h1 = ReLU(x × W1ᵀ + b1) 416 → 48

h2 = ReLU(h1 × W2ᵀ + b2) 48 → 24

z = h2 × W3ᵀ + b3 24 → 2

p = Softmax(z) 2 → 2

```

输出顺序固定为 **索引 0=`other`,索引 1=`wake`**。两个 logits `z0/z1` 是未经归一化的分数;Softmax 转为 `P(other)` 和 `P(wake)`,两者之和约为 1。`P(wake)=exp(z1)/(exp(z0)+exp(z1))`,实现使用等价的稳定算法避免指数溢出。

例如 `phrase=yes` 时,输出 `0.02,0.98` 表示当前声音的目标词分数为 0.98;输出 `0.97,0.03` 表示更接近其它语音。它不输出英文字符或中文文字,也没有为其余七个公开集词分别保留一个输出神经元。

最终命中必须同时满足:

```text

P(wake) > 0.5 且 P(wake) >= 模型内的 threshold

```

例如阈值为 0.90,分数 0.98 命中,0.70 拒绝;即使 `wake` 分数大于 `other`,也可能因未达到阈值而拒绝。恰好 0.5 时始终拒绝。这些数值只是说明判决规则的例子,实际阈值以本次 `inspect` 或 `wake_model.json` 为准。

PC `predict` 输出 `phrase/probability/threshold/wake`;板端保存 `matched/probability/logits2/feature_frames`,命中时发布事件和 `wake HIT`。日志 `score_milli` 是分数乘 1000 后的整数显示,不是准确率;Softmax 分数也不等于经过校准的真实成功概率。

`phrase` 是模型中的词名元数据,用于显示和发布事件。网络读入的是声音特征,不是这个字符串;把 `yes` 文本改成"你好小安",不会让已训练的权重学会中文发音。

1.5 PC 如何训练,三个数据集分别做什么

PC 从头训练浮点网络,没有加载预训练语音模型。训练采用反向传播和 Adam;默认 `epochs=100`、`batch_size=32`、`learning_rate=0.001`、`seed=42`、`patience=20`。

| 数据集合 | 使用方式 |

| --- | --- |

| train | 更新权重;校准导出时的 INT8 输入、权重和激活尺度 |

| valid | 按最小验证损失选择最佳 checkpoint;使用 INT8 分数选择触发阈值并验收 |

| test | 权重和阈值冻结后评估泛化能力,不能据此挑权重或调阈值 |

训练梯度采用类别平衡交叉熵,每类权重为 `N / (2 × N_class)`,减轻负样本较多时只预测负类的问题;权重使用 `1e-5` L2 项,梯度逐元素裁剪到 `-10,10`。日志的 `train_loss/valid_loss` 是未加权的平均交叉熵,不包含 L2 项;两种 loss 的用途不同,不应把日志值当成加权目标的完整数值。

默认连续 20 个 epoch 没有改善就提前停止,并导出验证损失最低的轮次,不一定是最后一轮。量化后默认要求 valid 召回率至少 80%、负样本片段误触率至多 1%;通过后才导出可部署模型。前端拒绝的负样本不伪造特征参与梯度训练,但在评估时按 no-wake 计数。因此清单条数可能大于实际进入训练矩阵的行数。

1.6 INT8 部署、文件大小与运行边界

本工程采用 **浮点训练后量化(PTQ)**,没有实现量化感知训练。输入及每层权重采用对称量化,zero-point 为 0;每层权重共用一个 scale,输入和两个隐藏层激活各有一个 scale。输入和权重范围是 `-127,127`,ReLU 后隐藏激活范围是 `0,127`;恰好半值时取整方向为远离零。

| 部分 | 部署数据类型 |

| --- | --- |

| PCM | 有符号 int16 |

| MFCC、CMN、时间插值 | 浮点 |

| 网络输入、权重、隐藏激活 | INT8 |

| bias、点积累加 | INT32 |

| 重量化缩放、末层 logits、Softmax 与门限比较 | 浮点 |

基本量化关系为 `q=clip(round_away(value/scale),-127,127)`;隐藏激活再施加 ReLU。bias 使用本层输入 scale 与权重 scale 的乘积量化。模型加载时会检查数值和累加器范围,拒绝可能造成 INT32 溢出的文件。虽然主要矩阵点积是整数计算,整个语音处理链路仍包含浮点计算。

模型文件固定 **21592 字节**,组成是 `128 字节头 + 21168 字节 INT8 权重 + 74×4 字节 INT32 偏置`。词名、阈值、维度和权重均受 CRC32 保护;文件布局见第 7 节。文件大小不是整个检测功能的 RAM 占用,还需要特征缓存、采集缓冲和线程栈,见第 6 节。

部署直接运行手写 C 推理核心,不依赖 TFLite Micro。设备只做加载和推理,不在板端训练;更换同格式的单词模型按第 3.5、5 节操作。

1.7 核对实现的源码入口

| 问题 | 代码入口 |

| --- | --- |

| 音频格式、MFCC 参数和 CMN | kws_tool.py(tools/asr/kws_tool.py) 的 `read_wav/_frames/mfcc`;kws_mfcc.c(src/asr/kws_mfcc.c) |

| 插值、416 维顺序 | wake_tool.py(tools/wakeword/wake_tool.py) 的 `feature_vector`;wake_nn.c(src/wakeword/wake_nn.c) 的 `wake_nn_predict` |

| 网络层数与训练 | wake_tool.py(tools/wakeword/wake_tool.py) 的维度常量、`float_forward/train_arrays` |

| INT8 校准及 PC 推理 | 同文件的 `quantize_model/predict_features` |

| 类别与阈值验收 | 同文件的 `LABELS/metrics/threshold_analysis/command_train` |

| 固件维度及模型读取 | wake_nn.h(src/wakeword/wake_nn.h)、wake_nn.c(src/wakeword/wake_nn.c) |

| 短语分段、模型路径、HIT 事件 | wake_runtime.c(src/wakeword/wake_runtime.c) |

普通更换唤醒词无需改这些网络常量。若调整 416/48/24/2、前端参数或类别数,就超出了"替换模型"的范围,需要同步修改 PC 导出器、模型格式、C 加载器/推理和对应验证,再重新编译固件。

6 ATS3089P 公开语音数据集 KWS 流程验证

日期:2026-10-22。使用 Google / TensorFlow 的 **mini Speech Commands** 真人英语命令词数据,先验证数据导入、训练、INT8 导出、PC 推理和板端 C 算法兼容性。后续自定义中文唤醒词沿用同一个模型格式和部署接口。

本机已完成下载、导入、训练验收、模型导出、PC 测试和 ARM C 推理对照,模型已生成。现在可以直接按第 6 节安装模型,说英文 **yes** 测试;前面几步用于复现,无需重复下载和训练。实板 MIC 测试尚未执行。

  1. 数据来源和识别目标

压缩包为 182,082,353 字节,MD5 为 `4b8a67bae2973844e84fa7ac988d1a44`。包含 `yes / no / up / down / left / right / stop / go` 八类,每类 1000 条,共 8000 条真人 WAV。音频为 16 kHz、单声道、16-bit PCM,时长不超过 1 秒。

本次下载的 SHA256 为 `49650f2341b26d886b46b3f4fb8fed59e30300b17550f1ee4a768b3106cf93a0`。

本次模型识别 **英文 `yes`**:`yes` 是 `wake`,其余七类是 `other`。对板子说中文"你好小安"不会等价于 `yes`;中文词需要后续重新制作数据和训练。

mini 子集没有完整环境噪声集,因此这里的片段识别成绩只用于验证流程。实际 MIC、连续监听、噪声和远距离效果仍须单独测量。

  1. 本机数据位置

```text

D:\data\public_kws\downloads\mini_speech_commands.zip

D:\data\public_kws\mini_speech_commands_yes\dataset.json

D:\data\public_kws\mini_speech_commands_yes\source_report.json

D:\data\public_kws\mini_speech_commands_yes\arm_check_dataset.json

D:\data\public_kws\mini_speech_commands_yes\model\wake_model.bin

D:\data\public_kws\mini_speech_commands_yes\model\wake_model.json

D:\data\public_kws\mini_speech_commands_yes\pipeline.log

D:\data\public_kws\mini_speech_commands_yes\pipeline_results.json

```

`wake_model.bin` 只有通过训练验收后才生成。数据目录独立于 `D:\data\my_wake` 和 `D:\data\common_kws\nihao_xiaoan`。

  1. 数据导入规则

准备工具:prepare_public_kws.py(tools/wakeword/prepare_public_kws.py)。

  • 根据 `nohash` 前面的原始 speaker ID 分组,同一说话人的全部命令词只进入同一个 split。

  • 固定哈希分组为约 70% train、15% valid、15% test,不按模型分数挑样本。

  • 默认训练负样本最多为训练正样本的三倍;valid/test 保留全部负样本。

  • 正样本按照现有前端的 20~160 有效帧规则筛除无效录音,并记录被排除的原始路径和原因。

  • 根据音频内容哈希去重,记录原始类、speaker、分组、许可和压缩包校验值。

  • `arm_check_dataset.json` 在训练前固定选择 test 中 20 条正样本和 20 条负样本,只用于 PC/C 实现对照;完整 test 仍单独评估。

  • 不覆盖已有输出目录;同一数据准备成功后无需重复导入。

本次固定规则处理后,训练清单共 5104 条、1557 个实际入选说话人,三个集合的说话人无重叠:

| 集合 | yes / wake | 其余词 / other |

| --- | ---: | ---: |

| train | 681 | 2043 |

| valid | 152 | 975 |

| test | 135 | 1118 |

原始 8000 条中去掉 27 条重复音频和 28 条前端不兼容的正样本,另有 2841 条 train 负样本按照事先固定的比例和路径哈希不纳入训练。原始音频全部保留;详细路径、原因、分组和哈希见 `source_report.json`。上述 `eval` 成绩针对这个前端兼容子集;前端拒绝的原始正样本应计入完整系统的漏检,不能将其忽略后宣称原始公开集的整体召回率。

  1. PowerShell / PyCharm Terminal 命令

以下命令统一从 `` 执行,避免 `can't open file 'wake_tool.py'`:

```powershell

Set-Location 'D:\Master\6project\ATS3089C_to_ATS3089P\'

python -m pip install -r application/bt_watch/tools/wakeword/requirements.txt

```

本机已经下载完成,直接使用已有 ZIP。若在另一台机器从头准备,可先下载并检查 MD5:

```powershell

New-Item -ItemType Directory -Path 'D:\data\public_kws\downloads' -Force | Out-Null

curl.exe --fail --location --retry 2 --output 'D:\data\public_kws\downloads\mini_speech_commands.zip' 'https://storage.googleapis.com/download.tensorflow.org/data/mini_speech_commands.zip'

Get-FileHash 'D:\data\public_kws\downloads\mini_speech_commands.zip' -Algorithm MD5

```

已有本地压缩包时,首次准备数据使用:

```powershell

python application/bt_watch/tools/wakeword/prepare_public_kws.py --archive "D:\data\public_kws\downloads\mini_speech_commands.zip" --out "D:\data\public_kws\mini_speech_commands_yes" --word yes

```

检查数据:

```powershell

python application/bt_watch/tools/wakeword/wake_tool.py validate --manifest "D:\data\public_kws\mini_speech_commands_yes\dataset.json"

```

训练并导出:

```powershell

python -u application/bt_watch/tools/wakeword/wake_tool.py train --manifest "D:\data\public_kws\mini_speech_commands_yes\dataset.json" --out "D:\data\public_kws\mini_speech_commands_yes\model" --epochs 100

```

**启动后为什么可能几分钟没有 epoch 日志?** 训练前先校验全部 5104 条 WAV,然后为 train 的 2724 条和 valid 的 1127 条录音提取 MFCC,共 3851 条。现有前端由 Python 计算,首次提取可能需要数分钟;不同电脑用时不同。梯度训练结束后还要为 1253 条 test 录音提取特征并评估,最后才导出模型。

2026-10-22 已补充日志:启动时显示数据检查,MFCC 提取时显示 `0/2724`、`100/2724` 等数量与耗时(每 100 条或约 5 秒更新一次,在当前文件处理完成后输出),训练时每个 epoch 显示 loss,随后提示 INT8 量化、验证、测试和模型导出阶段。进度日志立即刷新到 stderr,终端会直接显示;如需保存完整日志,命令末尾加 `2>&1 | Tee-Object -FilePath "D:\data\public_kws\mini_speech_commands_yes\manual_training.log"`。

`-u` 用于避免 Python 标准输出缓冲,但旧版脚本没有的进度不会因此自动产生。已运行的旧进程不会加载新日志代码;下次启动使用更新后的脚本即可。不要同时启动多个训练进程写入同一个模型目录。

每条命令单独执行并检查结果。若显示 `valid 不合格` 或生成 `training_failure.json`,先处理训练问题,再继续下面的模型检查。工具仍使用默认的 valid 召回至少 80%、片段误触率至多 1%,不通过降低验收标准生成模型。

成功生成模型后检查元数据并评估完整 test:

```powershell

python application/bt_watch/tools/wakeword/wake_tool.py inspect --model "D:\data\public_kws\mini_speech_commands_yes\model\wake_model.bin"

python application/bt_watch/tools/wakeword/wake_tool.py eval --model "D:\data\public_kws\mini_speech_commands_yes\model\wake_model.bin" --manifest "D:\data\public_kws\mini_speech_commands_yes\dataset.json" --split test

```

单条 WAV 推理示例(固定对照清单中的第一条正样本):

```powershell

python application/bt_watch/tools/wakeword/wake_tool.py predict --model "D:\data\public_kws\mini_speech_commands_yes\model\wake_model.bin" --wav "D:\data\public_kws\mini_speech_commands_yes\source\mini_speech_commands\yes\9229bff9_nohash_0.wav"

```

本机输出 `probability=0.98035848`、`threshold=0.90920675`、`wake=true`。这验证文件推理;实板还需验证 MIC 采集和 VAD 分段。

  1. ARM C 推理兼容性验证

现有测试编译生产代码 `wake_nn.c` 和 `kws_mfcc.c`,在 ARM 仿真器中运行实际 PCM,与 PC 的 MFCC、INT8 概率和最终判决对照:

```powershell

python application/bt_watch/tests/wakeword/test_wake_core.py --model "D:\data\public_kws\mini_speech_commands_yes\model\wake_model.bin" --manifest "D:\data\public_kws\mini_speech_commands_yes\arm_check_dataset.json" --split test

```

本地 SDK 的 ARM GCC 由脚本自动发现;若缺少测试依赖,安装 `unicorn` 和 `pyelftools`。默认报告位于 `application/bt_watch/outdir/wake_core_tests/real_audio_test.json`,重复执行会更新该报告。

这是冻结模型和阈值后的实现兼容性验证,不使用这些 test 录音调整参数;不代表已经完成实板 MIC 和真人测试。

  1. 安装模型并在板子上验证

固件统一使用 `application/bt_watch/outdir/ats3089p_dev_watch/_firmware` 的原日期命名产物。公开数据训练只生成外部模型,不需要为 `yes` 新建固件文件夹。

设备需要支持 `app wake` 和 `WAKEINT8` 模型格式。通过普通 UART 执行:

```text

app asr off

app wake off

app udisk on

```

将 `D:\data\public_kws\mini_speech_commands_yes\model\wake_model.bin` 复制到设备 U 盘根目录,覆盖设备中此前安装的模型。该操作会更换设备当前的唤醒词,原中文模型可在 PC 保留。Windows 安全弹出 U 盘后执行:

```text

app udisk off

app wake load

app wake status

app wake on

```

保持安静,等待 `wake READY`,然后正常发音说英文 `yes`,每次间隔约 1 秒。成功时观察 `wake HIT`;拒绝时结合分数、阈值、帧数和底噪排查。不要把 `wake_model.bin` 传给 USB CDC IAP 的 `--firmware` 参数。

  1. 切换回自定义中文唤醒词

公开模型验证完成后,另用自己的中文数据清单重新训练。固定中文短语、真实正负样本和独立采集会话,不能只修改公开模型的 `phrase` 文本。完整步骤见 自定义唤醒词 README(WAKEWORD_DEEP_LEARNING_README.md) 和 中文数据集采集说明(WAKEWORD_COMMON_DATASET_20261022.md)。

  1. 本次实测结果与问题记录

2026-10-22 使用现有 `wake_tool.py` 的默认训练参数:seed 42、batch 32、学习率 0.001、最多 100 epoch、patience 20。实际运行 28 epoch,保留第 8 epoch 的最优验证集 checkpoint;INT8 校准只用 train,模型和阈值只用 valid 选择,未使用 test 调参。仍要求 valid 召回率 ≥80%、负样本片段误触率 ≤1%。

| INT8 评估范围 | TP / FN | FP / TN | 召回率 | 负样本片段误触率 |

| --- | ---: | ---: | ---: | ---: |

| valid 清单(152 正、975 负) | 135 / 17 | 9 / 966 | 88.82% | 0.923% |

| test 清单(135 正、1118 负) | 121 / 14 | 6 / 1112 | 89.63% | 0.537% |

| 去重后全 test,含前端拒绝正样本(143 正、1118 负) | 121 / 22 | 6 / 1112 | **84.62%** | **0.537%** |

全 test 的 22 条漏检包括模型漏检 14 条和前端拒绝 8 条。75 条被前端拒绝的 test 负样本已经计入 TN;原始 test 中的 5 条重复录音(1 正、4 负)仍排除。上述比例是当前语音片段上的实测值,不能换算为连续监听每小时误唤醒次数。

模型信息:

```text

phrase: yes

format: ats-wake-int8-v1 / WAKEINT8

network: 416 -> 48 -> 24 -> 2

bytes: 21592

threshold: 0.909206748008728

CRC32: 0x7913A0ED

SHA256: 518201bbfe5e36647b7e4e779b33be60eb47968db56863e0b63dcc4f90bd5def

```

ARM C 对照通过 44 组 INT8 黄金向量、5 组合成 PCM、模型格式及阈值边界检查,并对训练前固定选择的 40 条真人 test 录音完成推理。PC/C 的帧数和最终判决全部一致,均为 TP=18、FN=2、FP=0、TN=20。相同 C 特征输入下,PC/C 神经网络概率误差小于 `2e-6`;各自从 PCM 提取特征时存在浮点差异,40 条中的最大 MFCC 绝对误差为 `0.1493111`、最大概率绝对误差为 `0.0306023`,本次未造成判决变化。该对照覆盖 40 条,不能宣称全部 1253 条 test 的 ARM 结果完全相同。

训练及汇总记录为数据目录中的 `pipeline.log`、`pipeline_results.json` 和 `model/wake_model.json`;ARM 逐条结果为 `application/bt_watch/outdir/wake_core_tests/real_audio_test.json`。本次批量运行调用原工具 handler,仅在内存复用相同 WAV 的确定性特征,以减少重复 MFCC 计算;未修改正式前端算法和验收门槛。

本轮解决了个人录音较少、验证集泛化不够而无法导出合格模型的问题:公开集提供多说话人、正负样本及隔离评估,默认训练已通过,无需降低门槛。它证明当前数据到模型及 C 推理流程可以运行;原中文录音效果仍需后续独立改进。实板尚未加载此模型,也尚未验证真人 MIC、连续噪声、距离和功耗;下一步按第 6 节完成板端测试。

相关推荐
枫叶丹437 分钟前
表格数据也能用基础模型:TabPFN 与传统机器学习的比较方法
人工智能·机器学习·chatgpt·开源·agent·codex
海宇数据37 分钟前
零信任架构实战:基于海宇普通维保查询构建自动化二手车认证展厅车况质检档案网关
运维·人工智能·架构·自动化
众壹新能源科技38 分钟前
储能两充两放日收益增40%,但电池寿命缩短一半,怎么平衡
运维·人工智能·自动化
Raas10040 分钟前
AI网关厂商排名?MAI Gateway(魔芋企业级AI网关)vs 开源方案全面对比
人工智能·开源·gateway·ai网关·mai gateway·企业级ai网关·企业级产品
可爱系程序猿43 分钟前
OpenCV 项目启动时报 opencv_world480.dll:先核对构建与架构
人工智能·opencv·程序人生·架构·电脑
i5867244 分钟前
40天极限交付,厂房整装与办公装修如何兼顾防静电和承重
人工智能·geo
databook1 小时前
让 LLM 输出不再失控:用 Pydantic 校验大模型输出
人工智能·python·llm
程序员柒叔1 小时前
先AI化,再升级人生系统:解读孙宇晨与邵艾伦4.5小时长谈
人工智能
程序猿编码1 小时前
不用 PyTorch!从零手写 C++ 深度学习框架,自动微分、CUDA、分布式一把搞定
c++·深度学习·大模型推理·自动微分