尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

TensorFlow Lite 语音指令识别实战:从 Speech Commands 数据集训练到 iOS 端部署

发布时间:2026/9/26 2:29:19

资讯中心
01
ARTICLE

TensorFlow Lite 语音指令识别实战:从 Speech Commands 数据集训练到 iOS 端部署

TensorFlow Lite 语音指令识别实战:从 Speech Commands 数据集训练到 iOS 端部署
示例工程【免费下载链接】examplesTensorFlow examples项目地址https://gitcode.com/gh_mirrors/exam/examples点击查看免费下载语音指令识别Speech Commands Recognition是移动端 AI 的典型落地场景之一设备通过麦克风持续监听识别出用户说出的预设短词如 yes、no、stop从而支撑免提交互、语音唤醒等能力。本指南以本仓库lite/examples/speech_commands下的完整示例为主线系统讲解基于 TensorFlow Speech Commands 数据集的端到端方案涵盖数据集获取、音频预处理、1D 卷积模型训练、模型导出为 TFLite以及在 iOS 设备上的推理与部署。读完本文你将掌握一条可复现的语音数据集 → Keras 模型 → TFLite → 移动端识别完整链路。示例概览与项目定位本目录lite/examples/speech_commands/README.md提供了一个端到端的语音指令识别示例集合目标是在移动设备上对语音指令进行识别并高亮显示说出的单词。按官方文档规划它包含三个组成部分使用 TensorFlow Lite 模型识别语音指令的Android 应用使用 TensorFlow Lite 模型识别语音指令的iOS 应用见 ios/生成语音指令 TFLite 模型的训练与导出指南见 ml/。需要说明的是从当前仓库快照来看lite/examples/speech_commands下实际包含的是 ml/训练与模型导出脚本和 ios/iOS 示例应用两部分同时仓库中的 README.md 与 ios/README.md 均带有明确的Deprecated已弃用警告官方建议迁移到技术栈更新的 Sound Classification 示例。因此本文在讲解本示例的技术实现时也会提醒读者关注这一演进方向。数据集TensorFlow Speech Commands Dataset数据集规模与内容训练脚本依赖 TensorFlow Speech Commands 数据集。该数据集包含65,000 条 1 秒钟的语音片段由数千名不同说话人录制覆盖30 个英文短词例如 yes、no、up、down、left、right、on、off、stop、go 等同时附带_silence_静音与_background_noise_背景噪声等特殊样本类别。类别选择移动端指令识别通常只需要少量指令词。本示例从 30 个词中挑选10 个类别用于 TensorFlow Lite 语音指令应用stop down off right up go on yes left no对应实现见 ml/classes.pyget_classes(wanted_onlyTrue)返回这 10 个词的列表并断言长度为 10get_classes(wanted_onlyFalse)则返回完整的 30 词列表用于构建未知词映射。值得注意的一个细节在类别体系中除了 10 个目标词还有两个特殊类别参与训练与推理。从 ml/generator.py 可以看到词表由prepare_words_list()统一构造最终类别集合为_silence_ _unknown_ 10 个目标词_silence_索引 0静音类别用于让模型学会不说话时不做任何触发_unknown_索引 1未知词类别把不在目标词表中的其余 20 个词归入其中增强模型对无关语音的鲁棒性。因此模型输出层共有12 个类别这一点与 iOS 端模型标签文件 conv_actions_labels.txt 的内容一一对应_silence_ _unknown_ yes no up down left right on off stop go数据集下载ml/download.py 提供了数据集的一键下载脚本它从http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz下载speech_commands_v0.01版本的数据集解压到data/train目录后删除压缩包。运行方式python download.pyrequirements.txt中声明的依赖包括wget3.2用于下载、Keras2.2.0、pandas0.22.0、pandas-ml0.5.0用于混淆矩阵统计以及tensorflow1.14.0、tensorflow-gpu1.14.0详见 ml/requirements.txt。音频数据预处理基础采样配置语音片段在送入模型前会被统一整理为固定采样率、固定长度的 PCM 波形数据。文档给出的配置如下采样点数Samples采样率Sample Rate片段时长Clip Duration1600016000 Hz1000 ms即每个样本是 1 秒钟、16000 Hz、单声道、16000 个采样点的原始波形。该配置在 ml/model.py 的prepare_model_settings()中通过desired_samples int(sample_rate * clip_duration_ms / 1000)计算得到并且训练脚本 ml/train.py 固定使用clip_duration_ms1000、window_size_ms30.0、window_stride_ms10.0、dct_coefficient_count80、num_log_mel_features60等超参数。多种输入表示raw / spec / mfcctrain.py的-output_representation参数控制模型输入特征的类型支持四种取值其维度计算见 ml/model.py表示方式含义特征维度计算raw原始 PCM 波形默认desired_samples即 16000spec频谱图spectrogramspectrogram_frequencies × spectrogram_length257 × 频谱帧数mfcc梅尔频率倒谱系数num_log_mel_features × spectrogram_lengthmfcc_and_rawMFCC 与原始波形拼接以 MFCC 为主同时输出原始波形其中频谱与 MFCC 的生成逻辑在 ml/generator.py 的prepare_processing_graph()中实现先对波形做短时傅里叶变换tf.signal.stft帧长window_size_samples、帧移window_stride_samples取幅度谱得到频谱图再通过 80~7600 Hz 的梅尔滤波器组linear_to_mel_weight_matrix得到 log-Mel 频谱进而计算 MFCC。训练时默认使用raw表示配合下文介绍的 1D 时序卷积模型直接消费原始波形。训练期数据增强训练阶段还会对音频施加一系列失真增强见 ml/generator.py 与 ml/utils.py 的data_gen()默认参数背景噪声混入从_background_noise_目录随机截取一段噪声叠加到前景语音上训练时背景出现频率background_frequency0.3、音量范围background_volume_range0.15音量调节前景音量以foreground_frequency0.3的概率在 ±0.15 范围内随机缩放时间平移以time_shift_frequency0.3的概率在[-500, 0]个采样点范围内滚动波形tf_roll实现模拟指令起始时间的变化静音样本处理_silence_样本将前景音量置零、仅保留背景噪声避免模型学会以全零向量识别静音的捷径。验证集与测试集则关闭所有随机增强data_gen()中对非 training 模式将增强频率全部置 0保证评估的公平性。模型架构时间堆叠的 1D 卷积网络本示例的模型conv_1d_time_stacked是一个面向音频波形这类时序数据的时间堆叠 VGG 风格网络全部使用一维卷积Conv1D定义在 ml/model.py。核心结构可以拆解为三层设计输入整形与预处理输入为 16000 个采样点的原始波形先Reshape成[800, 20]把 1 秒波形按时间与幅值维度重组再经过PreprocessRaw保持原值对应preprocess_raw见 ml/model.py。此外代码中还有一个preprocess()(x 0.8) / 7.0后裁剪到 [-5, 5]用于非 raw 输入的归一化场景。上下文卷积context_conv使用膨胀dilated1D 卷积dilation_rate1即普通卷积可通过参数调整感受野来提取更宽时间范围的上下文特征。每个卷积块都遵循Conv1D → BatchNormalization → relu6 激活的顺序并施加 L2 正则kernel_regularizerl2(0.00001)、use_biasFalse。降维卷积reduce_conv在context_conv之后用 1D MaxPoolingpool_size3, strides2对特征做降维减少传入后续层的参数量。从 ml/model.py 可以完整看到网络的堆叠序列——context_conv与reduce_conv交替出现卷积核宽度从 1 逐步增长到 3通道数逐级扩张context_conv(32, k1) → reduce_conv(48, k3) → context_conv(48, k3) → reduce_conv(96, k3) → context_conv(96, k3) → reduce_conv(128, k3) → context_conv(128, k3) → reduce_conv(160, k3) → context_conv(160, k3) → reduce_conv(192, k3) → context_conv(192, k3) → reduce_conv(256, k3) → context_conv(256, k3)网络尾部依次是Dropout(0.3)防止过拟合、输出 12 类的Conv1D(num_classes, 5, activationsoftmax)以及Reshape([-1])。模型使用 Adam 优化器学习率3e-4、categorical_crossentropy损失函数和categorical_accuracy指标完成编译ml/model.py。该架构思想源于论文Convolutional Neural Networks for Small-footprint Keyword Spotting是经典的轻量级关键词唤醒Keyword Spotting模型范式。训练流程命令行参数训练入口为 ml/train.py它通过 argparse 定义如下参数python train.py [-h] [-sample_rate SAMPLE_RATE] \ [-batch_size BATCH_SIZE] \ [-output_representation OUTPUT_REPRESENTATION] \ -data_dirs DATA_DIRS [DATA_DIRS ...]各参数含义默认值来自 ml/train.py参数默认值说明-sample_rate16000音频采样率-batch_size32训练批次大小-output_representationraw输入特征表示可选raw、spec、mfcc、mfcc_and_raw-data_dirs必填数据集目录列表例如data/train训练示例文档给出的完整训练命令python train.py -sample_rate 16000 -batch_size 64 -output_representation raw -data_dirs data/train执行后脚本会按以下流程运行ml/train.py初始化 TensorFlow Session 与 Keras 后端用prepare_model_settings()计算模型设置10 个目标词 _silence__unknown_共 12 类构建AudioProcessor加载并划分数据silence_percentage13.0每个划分集中静音样本占 13%、unknown_percentage60.0未知词样本占 60%、validation_percentage10.0、testing_percentage0.0其中训练/验证/测试集的划分基于文件名哈希which_set()见 ml/generator.py保证同一音频始终划入同一子集构建conv_1d_time_stacked模型输入维度按output_representation取fingerprint_size或desired_samples训练 100 个 epoch并在每个 epoch 结束时通过回调记录混淆矩阵、学习率衰减与模型检查点。回调与监控训练期间挂载了四个 Keras 回调ml/train.pyConfusionMatrixCallbackml/callbacks.py每个 epoch 结束后在验证集上计算混淆矩阵并写入confusion_matrix.txt与wanted_confusion_matrix.txt后者把非目标词折叠为_unknown_同时把val_loss、val_categorical_accuracy等指标回填到日志ReduceLROnPlateau监控val_categorical_accuracy连续 4 个 epoch 无提升时将学习率减半factor0.5下限1e-5TensorBoard日志写入logs/目录便于可视化训练曲线ModelCheckpoint以val_categorical_accuracy为监控指标、save_best_onlyTrue把最优权重保存到checkpoints/conv_1d_time_stacked_model/下文件名为ep-{epoch:03d}-vl-{val_loss:.4f}.hdf5。训练结果文档记录的训练结果为训练 100 个 epoch 后val_categorical_accuracy达到 0.94并给出了用于评估分类性能的混淆矩阵[099]: val_categorical_accuracy: 0.94预测值\实际值silencedowngoleftnooffonrightstoptwoupyessilence32200000000000down02406070100400go532230211001520left00022120010807no004024602001400off001002292005150on300007227001410right000400022202131stop20110100224830two645762630146840up1000010100112300yes21024010060240其中two行/列来源于验证集中包含的完整 30 词样本非目标词在评估时归入_unknown_但完整混淆矩阵会按原始标签统计其余 10 个目标词与_silence_均表现出很高的对角线准确率说明该 1D 时序卷积模型在轻量前提下对指令词识别是有效的。导出 TFLite 模型训练完成后需要把 Keras 模型转换为 TensorFlow Lite 格式才能在移动端运行。ml/export/目录提供了三种导出方式1. 直接转换 Keras 模型ml/export/convert_keras_lite.py 演示了用TFLiteConverter.from_keras_model_file()直接转换脚本中指定了keras_model示例指向../conv_1d_time_stacked_model/ep-084-vl-0.2595.hdf5以及输入/输出张量名the_input/the_output转换产物写为converted_speed_keras_model.tflite。2. 冻结图 量化导出ml/export/convert_keras_to_quantized.py 提供了更完整的导出管线先把 Keras 权重加载进模型示例加载ep-022-vl-0.2864.hdf5用tf.identity给输出节点命名再用convert_variables_to_constants冻结为常量图最后通过tf.io.write_graph写出 .pb 文件。脚本支持以下参数参数默认值说明-input_fld.Keras 权重文件所在目录-output_fld同 input冻结图输出目录-input_model_filemodel.h5输入权重文件名-output_model_fileinput.pb输出文件名-num_outputs1输出分支数多流网络时设为输出个数-graph_defFalse是否额外写出 ASCII 图定义-output_node_prefixoutput_node输出节点命名前缀-quantizeFalse是否启用权重/节点量化quantize_weights、quantize_nodes-theano_backendFalseTheano 后端时使用 channels_first与量化不兼容3. 使用 tflite_convert 命令行ml/export/convert_tensorflow_lite.sh 展示了命令行转换方式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该命令以冻结图model.h5.pb为输入指定输入张量input_1、输出张量output_node0推理类型保持 FLOAT生成converted_speech_model.tflite。如果不想自行训练也可以直接使用官方预训练模型iOS 端的 RunScripts/download_models.sh 会在首次构建时从https://storage.googleapis.com/download.tensorflow.org/models/tflite/conv_actions_tflite.zip自动下载conv_actions_frozen.tflite与conv_actions_labels.txt到SpeechCommands/Model/目录。iOS 端部署环境要求根据 ios/README.mdiOS 示例应用的要求如下iOS 12.0 及以上Xcode 10.0 及以上需要安装 Xcode 命令行工具xcode-select --install新安装 Xcode 时需先运行一次以同意许可协议应用需要麦克风权限且必须在真实 iOS 设备上运行——模拟器可以编译运行但会抛出找不到麦克风camera not found exception异常无需自行构建整个 TensorFlow 库使用CocoaPods即可拉取 TensorFlow Lite 库。构建步骤安装 CocoaPods如未安装sudo gem install cocoapods进入示例目录并安装 Pod 依赖、生成工作区文件cd examples/speech_commands/ios/ pod install如果之前安装过该 Pod 而命令失效可尝试pod update。完成后应生成SpeechCommands.xcworkspace。用 Xcode 打开SpeechCommands.xcworkspace注意不要打开 .xcodeproj在General - Signing中把 Bundle Identifier 改为唯一标识并选择自己的开发团队构建并运行应用首次启动时授予麦克风权限之后对着设备说出指令词即可看到识别结果。模型文件无需手动下载——它们由 Xcode 构建时的 Run Script 阶段RunScripts/download_models.sh自动下载并放入SpeechCommands/Model/目录。注意事项克隆仓库后请勿删除项目中指向 .tflite 与 .txt 的空引用。这些引用会在首次构建运行、模型和标签文件下载后被自动修复如果误删引用模型文件仍会被下载到 Model 目录但需要手动把引用加回工程才能运行。推理逻辑从 PCM 到指令识别应用完全使用 Swift 编写通过 TensorFlow Lite Swift 库执行推理Objective-C 开发者可改用 Objective-C 库。核心实现在 ModelDataHandler.swift使用Interpreter加载conv_actions_frozen.tflite线程数默认 1上限 10每个推理周期把[Int16]麦克风缓冲区归一化除以maxInt16AsFloat32 32767.0后拷贝到第 0 个输入张量音频缓冲并把采样率 16000 作为第 1 个输入张量调用interpreter.invoke()后读取输出张量得到 12 个类别的置信度分数通过labelOffset 2跳过_silence_与_unknown_只展示 10 个指令词的识别结果。由于单帧推理结果噪声较大应用还用 RecognizeCommands.swift 对连续结果做了滑窗平均与去重文档说明界面显示的百分比是 1000ms 窗口内的平均指令识别置信度。其核心参数包括averageWindowDuration 1000.0平均窗口时长ms与训练时的 1 秒片段时长对应detectionThreshold识别阈值初始化时传入 0.3suppressionTime 1500.0抑制时间——同一指令被识别后 1.5 秒内不重复触发minimumCount 3窗口内至少积累 3 帧结果才参与判定minTimeBetweenSamples 30.0相邻两次推理的最小时间间隔。process()的逻辑是把最新推理结果按时间戳追加到滑动窗口丢弃超出平均窗口时长的旧结果对窗口内各帧的 12 类分数做平均、排序只有当最高平均分超过阈值、且距上次触发超过抑制时间时才判定为新指令isNew true并展示给用户。这套滑窗平均 阈值 抑制机制有效避免了单帧误判和指令重复触发是语音指令类应用的标准后处理范式。小结与演进方向本示例完整覆盖了一条可复现的语音指令识别链路Speech Commands 数据集下载 → 原始波形/频谱特征生成与增强 → 时间堆叠 1D 卷积模型训练 → 混淆矩阵评估 → Keras 冻结图导出为 TFLite → iOS 端 Interpreter 推理与滑窗后处理。其中 ml/ 与 ios/ 的源码可直接作为二次开发的起点。同时需要再次强调官方已在本示例的 README.md 与 ios/README.md 中明确标注Deprecated并推荐迁移到采用最新技术栈的 Sound Classification 示例该目录同样提供了 iOS 端的声音分类示例应用。在阅读本指南时建议把 1D 时序卷积建模、滑窗识别后处理等思想作为核心收获而在新项目中优先采用官方当前推荐的 Sound Classification 方案。赞分享示例工程【免费下载链接】examplesTensorFlow examples项目地址https://gitcode.com/gh_mirrors/exam/examples点击查看免费下载相关推荐终极指南TensorFlow Lite语音命令识别实战从训练到移动端部署终极指南TensorFlow Lite语音命令识别实战从训练到移动端部署 TensorFlow Lite语音命令识别是一项强大的技术能让你的移动应用轻松具示例工程基于 Speech Embedding TF-Hub 模块的三类关键词识别训练实战从 Speech Commands 到自录语音与合成数据基于 Speech Embedding TF Hub 模块的三类关键词识别训练实战从 Speech Commands 到自录语音与合成数据 导读 本文基于 g人工智能深度学习NLP计算机视觉强化学习给 T5 微调出长文本摘要模型基于 CNN/Daily Mail 数据集的完整实战指南给 T5 微调出长文本摘要模型基于 CNN/Daily Mail 数据集的完整实战指南 打开一份几千字的新闻稿你只想用半分钟抓住核心谁、发生了什么、结果如示例工程上一篇Blawn语法详解告别复杂体验简洁编程的终极魅力下一篇LMMS虚拟乐器编程终极指南使用Python自动化控制音乐创作创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。