语音助手——指令型(任务型)助手架构和设计

本文详细介绍了指令型语音助手的工作原理和架构设计,包括基础语义理解、历史信息处理、意图识别、多轮对话管理、技能映射、结果执行等多个关键组件的功能。这种架构使得各组件独立,提升系统鲁棒性,支持模块化开发和升级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        这一章我们来一起看一下语音助手中,指令型(任务型)助手的整体架构和设计。

一、指令型助手的应用场景

        在这里,如果助手的作用是帮助用户实现某些操作,比如:语音定闹钟,语音听歌,语音导航等等,那么实现这一类任务的助手我们叫做指令型语音助手,即用户通过语音来下发某些指令,助手根据指令进行操作,从而实现解放双手,快捷操作的目的,比如下面的几个例子:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAVHVybmVkX01a,size_20,color_FFFFFF,t_70,g_se,x_16       watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAVHVybmVkX01a,size_20,color_FFFFFF,t_70,g_se,x_16    watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAVHVybmVkX01a,size_20,color_FFFFFF,t_70,g_se,x_16

二、指令型助手架构和设计

        我们在前面章节《语音助手整体架构和设计》中有讲到,指令型助手中各个垂类作为BOT的形式存在,BOT内自成一个小周天,各个模块皆具备,如下图则为一个BOT的整体架构和设计:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAVHVybmVkX01a,size_20,color_FFFFFF,t_70,g_se,x_16

         如上图,在BOT中存在各个worker,分别负责处理不同的任务,worker之间不直接通信,而是通过DataBus来进行数据传递,因此,worker与worker之间是完全相互独立的,只需要满足DataBus中的接口定义,即可实现数据传递,这样的设计,可以使worker可以独立迭代,分模块开发。

        下面来分开看下各个worker的作用:

1、基础语义理解

        这里的基础语义理解,指的是对于输入query的一些基本处理,比如NER、句法分析、分词、场景分类,纠错等等,这一步一般由外部的DM中公共模块处理,传入到BOT中。

2、history_session_worker

        此worker主要用于处理历史信息,包括获取全局对话历史信息,该BOT相关历史信息等,一般如果是开放式多轮,则需要全局对话历史信息,如果是封闭式多轮,则一般需要该BOT相关历史信息。

3、qu_worker(BOT内)

        此worker和外部DM中的qu模块有区别,外部的qu模块用于处理基础语义理解,其识别的内容会无差别的共享给各个激活的BOT,而BOT内部的qu_worker则专门处理该worker特有的qu信息(如果需要的话),举个例子,如果有个针对闹钟场景的query改写,则在这里生效。

4、scene_identify_worker

        此worker一般是多分类或者二分类,我们之前说过,每个BOT需要具备“识别进入的query是否属于该BOT”的能力,因此该worker主要实现的功能为排除掉不属于该场景的query,DM中的场景分类模型重召回,因此对于部分BOT间模糊的话术会误召回,此时该worker中的分类则需要重准确,能够提高准确率。当然,除了这个功能外,也可以实现为多分类,为下方的worker提供信息。

5、intent_entity_worker

        此worker主要用于识别意图,提取槽位,其内部实现可以根据BOT类型来实现,一般来说有几种:模板、模型(意图槽位模型)、模板+模型、语义角色标注等等。

6、context_association_worker

        此worker用于实现多轮会话的能力,一般包含:封闭式多轮即槽位询问,开放式多轮即语义顺承、省略补全、指代消解,脚本式多轮。

7、NLU_postprocess_worker

        此worker用于对语义内容进行后处理。 此worker之前(包含此worker)的内容,我们都划分为语义层,即这里识别的内容都为纯语义的结果,即query本身具备的语义。 区别与下方的技能层,有时根据产品需求,需要将部分语义执行特殊的技能,比如:query:“搜索洗面奶”,该query的语义为“搜索物品”,如果此时物品为商品,则需要执行购物技能。如果直接将该query划分给购物的语义,和“在淘宝中购买洗面奶”同等处理的话,则可能造成该BOT的误召回。

        因此,将query根据语义进行划分,每种不同类型的语义可以分别迭代效果,以及根据不同语义针对性的进行一些处理,比如上面的例子,如果query为“搜索xxx”,则需要结合知识图谱判断“xxx”是否为商品,如果是商品则走购物,否则走百科; 如果query为“在淘宝中购买xxx”,则不管“xxx”是什么,都需要走购物。

        该worker中,一般实现实体消歧、实体校验等语义层面的后处理。

