示例工程【免费下载链接】examplesTensorFlow examples项目地址https://gitcode.com/gh_mirrors/exam/examples点击查看免费下载本指南以 TensorFlow examples 仓库中 lite/examples/speech_commands/ml/README.md 为骨架完整讲解如何下载 TensorFlow Speech Commands 数据集、进行音频预处理、训练一个面向时序波形数据的 1D 时间堆叠time-stackedVGG 风格卷积网络并把训练好的 Keras 模型导出为 TensorFlow Lite 格式。读完本文你将能够从零复现一套可在移动端/嵌入式端运行的 10 词语音命令识别模型训练管线并理解每一条训练参数背后对应的源码实现。1. 项目与文档定位本仓库的lite/examples/speech_commands目录同时包含 ML 训练端与移动端示例ml/子目录存放数据下载、模型定义、训练与导出脚本而ios/SpeechCommands等移动端工程则消费训练产出的.tflite模型与标签文件。本文聚焦于 ml/ 目录 下的完整训练管线其核心文件包括download.py下载并解压语音命令数据集generator.py音频样本加载、数据集划分、数据增强与特征提取model.py1D 时间堆叠卷积模型定义与模型超参计算train.py训练入口与命令行参数解析callbacks.py验证集混淆矩阵回调classes.py目标词表定义utils.py批数据生成器与向量滚动工具export/Keras 模型到 TensorFlow Lite 的转换脚本。2. 环境依赖Prerequisites原文档列出的运行前提如下Python 3.5Keras 2.1.6 或更高版本pandas 与 pandas-mlTensorFlow 1.5 或更高版本仓库内的 requirements.txt 给出了本示例实际锁定的依赖版本可作为更精确的复现参考Keras2.2.0 pandas0.22.0 pandas-ml0.5.0 tensorflow1.14.0 tensorflow-gpu1.14.0 wget3.2需要注意train.py、generator.py与导出脚本均以tensorflow.compat.v1的方式导入 TF 1.x API并依赖tf.Session、tf.placeholder等 Eager 模式之前的图执行接口因此本文所讲命令面向 TensorFlow 1.x 环境1.14 及以上这是本项目代码的适用前提。3. 数据集TensorFlow Speech Commands Dataset3.1 数据集概况TensorFlow Speech Commands 数据集包含由成千上万不同说话人录制的65,000 条时长 1 秒的短语音覆盖30 个英文单词如stop、down、off、right、up、go、on、yes、left、no、数字 0–9 等。数据集的完整词表在 classes.py 的get_classes(wanted_onlyFalse)分支中列出sheila nine stop bed four six down bird marvin cat off right seven eight up three happy go zero on wow dog yes five one tree house two left no3.2 本示例选用的 10 个类别在 TensorFlow Lite 语音命令应用示例中只从完整词表中挑选10 个词作为目标类别stop down off right up go on yes left no这一子集定义于 classes.py 的get_classes(wanted_onlyTrue)分支并带有assert len(classes) 10的断言校验。除 10 个目标词外实际分类标签还包含两个特殊标记详见 generator.py_silence_索引 0静音类别用于让模型学会不说话时不误报_unknown_索引 1将 30 个词中未选中的其余 20 个词统一归入未知词提升模型对词表外语音的鲁棒性。因此 model.py 中num_classes的默认值取 11即 10 个目标词 _unknown_静音样本在训练中被注入_silence_标签同样计入该 11 类中的一席prepare_words_list返回的完整标签序列为[_silence_, _unknown_] 10 个目标词共 12 个标签位其中_silence_与_unknown_各自单独占位。3.3 下载数据运行下载脚本即可将数据集载入本地文件系统python download.pydownload.py 的实现要点从http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz下载数据集压缩包v0.01 版本删除已存在的data目录并新建data/train将压缩包解压至data/train解压完成后删除压缩包归档文件。解压后data/train下每个子目录即一个词的类别目录其中包含特殊的_background_noise_目录存放用于混入训练样本的长背景噪声音频以及若干形如word/xxxx_nohash_0.wav的单条语音文件。下载脚本最终生成的data/train目录即为train.py中-data_dirs参数所指的目录。4. 音频处理与特征表示4.1 基本采样配置数据生成环节产生包含指定样本数、处于固定采样率的原始 PCM 波形数据本示例采用的配置如下样本数Samples采样率Sample Rate片段时长Clip Duration16000160001000 ms也就是说每条训练样本是 16000 Hz、1 秒长的单声道波形共 16000 个采样点。这一关系在 model.py 的prepare_model_settings中由公式desired_samples int(sample_rate * clip_duration_ms / 1000)计算得出train.py以clip_duration_ms1000传入因此在默认sample_rate16000下得到desired_samples16000。4.2 四种特征表示output_representationtrain.py的-output_representation参数支持四种输入表示由 generator.py 中的断言assert output_representation in {raw, spec, mfcc, mfcc_and_raw}限定取值含义特征维度fingerprint_sizeraw原始 PCM 波形样本desired_samples默认 16000spec短时傅里叶变换STFT幅值谱图spectrogram_frequencies * spectrogram_lengthmfcc梅尔倒谱系数num_log_mel_features * spectrogram_lengthmfcc_and_rawMFCC 与原始波形双输入MFCC 部分多输入训练对应维度的计算逻辑在 model.py 的prepare_model_settings中实现。该函数还基于window_size_ms30.0、window_stride_ms10.0、dct_coefficient_count80、num_log_mel_features60等参数计算出window_size_samples int(sample_rate * window_size_ms / 1000)默认 480window_stride_samples int(sample_rate * window_stride_ms / 1000)默认 160spectrogram_length 1 int((desired_samples - window_size_samples) / window_stride_samples)spectrogram_frequencies 257在mfcc路径下generator.py 的prepare_processing_graph使用tf.signal.stft计算谱图再通过tf.signal.linear_to_mel_weight_matrix将频率映射到 80–7600 Hz 的梅尔刻度取对数后由tf.signal.mfccs_from_log_mel_spectrograms得到 MFCC并截取前num_log_mel_features默认 60维。4.3 数据增强与预处理图generator.py 中的AudioProcessor会构建一张 TensorFlow 预处理图对每个样本实时施加多种失真仅训练模式启用验证/测试模式关闭核心手段包括音量缩放foreground_volume在训练时随机扰动前景音量见get_data中foreground_frequency、foreground_volume_range逻辑时间平移通过tf_roll对样本做循环位移默认时间偏移范围[-500, 0]个采样点见 utils.py 的time_shift_range默认值背景噪声混入从_background_noise_目录随机截取一段长噪声以随机音量叠加到前景上静音样本_silence_类样本将前景音量置 0仅保留或叠加背景噪声避免模型学到全零样本。上述增强参数集中于 utils.py 的data_gen函数默认值为background_frequency0.3、background_volume_range0.15、foreground_frequency0.3、foreground_volume_range0.15、time_shift_frequency0.3。4.4 数据集划分AudioProcessor.prepare_data_index完成训练/验证/测试划分关键点包括基于文件名 SHA-1 哈希的确定性划分which_set保证同一文件在不同运行中落入同一分区避免数据泄漏silence_percentage13.0按各分区样本数的 13% 注入静音样本unknown_percentage60.0按各分区样本数的 60% 注入未知词样本validation_percentage10.0、testing_percentage0.0验证集占比 10%测试集默认不划分这些取值来自 train.py 中对AudioProcessor的调用。5. 模型架构1D 时间堆叠 VGG 风格网络原文档指出该模型主体是一个面向音频波形这类时序数据的1D 卷积 VGG 风格时间堆叠模型其中一个一维膨胀卷积层作为上下文卷积context_conv用于提取更大范围的时序感受野随后是降维卷积层reduce_conv通过 1D MaxPooling 降低传入后续层的参数量。这些结构在 model.py 的conv_1d_time_stacked_model中有完整实现。模型流程如下输入层接受形状[input_size]的一维向量默认 16000即原始波形先Reshape为[800, 20]的二维时序-通道结构通过PreprocessRaw恒等映射或Preprocess(x 0.8) / 7.0后裁剪到[-5, 5]做输入归一化交替堆叠_context_conv与_reduce_conv模块滤波器数量沿 32 → 48 → 96 → 128 → 160 → 192 → 256 逐级递增每个卷积模块内部依次为Conv1Duse_biasFalsekernel_regularizerl2(0.00001)→BatchNormalization→ReLU6激活_reduce_conv额外包含MaxPool1D(pool_size3, strides2)_context_conv支持dilation_rate参数用于膨胀卷积扩大感受野末端Dropout(0.3)后接Conv1D(num_classes, 5, activationsoftmax)并Reshape([-1])直接输出每类概率模型使用Adam(lr3e-4)优化器、categorical_crossentropy损失与categorical_accuracy评估指标编译。模型工厂函数speech_model(model_type, input_size, num_classes11)目前仅支持conv_1d_time_stacked一种类型其余会抛出ValueError输入维度按output_representation选择非raw表示使用fingerprint_sizeraw表示使用desired_samples见 train.py。6. 训练train.py 用法详解6.1 命令行参数模型通过train.py训练完整用法如下python train.py [-h] [-sample_rate SAMPLE_RATE] \ [-batch_size BATCH_SIZE] \ [-output_representation OUTPUT_REPRESENTATION] \ -data_dirs DATA_DIRS [DATA_DIRS ...]各参数在 train.py 中的默认值与说明参数类型默认值说明-sample_rateint16000音频采样率-batch_sizeint32训练批大小-output_representationstrraw输入表示raw、spec、mfcc或mfcc_and_raw-data_dirsstr可多个必填数据目录列表如data/train注意原文档示例使用的-batch_size 64会覆盖默认值 32两个数值均可用。6.2 训练命令示例原文档给出的标准训练命令python train.py -sample_rate 16000 -batch_size 64 -output_representation raw -data_dirs data/train该命令的完整执行链路可对照 train.py 源码解析参数后用get_classes(wanted_onlyTrue)取得 10 个目标词并以prepare_words_list加上_silence_/_unknown_得到完整标签调用prepare_model_settings(label_count..., sample_rate16000, clip_duration_ms1000, window_size_ms30.0, window_stride_ms10.0, dct_coefficient_count80, num_log_mel_features60, output_representationraw)计算模型超参并打印构造AudioProcessor(data_dirs[data/train], wanted_words..., silence_percentage13.0, unknown_percentage60.0, validation_percentage10.0, testing_percentage0.0, ...)分别通过data_gen(ap, sess, batch_size..., modetraining/validation)创建训练与验证生成器以speech_model(conv_1d_time_stacked, input_sizedesired_samples, num_classes...)构建模型注册 4 个回调后调用model.fit_generator(..., steps_per_epochap.set_size(training) // batch_size, epochs100)训练 100 轮。6.3 训练回调train.py 注册的回调及其作用ConfusionMatrixCallback每个 epoch 结束时在验证集上做预测并生成混淆矩阵分别写入confusion_matrix.txt与wanted_confusion_matrix.txt详见 callbacks.py其中wanted版本会把非目标词映射回_unknown_后统计ReduceLROnPlateau监控val_categorical_accuracymodemaxfactor0.5patience4min_lr1e-5验证准确率停滞时学习率减半TensorBoard(log_dirlogs)记录训练曲线到logs/ModelCheckpoint保存验证准确率最优的权重到checkpoints/conv_1d_time_stacked_model/ep-{epoch:03d}-vl-{val_loss:.4f}.hdf5。训练结束后脚本还会调用model.evaluate_generator在验证集上打印最终损失与准确率。7. 训练结果与混淆矩阵原文档给出的结果是模型训练100 个 epoch后验证集分类准确率约为0.94并输出如下混淆矩阵用于评估分类性能[099]: val_categorical_accuracy: 0.94 | Predicted | _silence_ | down | go | left | no | off | on | right | stop | two | up | yes | | ------------- |:-------------:| ------:| ---:| ------:| ---:| -----:| ----:| -------:| -------:| ------:| ----:|-----:| | Actual | _silence_ | 322 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 down | 0 | 240 | 6 | 0 | 7 | 0 | 1 | 0 | 0 | 4 | 0 | 0 go | 5 | 3 | 223 | 0 | 2 | 1 | 1 | 0 | 0 | 15 | 2 | 0 left | 0 | 0 | 0 | 221 | 2 | 0 | 0 | 1 | 0 | 8 | 0 | 7 no | 0 | 0 | 4 | 0 | 246 | 0 | 2 | 0 | 0 | 14 | 0 | 0 off | 0 | 0 | 1 | 0 | 0 | 229 | 2 | 0 | 0 | 5 | 15 | 0 on | 3 | 0 | 0 | 0 | 0 | 7 | 227 | 0 | 0 | 14 | 1 | 0 right | 0 | 0 | 0 | 4 | 0 | 0 | 0 | 222 | 0 | 21 | 3 | 1 stop | 2 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 224 | 8 | 3 | 0 two | 6 | 4 | 5 | 7 | 6 | 2 | 6 | 3 | 0 | 1468 | 4 | 0 up | 1 | 0 | 0 | 0 | 0 | 10 | 1 | 0 | 0 | 11 | 230 | 0 yes | 2 | 1 | 0 | 2 | 4 | 0 | 1 | 0 | 0 | 6 | 0 | 240从矩阵可观察到的典型现象two与go、on、off、up等词存在少量交叉混淆如two被误判为go15 次、right被误判为two21 次说明发音相近的词是主要错误来源而_silence_类几乎完全正确322 全部正确得益于静音样本的训练注入。8. 导出 TensorFlow Lite 模型训练产出的 Keras HDF5 权重位于checkpoints/conv_1d_time_stacked_model/下形如ep-084-vl-0.2595.hdf5。仓库提供三种导出途径8.1 直接 Keras → TFLite 转换export/convert_keras_lite.py 使用tf.lite.TFLiteConverter.from_keras_model_file(keras_model, input_arrays, output_arrays)将指定 HDF5 权重文件直接转换为converted_speed_keras_model.tflite其中input_arrays[the_input]、output_arrays[the_output]。脚本内模型路径../conv_1d_time_stacked_model/ep-084-vl-0.2595.hdf5是示例值实际使用时应替换为你训练得到的最优 checkpoint 路径。8.2 Keras → 冻结图 → TFLiteexport/convert_keras_to_quantized.py 提供一条更完整的导出链路支持命令行参数-input_fld默认.Keras 权重文件所在目录-output_fld默认同input_fld输出目录-input_model_file默认model.h5输入权重文件名-output_model_file默认{input_model_file}.pb输出的冻结图文件名-output_graphdef_file默认model.ascii图定义文本文件-num_outputs默认 1输出节点数多流网络需按输出数量设置-graph_def默认False是否额外写出 ascii 图定义-output_node_prefix默认output_node输出节点前缀-quantize默认False是否使用quantize_weights/quantize_nodes做权重量化-theano_backend默认FalseTheano 后端需置为channels_first且与量化不兼容会抛出ValueError。该脚本加载conv_1d_time_stacked_model(fingerprint_size16000, num_classes12)后载入权重用tf.identity重命名输出节点最后经convert_variables_to_constants冻结为可推理的.pb图。8.3 冻结图 → TFLite命令行得到.pb冻结图后可用 export/convert_tensorflow_lite.sh 中的tflite_convert命令完成最后一步转换tflite_convert --output_file converted_speech_model.tflite \ --graph_def_file model.h5.pb \ --output_format TFLITE \ --inference_type FLOAT \ --inference_input_type FLOAT \ --input_arrays input_1 \ --output_arrays output_node0 \ #--allow_custom_ops其中--input_arrays input_1、--output_arrays output_node0需与冻结图实际节点名一致Keras 默认输入名通常为input_1输出节点由-output_node_prefix生成如output_node0--inference_type FLOAT表示保留浮点推理如需量化可改用QUANTIZED_UINT8等类型。9. 移动端消费模型与标签的对接方式导出的.tflite模型与标签文件最终被移动端工程消费。以 iOS 示例 为例其ModelDataHandler加载conv_actions_frozen.tflite与conv_actions_labels.txt并约定输入采样率sampleRate 16000、片段时长sampleDuration 1000与训练端desired_samples16000严格一致输入张量索引 0 为音频缓冲归一化到[-1, 1]的 Float 数组索引 1 为采样率标签偏移labelOffset 2对应标签文件前两行为_silence_、_unknown_两个特殊类别通过RecognizeCommands对连续帧输出做滑动平均投票平均窗口 1000 ms、抑制时间 1500 ms、最小计数 3 等把逐帧分类结果平滑为稳定的命令识别。这说明训练与推理两端必须保持一致的采样率、输入长度与标签顺序才能保证模型正确工作。10. 总结本示例用一套简洁的 1D 时间堆叠 VGG 风格网络完成了从 65,000 条语音中识别 10 个目标词的端到端流程download.py获取数据 →generator.py完成特征提取与增强 →model.py构建conv_1d_time_stacked模型 →train.py训练 100 轮达到约 0.94 的验证准确率 →export/脚本导出 TFLite 模型供移动端推理。其中context_conv膨胀卷积负责扩大时序感受野、reduce_conv通过 1D MaxPooling 压缩参数量配合静音/未知词类别与背景噪声增强构成了一个可在资源受限设备上运行的轻量级关键词识别方案。如需深入源码细节可继续查阅 model.py、generator.py 与 callbacks.py移动端运行方式与工程结构见 speech_commands 目录 下对应平台的 README。赞分享示例工程【免费下载链接】examplesTensorFlow examples项目地址https://gitcode.com/gh_mirrors/exam/examples点击查看免费下载相关推荐终极指南TensorFlow Lite语音命令识别实战从训练到移动端部署终极指南TensorFlow Lite语音命令识别实战从训练到移动端部署 TensorFlow Lite语音命令识别是一项强大的技术能让你的移动应用轻松具示例工程PaddleSpeech 命令行工具paddlespeech.cli完全指南一行命令调用语音识别、语音合成、声纹识别等预训练模型PaddleSpeech 命令行工具paddlespeech.cli完全指南一行命令调用语音识别、语音合成、声纹识别等预训练模型 paddlespeech人工智能语音音频TensorFlow Lite图像分类模型训练与部署完整指南TensorFlow Lite图像分类模型训练与部署完整指南 TensorFlow Lite图像分类技术让移动端AI应用开发变得前所未有的简单 这个强大文档教程知识库上一篇Pearcleaner让Mac保持清爽的免费开源清理利器下一篇163MusicLyrics高效获取网易云与QQ音乐LRC歌词的跨平台解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考