语音决策模型:不经ASR直接触发工具,实现轻量级语音交互 最近这两个语音方向的项目放在一起看化学反应特别明显。Neuphonic 团队开源的 NeuDecide 把模型压到 43MB还能做到不经 ASR 就触发工具调用法国团队做的 Mallow 儿童无屏音箱则用 AI 实时听孩子说话来推进游戏。一个是开源模型一个是硬件产品看起来不挨着但背后的核心命题是同一件事语音交互到底能不能跳过“先转成文字”这步。我自己一直很关注语音交互的落地之前给一些小设备做过语音控制方案最深的感受是传统 ASR 链路在玩具、家电、儿童语音产品里太笨重了。你只是想让用户说“播放”或者“选A”结果背后跑了一个完整的语音识别引擎延迟堆到一两秒功耗还高。NeuDecide 这条路如果真能走通等于给轻决策场景开了一扇侧门。这篇就把这个项目的设计思路拆开聊一聊再结合 Mallow 这类儿童语音音箱的落地场景看看语音决策模型到底能解决什么问题、有哪些坑。1. 为什么“不经 ASR 的语音决策”会在今天被反复提起1.1 传统语音交互流水线到底有多少隐形成本标准的语音助手链路是这样的音频采集、端点检测、语音识别、文本理解、意图解析、执行动作。每一步单独看都不算难但串起来问题就大了。首先是延迟叠加麦克风采完音之后要等 VAD 判断说话结束再送去 ASR 出一段文本NLU 再把文本映射成意图最后才轮到业务逻辑执行。我自己实测过不少方案本地 ASR 稍好一点云端 ASR 光网络往返就要几百毫秒整套下来从“说完话”到“设备响应”常常超过一秒。更隐蔽的是错误累加。ASR 会把 /ni hao/ 识别错NLU 基于错误文本给出的意图自然也是错的。而且 ASR 模型为了保证词汇覆盖率往往做了大量不相关的解码很多算力浪费在生成用户根本不需要的文字上。你只是想让他点亮台灯ASR 却把整句话写成了文本顺便还识别错了一个词导致整个决策失败。这种模式还有一个麻烦ASR 的音频特征里其实包含了很多文本之外的信息比如语气、情感、要不要、哪个选项更重要这些信息传统链路在转写时基本都丢掉了。文本只留下“字面意思”说话人当时的情绪状态、犹豫程度、音量变化全被压缩没了。对于命令式交互文本够用但对于需要理解“语气倾向”的场景文本反而成为瓶颈。1.2 语音决策模型把问题重新定义了NeuDecide 类的语音决策模型思路很简单如果最终目标只是“判断用户想干什么”何必先生成完整文本直接从语音信号提取语义表示再做意图分类、槽位填充、动作映射一步到位。就像你去快餐店点单柜台上只有三种固定套餐店员根本不用把你说的每个字复述一遍听个大概就知道你要哪个。ASR 在这里有点类似于店员复述订单如果选项本来就有限这步就是纯浪费。从技术上看语音决策模型是把“语音识别”和“意图理解”合并成一个模型。输入是原始音频输出是动作参数或者工具调用指令。这种端到端的建模方式既有 ASR 的声学感知能力又有 NLU 的语义决策能力而且因为跳过了中间文本表示模型规模可以做得比“ASR NLU”两套系统小得多。这也是 NeuDecide 能把模型压到 43MB 的关键原因。不过要强调一点“不经 ASR”不等于模型完全不理解语音内容。它理解的是语音的语义向量只是不把它展开成人类可读的文字。这就像你看到一个陌生人的照片能立刻判断出他大概什么年龄段、什么情绪状态不需要先把他的人脸转成文字描述。1.3 “语音决策”和传统关键词唤醒、命令词识别有什么区别很多人会问这和“小度小度”这种唤醒词模型有什么区别区别还挺大的。唤醒词模型本质上是做“说话内容匹配”它仍然在判断语音是否等于某个固定文本而语音决策模型做的是“语义动作映射”它要回答的是“这句话对应哪个工具、哪个参数”。举个例子唤醒词模型听到“播放”不会做任何事因为它只负责唤醒决策模型听到“放个动画片”或者“打开小猪佩奇”可以直接映射到多媒体工具的“play”动作参数是“动画片”或者“小猪佩奇的相关内容”。唤醒词只需要二分类“是/不是”决策模型要输出结构化语义复杂度高不少但也更有实用价值。还有一个容易混淆的概念是语音情绪识别。情绪识别只输出情感标签决策模型输出的是一组可执行的工具参数。Mallow 音箱里孩子说“我要选红色的那条路”决策模型不仅要判断孩子有选择意图还要提取“红色”这个槽位然后触发游戏的对应分支。这是完全不同的任务难度。2. NeuDecide 项目拆解43MB 背后做了哪些取舍2.1 43MB 这个体量大概是什么水平先算一笔账。一个 43MB 的模型文件如果按 FP32 存储大概对应 1000 万到 1200 万个参数但实际部署通常会做量化如果按 INT8 存储参数量能到 4000 万级别。不管是哪种情况这都属于典型的 TinyML / 边缘模型范畴。对比一下一个稍微完整一点的 ASR 模型动辄几百 MB端到端语音对话模型更是以 GB 计算。NeuDecide 能做到 43MB说明它至少在架构设计上选择了轻量骨架并大概率做了权重共享和投影压缩。43MB 能带来什么实际体验差别第一可以轻松放进嵌入式设备的 Flash 存储不用担心存储空间第二大部分推理框架加载这种规模模型只需要几百毫秒移动端 CPU 可以直接跑不用 GPU第三内存占用足够低可以跟蓝牙协议栈、音频采集、UI 渲染同时共存。我在旧笔记本上试跑过类似规模的小模型纯 CPU 推理一次前向传播大概在 20 到 60 毫秒之间这还是在没有做算子优化的情况下。如果配合工程优化比如算子融合、线程池预热、int8 量化推理延迟完全可以压到 10 毫秒以内。对于语音决策这种“只在说话结束后触发一次”的任务算力压力其实不大。2.2 “不经 ASR”的推理链路到底长什么样NeuDecide 的推理链路应该是这样的麦克风采集音频 → 预处理和端点检测 → 特征提取 → 决策模型前向传播 → 输出工具调用指令。相比传统链路它少了一个“生成文本”的环节换来的是更低的延迟和更小的模型。这里有一个关键设计音频特征怎么提。传统 ASR 一般用 Fbank 或 MFCC再叠加帧堆叠而语音决策模型如果要做语义级别判断通常会用语音自监督模型预训练出来的表示层或者直接用端到端学习的卷积/Transformer 编码器。自监督表示的优势在于它学到的不是音素而是音频片段在语义层面的相似关系这为“不用 ASR 也能理解意图”提供了基础。模型前向传播发生的时机也很重要。没有唤醒词的时候设备需要一直跑一个轻量的 VAD 模块来判断有没有人说话一旦 VAD 检测到语音结束就把这段音频喂给决策模型。这种模式在功耗上比连续跑 ASR 更友好因为大部分时间设备处于低功耗监听状态只有听到人声才唤醒完整的推理链路。2.3 工具调用能力是怎么实现的NeuDecide 被称为“语音决策模型”而不是“语音意图分类器”关键就是它具备工具调用能力。简单说模型输出不是“我判断用户想播放音乐”这种自然语言描述而是一段可以直接驱动系统执行的结构化数据工具名称、动作、参数槽位。从实现角度看可以把工具抽象成注册表每个工具有名称、参数定义、操作逻辑。模型训练时输入是音频标签是一段伪文本或结构化输出。推理时模型输出的结果经过解码器转成 JSON 或者指令序列系统再照这个指令去调用对应工具。因为工具的个数和参数范围是有限的这个解码过程不需要复杂的自然语言解析只需要做有限状态约束和容错。还有一层是参数槽位的填充。孩子说“我要红色的路”模型要提取“红色”填充到“选择”工具的“颜色”参数里用户说“明天早上八点提醒我”模型要提取“明天早上八点”作为时间参数。这不完全靠分类头能解决需要模型有一个轻量的提取头本质上还是“从语义表示中映射出关键槽位”。这种能力在训得好的模型里是具备的但也会有槽位提取不稳定的问题后面我再展开说。2.4 边缘部署是这类模型的最终价值把模型做到 43MB最大的意义不是省存储而是让语音决策可以脱离云端运行。设备本地推理意味着三件事隐私数据不出设备、延迟可以控制在极低水平、离线也能正常工作。尤其是儿童设备家长对语音数据上传的敏感度越来越高离线决策几乎成了产品能不能过审的关键。边缘部署还有个容易被忽视的好处成本。云端语音服务是按调用次数收费的一个家庭每天几十次语音交互乘上用户量就是一笔不小的开销。本地推理模型是一次性研发成本边际成本几乎为零。这也就是为什么 NeuDecide 这类模型会受到硬件团队关注它把整个语音交互的运营成本结构改变了。3. 关键设计思路语音决策模型背后的几个技术支点3.1 自监督语音表示不是“不识别文字”而是“用另一种方式理解语音”想要不经 ASR 做出语义决策最核心的技术支点就是自监督语音表示学习。所谓自监督就是模型在海量无标注音频上做预训练通过预测被掩盖的音频片段、或者做对比学习让模型学会音频片段之间的关系。这种表示天然就编码了发音、韵律、音高、节奏、情感等信息。关键洞察在于语音中的语义并不完全依赖音素序列。同样是“好的”坚定地说和犹豫地说语义倾向完全不同孩子说“我要玩”和“我不想玩”重音位置和语气也有明显区别。自监督表示能捕捉到这些细微差别而 ASR 转出来的文本会丢掉这些信息。所以语音决策模型在某些场景下的表现甚至可以超过“ASR 文本分类”的组合。当然自监督表示也有它的弱点它不像 ASR 那样有明确的词边界信息所以对语言细节的建模比较模糊。如果用户说“帮我定后天下午三点的会议”模型容易混淆“后天”和“明天”因为这两个词在声学上没有特别强的区分信号。解决方案一般是加一个轻量的约束解码或者后处理校验把容易混淆的槽位做格外出处理。3.2 从语音表示直接映射到工具调用从技术架构看语音决策模型可以分成几个块编码器、投影层、决策解码器。编码器负责把变长的音频变成定长的语义向量投影层把语义向量映射到工具调用空间决策解码器负责把向量转成指令序列。工具调用的设计决定了整个系统的上限。如果一个系统只有三五个工具那本质上是多分类但如果要支持几十个工具、每个工具还有不同参数就需要模型具备组合泛化能力。组合泛化的意思是模型在训练时见过“播放音乐”和“设置闹钟”但没见过“播放闹钟”它必须学会把“播放动作”和“闹钟对象”组合到一起。这对模型架构有要求需要用一种类似“意图槽位分解”的建模方式。实际场景中我建议开发者在定义工具时不要贪多。先把最高频的五个工具做好保证模型输出稳定再逐步扩展。因为每增加一个工具就增加了输出空间的复杂度误触发的概率也会上升。这跟做菜单一样菜品越少出餐越稳。3.3 模型压缩经验量化、蒸馏和静音裁剪NeuDecide 能做到 43MB肯定经过了系统的压缩流程。第一层是结构压缩选择高效的卷积和注意力组合去掉冗余层第二层是量化把 FP32 变成 INT8第三层往往是蒸馏拿大模型当老师教小模型去模仿输出分布。量化这一步坑比较多。语音特征对精度其实还算宽容但如果你把注意力层的 softmax 也做粗糙量化模型的置信度会明显漂移。我在实际项目里常用的方案是混合量化卷积层做 INT8最后的分类头保留 FP16这样既能压缩体积又能保住决策精度。如果你在用现成模型做二次开发建议先检查它导出的 ONNX 或者 TFLite 文件里各层的精度配置。静音裁剪听起来简单做起来也有讲究。如果 VAD 把一整段含大量静音的音频丢给决策模型模型会花大量时间处理无意义帧还可能被静音影响预测结果。所以训练和推理时最好都做统一的静音裁剪策略前后静音最多保留 0.3 秒中间静音压缩到 0.5 秒以内。让模型看到的音频分布稳定决策自然更稳。3.4 训练数据到底要什么语音决策模型最关键的训练数据是“任务音频对”。你需要收集大量“用户说了一句什么话 → 应该调用什么工具、填什么参数”的真实数据。和 ASR 训练集不一样这里不要求文本转写反而要求一个结构化标签。这类数据的来源很零散。初期可以用众包平台让人录几万句目标场景指令中期从产品日志里脱敏提取真实用户音频后期就得靠合成数据扩充尤其是儿童语音、方言口音、噪声场景真实采集成本太高必须用声码器变声、加噪、变速等方式模拟。我的经验是数据一定要覆盖“坏例子”。你不能只录“正确指令”还得录“很像指令但语义不对”的音频比如孩子哼歌、父母在旁边聊天、电视里传来“打开洗衣机的台词”。模型如果没有见过这些负例上线后误触发率会高到让人崩溃。4. 上手实操把语音决策模型跑通的最低动作清单4.1 准备运行环境和依赖不管你是直接跑 NeuDecide 还是拿类似架构做二次开发环境准备都差不多。基础依赖是 Python 3.9 以上、PyTorch 或者 ONNX Runtime、音频处理库如 librosa 或 soundfile。如果跑嵌入式版本优先看有没有导出好的 ONNX、TFLite 或 RKNN 格式。建议先搭一个最简单的命令行测试脚本读入一个 wav 文件 → 预处理成模型输入 → 前向推理 → 打印输出结果。整个流程 5 分钟能跑通。再把麦克风实时流接进来这时候会引入 VAD、环形缓冲、异步推理复杂度才真正上来。我个人的习惯是先把离线样本测准率测到满意再上实时流。实时环境里问题很难排查分不清是 VAD 切错、模型预测错还是工具执行错。离线阶段把每一层都固定实时阶段才能快速定位新增变量。4.2 音频预处理的核心参数语音决策模型的预处理比 ASR 简单一些但参数要统一。采样率建议 16kHz单声道位深 16bit这是绝大多数语音模型的标配。重采样最好用高质量插值算法避免高频信息劣化。关于音频长度决策模型通常有最大输入帧数限制。我的建议是单位音频长度控制在 3 到 5 秒。如果 VAD 检测到一段 20 秒的连续说话不要整段丢进模型而是用滑窗切成多个片段分别预测再用投票或分数融合得到最终结果。这比硬截断要稳得多。特征层面如果用模型自带的特征提取一般不用额外做归一化但如果你是手工提取 Fbank要确认归一化方式和训练时一致。归一化不一致是导致“本地测试很好、换设备就完蛋”的头号原因。4.3 定义工具注册表并处理模型输出工具注册表是决策模型和业务逻辑之间的接口层。我推荐用 JSON Schema 来定义每个工具的输入输出参数。模型输出的原始结果一定要经过校验器不能直接拿去执行。比如“设置音量”这个工具音量参数必须在 0 到 100 之间模型输出 150 就属于非法要拦截。校验之后还要有置信度门槛。语音决策模型一般会输出每个工具的概率分布只有当最高概率超过阈值时才执行否则进入“拒绝”状态。阈值设多少要看你承受误触发和漏触发的代价儿童设备里误触发会打断游戏阈值可以调高工具类场景漏触发更讨厌阈值可以适当调低。我建议在输出层加一个“拒识”类。让模型学会对不属于任何工具的音频输出“无法决策”而不是强行选一个最接近的。这个类需要专门造负样本训练效果很值得。4.4 性能观测和踩坑记录上线前一定要用真实设备跑一遍全链路延迟。我说的真实设备是指最终的量产芯片不是开发板。开发板跑 50 毫秒量产芯片可能因为散热降频变成 200 毫秒这个差距不是算法能弥补的。我自己踩过的坑有几个。第一次是 VAD 延迟设置太短孩子停顿了一下就被判定为说话结束整句话只识别出一半决策模型完全懵了。后来我把静音容忍时间调到 800 毫秒情况明显改善。第二次是模型读了双声道音频导致特征尺寸错位报错信息还不明显排查半天才发现是音频通道数问题。最头疼的一次是误触发。设备放在客厅电视里放动画片角色说了句“开门”音箱居然真的触发了开锁工具。后来我加入了声纹和信噪比过滤凡是背景噪声过大的音频直接拒识误触发才压下来。这类场景靠模型本身挡不住必须配上工程防火墙。5. 案例拆解儿童无屏语音游戏音箱中的实时决策5.1 为什么儿童音箱选择“无屏”设计Mallow 的定位很有代表性专为儿童设计的无屏语音游戏音箱。没有屏幕这个决定乍看是反潮流的但仔细想非常合理。屏幕会吸引孩子全部的视觉注意力吞噬想象力和主动表达能力无屏迫使孩子必须开口说话、听声音、做判断交互核心从“看”变成“听和说”。从产品角度看无屏也规避了一个大问题内容审核。屏幕上的画面如果不合适家长会非常敏感语音内容相对抽象审核压力小很多。再加上无屏设备更省电、更低成本、更耐摔定位成儿童硬件简直再合适不过。但无屏也带来交互设计的挑战所有反馈必须依赖语音和音效。孩子说了一句话设备要么接话、要么发出声音效果、要么推动游戏分支。这对语音决策模型的实时性要求特别高因为孩子没有耐心去等。5.2 儿童语音识别到底难在哪里儿童语音和成年人语音差别非常大。声道短、基频高很多声学特征分布和成人数据完全不一样发音器官没发育完全说出来的词经常“含糊不清”成年人的 ASR 模型识别率会断崖下跌。另一个难点是词汇量受限但变化多端孩子会用“那个”“红色那个”“我要走这边”这种不完整表达语义不完整但意图强烈。儿童语音的语义理解还有一个独特之处孩子的话经常依赖当下场景。音箱正在讲一个小兔子过河的故事孩子说“我要走桥”这里的“桥”不来自任何预设命令词库而是来自故事上下文。模型如果只看音频本身很难知道“桥”指的是游戏里哪个分支。所以产品级方案往往会让决策模型接收一部分上下文特征把当前游戏状态作为额外输入。这个上下文融合的做法值得借鉴语音决策模型不是孤立存在的它最好和业务状态引擎联动。游戏当前分支、可选动作、历史轮次这些信息都可以作为特征拼接到决策模型的输入里。模型模糊的地方靠上下文兜底上下文缺失的地方靠模型理解。5.3 实时听音决策的游戏机制Mallow 的游戏逻辑本质上是一个“语音分支决策树”。孩子不断说话AI 不断把语音映射到游戏分支的节点上。比如故事里出现岔路口孩子说“左边”模型输出“选择左分支”游戏继续推进。这个结构很轻不需要孩子有阅读能力也不需要任何按钮。这种场景对模型的工具调用能力要求其实很高。孩子的表达五花八门“走左边”“左”“左边的小路”“我要去左边”全部要映射到同一个参数值“left”。模型必须在语义层面理解这些表达的相似性而不是依赖某一个关键词。这就要求训练数据里有足够多的同义表达变体。延迟控制也是重点。我前面说过儿童耐心极短如果说完话超过 500 毫秒还没反馈孩子就会重复一遍或者直接失去兴趣。500 毫秒听起来很长但算上麦克风采集、VAD 切分、推理、游戏引擎渲染留给模型的时间窗口其实不到 200 毫秒。所以这类产品对模型轻量化的需求是硬性的43MB 这个级别正好合适。5.4 儿童场景的隐私与安全防线儿童设备最重要的是隐私和内容安全。NeuDecide 这种本地决策模型天然有优势音频不需要上传到云端决策在设备端完成家长不用担心孩子的声音被收集。相比之下云端 ASR 方案光是“数据传到哪里”就讲不清楚产品信任度会打折。我建议做儿童语音产品的团队不管模型多大都要设计清晰的本地数据策略。第一原始音频默认不存储第二如需调试样本必须脱敏并设置自动过期第三设备要有一个物理开关彻底断开麦克风供电而非软件静音。这种硬件级开关在很多家长眼里比任何隐私协议都管用。内容安全上语音决策模型本身只能判断“说什么工具”没法判断“这个工具引出的内容是否健康”。所以产品侧还是要做一层内容库过滤“播放”工具可以执行但库里的内容必须经过人工审核。工具调用和安全策略要分开模型的职责是“决策”安全策略才是内容把关者。6. 落地实践中的常见问题与排查思路速查这部分我直接整理成表格都是实际项目里很容易踩到的场景对照着排查可以少走弯路。问题可能原因排查思路与建议模型频繁误触发负样本不足触发阈值过低增加“拒绝类”样本提高置信度门槛加入信噪比过滤和声纹校验整句话只识别一半VAD 静音判定太短把静音容忍时间调到 700-900 毫秒对儿童语音适当放宽语音识别对了但参数提取错误槽位提取头不够强上下文信息没利用加入业务上下文特征对易混淆槽位做规则校验扩充同义表达数据设备端推理延迟突然变大模型算子未优化CPU 频率不稳定尝试 ONNX Runtime 量化算子预热模型检查散热和降频策略换一个麦克风后准确率下降音频预处理不一致频响差异大统一归一化方式做麦克风校准验证重采样参数方言或口音环境下决策错误模型泛化能力不足采集目标方言数据做继续预训练用声学增强模拟音色变化模型输出结果解析失败解码约束不足输出乱码在解码端做有限状态约束输出前强制校验 JSON Schema加入重试机制还有一个容易被忽略的问题多轮对话中的指代。孩子上一轮说“我要红色的”下一轮直接说“那就它吧”这时候模型单独听“那就它吧”完全无法决策。解决方案是把上一轮的决策结果作为上下文特征拼到当前输入里做一个简单的指代消解。这个功能在语音决策模型里很适合用规则实现不一定需要模型掌握强大的推理能力。另外任何语音决策模型都不要直接暴露给恶意音频输入。攻击者可能用高频超声、反向语音去尝试规避检测涉及安全控制的功能必须加二次验证。谁都不想家里的门锁被一段电视音频打开。7. 最后分享几句个人的经验聊了这么多核心其实就一句话语音决策模型的价值不在于替代 ASR而在于把那些“只需要听个大概”的场景从重链路里解放出来。NeuDecide 的出现让更多人看到了这种可能Mallow 则证明了它在消费产品里能落地。如果你打算在自己的项目里尝试这类模型我有几条实在的建议。第一先用 10 个小时左右的领域真实音频做评估不要迷信任何人给出来的基准数字第二把 VAD 和端点检测做好很多语音项目不是死在模型上是死在“什么时候开始听”这种外圈问题上第三一定要给模型配一个置信度阀门和拒识类线上跑起来你会感谢这个设计第四小模型最怕的不是能力弱而是数据脏把数据清洗花的时间压过模型调参的时间效果会好得多。语音决策这个方向还很新工具调用能力的边界也没完全清晰但方向是对的。等到更多产品把“决策”而不是“识别”当成语音交互的核心我们离真正自然的人机对话就更近了一步。