8、skill_worker

        这里进入了技能层的第一个worker,即将语义结果映射为技能,这里一般会维护一个映射表,映射语义-技能。

9、skill_rank_worker

        这里实现BOT内不同skill之间的排序,举个例子,在地图BOT内,query:“xxx在哪”,此语义会映射为两个技能:1、“在地图中搜索xxx”。2、“出百科卡片显示xxx的介绍”。这两个技能会根据"xxx"的类型进行排序,如果“xxx”为景点,则出技能2,如果“xxx”为普通地点,则出技能1。 

10、skill_postprocess_worker

        这里实现对于skill的后处理,比如query:“今天天气怎么样”,在识别到语义并映射为“查询天气”技能后,可以在此worker中访问天气服务器,获取天气信息,封装为卡片的形式,下发给客户端。

11、nlg_worker

        这一步一般用于生成nlg话术,在技能型BOT中,一般nlg都是基于模板配置的,根据slot、intent以及context信息,不同的组合生成不同的回复话术。在闲聊BOT或者问答BOT中,此worker可以替换为生成模型或者检索模型来生成回复。

        一般推荐内容也在这里获取,比如:query:“今天天气怎么样”,获取推荐内容:“明天呢”、”今天适合穿什么“等

12、execution_worker

        这里主要用于最终的结果封装,封装为结构化的数据,返回给外部的DM。

三、写在后面

        上述的架构形式,可以实现将BOT内各个环节细化、分解,各个worker之间相互独立,可以由不同的负责人独立负责开发、升级。同时BOT与BOT之间也相互独立,可以独立升级,个别worker或者BOT错误,不一定会影响全局的结果(注意这里是”不一定“,即在一定程度上提升了系统的鲁棒性,但是可能会导致最终结果不是最优的)。

        由于各个worker之间相互独立,只通过data_bus进行通信,因此理论上可以设计为通过RPC或者http的形式通信,这样就可以真正实现worker的独立升级。但是这样会增加网络开销,可能导致系统性能降低。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### 使用C语言设计智能语音模仿人生的玩具 #### 1. 需求分析 为了构建一个能够模拟人类对话的智能语音玩具,首先需要明确该设备的功能需求。这通常包括但不限于:接收音频输入、识别语音命令、处理自然语言理解(NLU),以及通过合成语音输出响应。 #### 2. 技术选 由于项目涉及复杂的信号处理机器学习算法,而这些并非传统上由C语言主导的应用领域;然而,在嵌入式系统开发方面,C语言因其高效性底层硬件控制能力仍然占据重要地位。因此,建议采用混合架构——即核心部分用C编写以确保性能最优,而对于高级功能则借助外部API或预训练模完成[^1]。 #### 3. 软件框架搭建 考虑到资源有限的小装置可能无法运行完整的深度神经网络或其他大ML库,可以选择轻量级解决方案如TensorFlow Lite Micro 或者MicroSpeech等专门为微控制器优化过的工具包来进行简单的关键词检测任务。与此同时,利用云端服务(比如Google Cloud Speech-to-Text API)来增强本地计算能力不足之处也是一个不错的选择[^3]。 #### 4. 编程实践指南 以下是基于上述思路的一个简化版实现流程: ```c #include <stdio.h> // 假设已经包含了必要的头文件用于麦克风数据采集、网络请求发送等功能... int main() { char userInputBuffer[MAX_LENGTH]; // 存储用户说的话 while (true) { // 主循环等待指令 printf("Listening...\n"); /* Step 1: Capture audio input */ captureAudio(userInputBuffer); /* Step 2: Send captured data to cloud service for transcription */ sendToCloudService(userInputBuffer, &transcribedText); /* Step 3: Process transcribed text with local NLP module or another call to a web API */ processCommand(transcribedText); /* Step 4: Generate response based on processed command and play it back via speaker */ generateResponseAndPlay(); sleep(INTERVAL_BETWEEN_LISTENS); // 设置监听间隔时间 } } ``` 此代码片段展示了如何在一个无限循环内持续监听用户的语音输入,并将其转换成文字形式再做进一步解析。实际应用场景下还需要考虑更多细节问题,例如错误处理机制的设计、安全性保障措施等等。 #### 5. 测试与迭代改进 最后阶段应该集中精力于产品的测试环节,收集反馈意见并对现有版本做出针对性调整直至达到预期效果为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值