从零训练一个 <20 kB 的微型语音唤醒词模型:tflite-micro Micro Speech 实战指南

发布时间:2026/10/4 13:41:30
从零训练一个 <20 kB 的微型语音唤醒词模型:tflite-micro Micro Speech 实战指南 人工智能深度学习推理引擎本地部署嵌入式物联网【免费下载链接】tflite-microInfrastructure to enable deployment of ML models to low-power resource-constrained embedded targets (including microcontrollers and digital signal processors).项目地址https://gitcode.com/gh_mirrors/tf/tflite-micro点击查看免费下载本篇技术指南以 TensorFlow Lite MicroTFLM仓库中的 Micro Speech 训练文档为核心完整讲解如何在 Google Colaboratory 或本地 Jupyter Notebook 中用 Speech Commands 语音数据集训练一个体积小于 20 kB、可识别 yes 与 no 两个唤醒词的量化模型并逐步导出为冻结图model.pb、全整型量化 TFLite 模型model.tflite和可直接烧录到微控制器的 C 源码model.cc。读完本文你将掌握关键词模型的数据准备、参数配置、训练管线、频谱预处理原理以及部署到 TFLM 的全流程。训练目标与任务概述本示例训练的是一个多分类语音识别模型模型体积严格小于20 kB能够从语音数据中识别 2 个关键词yes和no。分类结果共四类输入属于 yes 或 no 时分别输出对应类别输入不属于上述任一类别时归类为unknown输入为静音时归类为silence。这套分类体系与仓库中 micro_model_settings.h 定义的输出类别完全一致constexpr int kCategoryCount 4; constexpr const char* kCategoryLabels[kCategoryCount] { silence, unknown, yes, no, };你可以从下面这份 10 词表中任选 2 个或更多词组合重新训练模型yes no up down left right on off stop go训练所用的脚本源自 TensorFlow 官方 Simple Audio Recognition 是这一管线的完整、可复现的封装。技术栈要点见 train/README.md 的 Overview 小节项目取值数据集Speech Commands, Version 2105,000 段 WAV 音频数据集类型语音Speech深度学习框架TensorFlow训练脚本基于 TensorFlow 1.5 时代的 speech_commands 管线语言Python 3.7模型大小20 kB模型类别多分类Multiclass Classification训练环境与两种运行方式训练模型有两种方式云端 Google Colaboratory或本地 Jupyter Notebook二者共用同一个 Notebook 文件 train_micro_speech_model.ipynb。预估训练时长约 2 小时。Notebook 元数据中标注了accelerator: GPU并且教程明确建议训练前在 Colab 菜单Runtime → Change runtime type中将Hardware accelerator设置为GPU因为 15,000 次迭代在 GPU 上需要 1.52 小时CPU 上会更慢。运行前需要克隆包含训练脚本的 TensorFlow 仓库git clone -q --depth 1 https://github.com/tensorflow/tensorflow随后加载 TensorBoard 用于实时观察训练过程中的准确率与损失%load_ext tensorboard %tensorboard --logdir {LOGS_DIR}数据集Speech Commands Version 2训练数据来自Speech Commands DatasetVersion 2由 Google 收集并以 CC BY 许可证发布。该数据集包含超过 105,000 段人们说出 30 个不同单词的 WAVE 音频文件压缩包超过 2GB因此首次下载会比较耗时但下载完成后无需重复下载。官方还鼓励使用者贡献 5 分钟的自己的语音来帮助改进数据集。Notebook 中数据集相关的关键常量DATA_URL https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.02.tar.gz VALIDATION_PERCENTAGE 10 TESTING_PERCENTAGE 10即 10% 数据留作验证、10% 留作测试其余用于训练。数据通过input_data.AudioProcessor完成下载与切分audio_processor input_data.AudioProcessor( DATA_URL, DATASET_DIR, SILENT_PERCENTAGE, UNKNOWN_PERCENTAGE, WANTED_WORDS.split(,), VALIDATION_PERCENTAGE, TESTING_PERCENTAGE, model_settings, LOGS_DIR)静音与未知样本的比例平衡Notebook 会自动计算 silence 与 unknown 两类样本的占比以保证每个标签的训练样本数大致相等number_of_labels WANTED_WORDS.count(,) 1 number_of_total_labels number_of_labels 2 # for silence and unknown label equal_percentage_of_training_samples int(100.0/(number_of_total_labels)) SILENT_PERCENTAGE equal_percentage_of_training_samples UNKNOWN_PERCENTAGE equal_percentage_of_training_samples例如训练 yes,no 时共有 2 个目标词加上 silence 与 unknown 共 4 类每类约占 25%静音与未知样本各取 25%。这也是 micro_model_settings.h 中kCategoryCount 4的由来——改变WANTED_WORDS组合后类别数会随之变化需要同步更新该头文件。训练配置参数详解Notebook 的 Configure Defaults 部分定义了一组可在训练前修改的核心参数这是复现与定制模型的关键# A comma-delimited list of the words you want to train for. # The options are: yes,no,up,down,left,right,on,off,stop,go # All the other words will be used to train an unknown label and silent # audio data with no spoken words will be used to train a silence label. WANTED_WORDS yes,no # The number of steps and learning rates can be specified as comma-separated # lists to define the rate at each stage. For example, # TRAINING_STEPS12000,3000 and LEARNING_RATE0.001,0.0001 # will run 12,000 training loops in total, with a rate of 0.001 for the first # 8,000, and 0.0001 for the final 3,000. TRAINING_STEPS 12000,3000 LEARNING_RATE 0.001,0.0001 # Calculate the total number of steps, which is used to identify the checkpoint # file name. TOTAL_STEPS str(sum(map(lambda string: int(string), TRAINING_STEPS.split(,))))参数含义与取值说明参数含义默认值/示例WANTED_WORDS逗号分隔的目标关键词列表yes,noTRAINING_STEPS逗号分隔的分阶段训练步数12000,3000总计 15000 步LEARNING_RATE与训练阶段一一对应的学习率0.001,0.0001前 12000 步用 0.001后 3000 步用 0.0001PREPROCESS预处理方式必须为micro与推理端一致microWINDOW_STRIDE频谱窗口滑动步长ms训练与推理共享20MODEL_ARCHITECTURE模型架构tiny_conv可选single_fc、conv、low_latency_conv、low_latency_svdf、tiny_embedding_convSILENT_PERCENTAGE/UNKNOWN_PERCENTAGE静音/未知样本占比自动计算约 25%EVAL_STEP_INTERVAL每多少步执行一次评估1000SAVE_STEP_INTERVAL每多少步保存一次 checkpoint1000Notebook 特别强调PREPROCESS micro与WINDOW_STRIDE 20属于训练与推理共享的常量不要修改否则训练产出的模型与 TFLM 推理端的输入约定将不一致。这一约束与 micro_model_settings.h 中注释一致kFeatureStrideMs 20、kFeatureDurationMs 30、kAudioSampleFrequency 16000这些值全部派生自训练时的预处理配置若改变预处理方式必须同步更新。训练、冻结与导出全流程第一步执行训练python tensorflow/tensorflow/examples/speech_commands/train.py \ --data_dir{DATASET_DIR} \ --wanted_words{WANTED_WORDS} \ --silence_percentage{SILENT_PERCENTAGE} \ --unknown_percentage{UNKNOWN_PERCENTAGE} \ --preprocess{PREPROCESS} \ --window_stride{WINDOW_STRIDE} \ --model_architecture{MODEL_ARCHITECTURE} \ --how_many_training_steps{TRAINING_STEPS} \ --learning_rate{LEARNING_RATE} \ --train_dir{TRAIN_DIR} \ --summaries_dir{LOGS_DIR} \ --verbosity{VERBOSITY} \ --eval_step_interval{EVAL_STEP_INTERVAL} \ --save_step_interval{SAVE_STEP_INTERVAL}其中--preprocessmicro意味着训练时直接使用与 TFLM 端一致的微前端频谱预处理40 通道、49 帧特征而不是通用的 MFCC 特征。如果不想花费一两个小时从零训练也可以下载官方预训练 checkpoint取消 Notebook 中以下两行注释后运行curl -O https://storage.googleapis.com/download.tensorflow.org/models/tflite/speech_micro_train_2020_05_10.tgz tar xzf speech_micro_train_2020_05_10.tgz第二步冻结为推理用 TensorFlow 模型训练完成后将图结构与权重合并为单个文件称为冻结模型/冻结图冻结后无法再继续训练python tensorflow/tensorflow/examples/speech_commands/freeze.py \ --wanted_words$WANTED_WORDS \ --window_stride_ms$WINDOW_STRIDE \ --preprocess$PREPROCESS \ --model_architecture$MODEL_ARCHITECTURE \ --start_checkpoint$TRAIN_DIR$MODEL_ARCHITECTURE.ckpt-{TOTAL_STEPS} \ --save_formatsaved_model \ --output_file{SAVED_MODEL}checkpoint 文件名中的步数TOTAL_STEPS由前面TRAINING_STEPS各阶段求和得到本例为 15000因此修改训练步数后该文件会自动对应正确名称。第三步转换为全整型量化的 TFLite 模型将 SavedModel 转换为 TensorFlow Lite 模型并对嵌入式设备做全整型量化fully quantized严格 int8包括输入与输出。Notebook 会打印模型体积确认小于 20 kBwith tf.compat.v1.Session() as sess: # 先导出 float32 参考模型 float_converter tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL) float_tflite_model float_converter.convert() # 再导出全整型量化模型 converter tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL) converter.optimizations [tf.lite.Optimize.DEFAULT] converter.inference_input_type tf.int8 converter.inference_output_type tf.int8 def representative_dataset_gen(): for i in range(100): data, _ audio_processor.get_data(1, i*1, model_settings, BACKGROUND_FREQUENCY, BACKGROUND_VOLUME_RANGE, TIME_SHIFT_MS, testing, sess) flattened_data np.array(data.flatten(), dtypenp.float32).reshape(1, 1960) yield [flattened_data] converter.representative_dataset representative_dataset_gen tflite_model converter.convert()这里的要点inference_input_type tf.int8与inference_output_type tf.int8保证输入/输出也是 int8而非仅权重量化——这正是 train/README.md 中Fully quantized implies that the model isstrictly int8quantizedincludingthe input(s) and output(s)的含义representative_dataset_gen提供 100 个来自测试集的代表性样本用于标定量化范围输入被展平为(1, 1960)对应 49 帧 × 40 通道的频谱特征量化输入范围限定为QUANT_INPUT_MIN 0.0到QUANT_INPUT_MAX 26.0这一取值范围与 audio_preprocessor.py 中注释描述的 legacy 特征缩放逻辑0.026.0 的 float 值域再映射到 -128127 的 int8一一对应。第四步验证量化模型的准确率用 TFLite Python API 在测试集上分别评估 float 与量化模型确保量化没有带来不可接受的精度损失def run_tflite_inference(tflite_model_path, model_typeFloat): np.random.seed(0) # set random seed for reproducible test results. with tf.compat.v1.Session() as sess: test_data, test_labels audio_processor.get_data( -1, 0, model_settings, BACKGROUND_FREQUENCY, BACKGROUND_VOLUME_RANGE, TIME_SHIFT_MS, testing, sess) test_data np.expand_dims(test_data, axis1).astype(np.float32) interpreter tf.lite.Interpreter(tflite_model_path, experimental_op_resolver_typetf.lite.experimental.OpResolverType.BUILTIN_REF) interpreter.allocate_tensors() input_details interpreter.get_input_details()[0] output_details interpreter.get_output_details()[0] if model_type Quantized: input_scale, input_zero_point input_details[quantization] test_data test_data / input_scale input_zero_point test_data test_data.astype(input_details[dtype]) correct_predictions 0 for i in range(len(test_data)): interpreter.set_tensor(input_details[index], test_data[i]) interpreter.invoke() output interpreter.get_tensor(output_details[index])[0] top_prediction output.argmax() correct_predictions (top_prediction test_labels[i]) print(%s model accuracy is %f%% (Number of test samples%d) % ( model_type, (correct_predictions * 100) / len(test_data), len(test_data)))第五步生成 C 源码模型最后把量化后的.tflite文件转换为 C 数组供 TensorFlow Lite for Microcontrollers 直接加载apt-get update apt-get -qq install xxd xxd -i {MODEL_TFLITE} {MODEL_TFLITE_MICRO} # 将变量名统一替换为 g_model sed -i s/{MODEL_TFLITE 路径转义}/g_model/g {MODEL_TFLITE_MICRO}生成后可用cat {MODEL_TFLITE_MICRO}查看并复制 C 源码内容。模型架构tiny_conv这是一个非常简单的模型由Conv2D卷积层→ Fully Connected / MatMul全连接层输出 logits→ Softmax输出概率组成即 TensorFlow speech_commands 示例中的tiny_conv架构。该图由 Netron 可视化models/micro_speech_quantized.tflite得到。该模型刻意不追求高精度其设计定位是流水线的第一级运行在可以常开的低功耗硬件上一旦发现疑似语音片段就唤醒更高功耗的芯片做更精细的分析。此外由于模型输入是已预处理好的频谱特征因此可以用更简单的网络结构完成推理。输入规模在 micro_model_settings.h 中定义为constexpr int kAudioSampleFrequency 16000; constexpr int kFeatureSize 40; constexpr int kFeatureCount 49; constexpr int kFeatureElementCount (kFeatureSize * kFeatureCount); constexpr int kFeatureStrideMs 20; constexpr int kFeatureDurationMs 30;即输入为49 帧频谱特征、每帧 40 个通道40×49 1960 个元素与量化时展平的(1, 1960)完全对应。输出为 4 个类别的概率silence、unknown、yes、no。预处理频谱图Spectrogram的生成原理模型不直接接收原始音频采样值而是接收频谱图spectrogram——一个二维数组每一行是某个时间窗口内计算出的频率信息切片。训练文档 Preprocessing Speech Input 给出了精确的生成配方每个频率切片由对30 ms音频窗口执行FFT得到输入样本按 -1 到 1 的实数值处理在 16 位有符号整数采样中编码为 -32,768 到 32,767窗口步长stride为 20 ms因此相邻窗口重叠 10 msFFT 产生257 个频点每约 6 个频点平均为一组得到每片40 个频率桶frequency buckets结果继续经过降尺度、噪声抑制、自动增益控制以及最终的降尺度处理每个相邻频率条目按内存升序存储bucket 0 存于 data[0]bucket 1 存于 data[1]依此类推窗口前移 20 ms 后重复该过程新频率切片存于下一内存行训练配置使用1000 ms的原始音频。以 30 ms 窗口、20 ms 步长计算1000 ms 音频可产生约49 个频率切片最终预处理输出是一张40 像素宽、49 行高的单通道图像。这一 30 ms/20 ms/40 桶/49 帧的参数组合在 TFLM 推理侧同样被完整保留micro_model_settings.h 中的kFeatureDurationMs 30、kFeatureStrideMs 20、kFeatureSize 40、kFeatureCount 49即为推理常量与训练侧严格一致。当前仓库中的可复现预处理实现值得说明的是当前仓库在 audio_preprocessor.py 中提供了这一 legacy 预处理的完整、可复现实现基于tflite_micro.signal信号库其默认参数与训练时的预处理完全一致定义在FeatureParams数据类中audio_preprocessor.py参数默认值含义sample_rate16000音频采样率Hzwindow_size_ms30输入窗口长度mswindow_stride_ms20窗口步长msfilter_bank_number_of_channels40滤波器组通道数即频率桶数filter_bank_lower_band_limit_hz125.0滤波器组下限频率Hzfilter_bank_upper_band_limit_hz7500.0滤波器组上限频率Hzfilter_bank_scaling_bits/filter_bank_alignment/filter_bank_channel_block_size12 / 4 / 4滤波器组量化缩放与对齐常量filter_bank_spectral_subtraction_bits14噪声抑制位宽filter_bank_even_smoothing/filter_bank_odd_smoothing0.025 / 0.06噪声估计平滑系数pcan_strength/pcan_offset/pcan_gain_bits0.95 / 80.0 / 21PCAN 自动增益控制参数legacy_output_scaling25.6继承自训练的最终输出缩放从源码 audio_preprocessor.py 的实现看_GenerateFeature.generate_feature_for_frame依次执行Hann 窗平滑window_op.window→ FFT 自动缩放fft_ops.fft_auto_scale→ 实 FFTfft_ops.rfft→ 能量计算energy_op.energy→ 40 通道滤波器组压缩filter_bank_ops.filter_bank→ 平方根降尺度filter_bank_square_root→ 噪声抑制filter_bank_spectral_subtraction→ PCAN 增益控制pcan_op.pcan→ 对数降尺度filter_bank_log→ 最终缩放并转为 int8或 float32。这与文档描述的降尺度、噪声抑制、自动增益控制、最终降尺度处理链一一对应可作为验证训练预处理细节的权威参考。训练产物三种模型文件的对比按照训练与导出流程models目录下会生成以下 3 个模型文件也可直接下载官方打包的 speech_commands.zip文件名格式目标框架目标设备model.pb冻结图Frozen GraphDefTensorFlow大规模/云端/服务器model.tflite20 kB全整型量化 TFLite 模型TensorFlow Lite移动设备model.ccC 源码文件TensorFlow Lite for Microcontrollers微控制器其中全整型量化的含义需要再次强调模型是严格 int8量化包括输入与输出在内inference_input_type tf.int8、inference_output_type tf.int8。这是模型能够被微控制器高效执行、且体积压缩到 20 kB 以内的关键。部署到微控制器训练完成并生成model.cc后可参照 micro_speech 示例主文档 部署到目标微控制器。根据是否修改过 Notebook有两种情况参考模型未修改 Notebook直接按原流程部署即可仓库 models 目录 已提供训练好的micro_speech_quantized.tflite等模型文件新模型若重新训练了识别不同关键词的模型需要更新 micro_model_settings.h 中的kCategoryCount与kCategoryLabels例如改为你训练的新词表将model.cc中的 C 数组内容替换到示例的模型源文件中。部署后的端到端验证可运行仓库自带的 C 测试与 Python 评估脚本。例如用 Bazel 运行原生测试bazel run tensorflow/lite/micro/examples/micro_speech:micro_speech_test或使用 evaluate.py 对单个音频样本逐帧输出四类概率并给出最终判定bazel build tensorflow/lite/micro/examples/micro_speech:evaluate bazel-bin/tensorflow/lite/micro/examples/micro_speech/evaluate --sample_pathtensorflow/lite/micro/examples/micro_speech/testdata/no_1000ms.wav输出示例每个 Frame 对应一个 20 ms 步进的频谱切片四列概率依次为 silence / unknown / yes / noFrame #0: [0.0000, 0.0273, 0.0312, 0.9414] ... Frame #48: [0.0000, 0.0547, 0.0000, 0.9453] Model predicts the audio sample as no with probability 0.95其他训练方式Google Cloud 虚拟机除了 Colab / 本地 Notebook还可以使用 Google Cloud 训练注意Google Cloud 并非免费需按虚拟机运行时长和所用资源付费使用预配置的 Deep Learning VM 镜像创建虚拟机export IMAGE_FAMILYtf-latest-cpu export ZONEus-west1-b # Or any other required region export INSTANCE_NAMEmodel-trainer export INSTANCE_TYPEn1-standard-8 # or any other instance type gcloud compute instances create $INSTANCE_NAME \ --zone$ZONE \ --image-family$IMAGE_FAMILY \ --image-projectdeeplearning-platform-release \ --machine-type$INSTANCE_TYPE \ --boot-disk-size120GB \ --min-cpu-platformIntel\ Skylake实例创建后通过 SSH 登录gcloud compute ssh jupyter${INSTANCE_NAME}在 Jupyter Notebook 中按照 train_micro_speech_model.ipynb 的步骤训练模型。训练结束后务必删除实例以停止计费gcloud compute instances delete ${INSTANCE_NAME} --zone${ZONE}结语从训练到常开唤醒的一站式链路通过本文的完整流程你可以从公开语音数据集出发历经数据准备、分阶段训练、冻结、全整型量化、准确率验证与 C 源码导出最终得到一个小于 20 kB 的唤醒词模型并将其作为低功耗硬件上常开第一级的检测器。训练侧 30 ms 窗口 / 20 ms 步长 / 40 通道 / 49 帧的预处理约定在仓库的 micro_model_settings.h 与 audio_preprocessor.py 中均被完整保留并可直接复现这也正是模型从云端训练无缝迁移到微控制器推理的关键所在。赞分享人工智能深度学习推理引擎本地部署嵌入式物联网【免费下载链接】tflite-microInfrastructure to enable deployment of ML models to low-power resource-constrained embedded targets (including microcontrollers and digital signal processors).项目地址https://gitcode.com/gh_mirrors/tf/tflite-micro点击查看免费下载相关推荐tflite-micro 微型 LSTM 关键词识别用 Mini Speech Commands 训练 125kB 语音模型的完整指南tflite micro 微型 LSTM 关键词识别用 Mini Speech Commands 训练 125kB 语音模型的完整指南 本篇技术指南围绕 t人工智能深度学习推理引擎本地部署嵌入式物联网TFLite Micro 唤醒词识别示例micro_speech完全指南音频预处理、模型推理与端侧部署TFLite Micro 唤醒词识别示例micro_speech完全指南音频预处理、模型推理与端侧部署 本指南基于 tflite micro 仓库中的 M人工智能深度学习推理引擎本地部署嵌入式物联网从零构建专属唤醒词模型RealtimeSTT全流程训练指南从零构建专属唤醒词模型RealtimeSTT全流程训练指南 引言唤醒词技术的痛点与解决方案 你是否还在为通用唤醒词误触发而烦恼是否希望你的语音助手只响应特人工智能语音AI 应用上一篇MaxBot抢票机器人六大票务平台自动化解决方案下一篇SSCom跨平台串口调试工具从零开始快速上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考