黑马点评项目扩展:为本地生活平台添加语音搜索与语音下单功能
黑马点评项目扩展为本地生活平台添加语音搜索与语音下单功能想象一下这个场景你正忙着做饭手上沾满了面粉突然想点一份附近评分最高的披萨。这时候你只需要对着手机说一句“帮我找找附近好吃的披萨店”屏幕上立刻就会出现推荐列表。接着你浏览了一下选中一家直接说“我要一份12寸的夏威夷披萨外送到家”订单就自动生成了。这听起来像是科幻电影里的情节但现在通过为“黑马点评”这类本地生活平台集成语音交互能力我们可以轻松实现它。今天我们就来聊聊如何为你的项目添上“耳朵”和“嘴巴”让用户动动嘴皮子就能完成搜索和下单。1. 为什么本地生活需要语音交互在深入技术细节之前我们先看看语音交互能解决什么实际问题。对于用户来说最直接的感受就是方便。很多使用场景下用户的手并不空闲——可能在开车、做饭、做家务或者干脆就是懒得打字。语音是最自然的交互方式之一它能极大地降低使用门槛尤其是对不擅长打字的老年用户或者追求效率的年轻用户。从平台运营的角度看语音交互能带来更丰富的用户行为数据。传统的点击和文字输入数据相对单一而语音请求包含了语调、语速、自然语言习惯等信息这些数据对于优化搜索算法、理解用户真实意图非常有价值。它能让你更懂用户“想要什么”而不仅仅是他们“点击了什么”。更重要的是语音功能能显著提升用户体验的流畅度。从“想”到“说”再到“得到结果”这个路径比“想”到“打字”再到“得到结果”更短、更直接。流畅的体验是留住用户、提高转化率的关键。2. 整体方案设计让语音“听懂”业务为“黑马点评”添加语音功能核心目标是将用户的语音指令无缝转换成对现有后端API的调用。整个流程可以概括为“听、懂、做”三个步骤。“听”指的是语音识别ASR。我们需要一个服务能把用户说出的音频流实时、准确地转换成文字。这里我们选择集成Qwen3-ASR-0.6B服务。它是一个开源的、轻量级的语音识别模型在中文场景下表现不错而且对部署资源要求相对友好非常适合集成到现有项目中。“懂”指的是自然语言理解NLU。识别出的文字只是一串字符我们需要理解用户的意图。比如“附近有什么好吃的川菜”这句话意图是“搜索商家”关键信息是“附近”地理位置、“好吃的”排序/评分、“川菜”品类。我们需要从中提取出这些结构化信息。“做”指的是业务执行。根据理解出的意图和关键信息去调用对应的后端接口。例如对于搜索意图就调用商家的搜索接口对于下单意图就调用创建订单的接口。整个架构可以这样设计在移动端App中增加语音按钮用户点击后录音录音文件或流被发送到后端一个新增的“语音网关”服务。这个网关服务首先调用Qwen3-ASR-0.6B进行语音转文字然后通过一个简单的规则引擎或意图识别模块初期可以用关键词匹配后期可升级为更智能的模型来解析文字最后组装参数调用原有的“黑马点评”业务接口如/shop/search,/order/create并将结果返回给前端。这样做的好处是对原有业务代码的侵入性最小。我们相当于在现有系统前面加了一个“翻译层”把语音翻译成HTTP请求。3. 分步实现从语音到订单理论说完了我们来看看具体怎么一步步把它做出来。我会假设你已经有了一套基础的“黑马点评”后端和前端。3.1 第一步搭建并集成语音识别服务首先我们需要让系统能“听见”。Qwen3-ASR-0.6B通常以HTTP API或gRPC服务的形式提供。你可以选择在服务器上直接部署它的Docker镜像或者使用一些云服务提供的类似能力。假设我们通过Docker在本地部署# 拉取镜像请根据官方文档获取最新镜像名 docker pull qwen-3-asr-0.6b:latest # 运行服务暴露端口 docker run -d -p 8080:8080 --name qwen-asr qwen-3-asr-0.6b:latest服务启动后通常会提供一个/v1/audio/transcriptions之类的API端点。接下来我们在后端项目比如Spring Boot中创建一个新的服务类VoiceRecognitionService来调用它。Service Slf4j public class VoiceRecognitionService { Value(${asr.service.url}) private String asrServiceUrl; private final RestTemplate restTemplate; public VoiceRecognitionService(RestTemplateBuilder restTemplateBuilder) { this.restTemplate restTemplateBuilder.build(); } /** * 将语音文件转换为文字 * param audioFile 用户上传的语音文件如MP3, WAV * return 识别出的文字 */ public String transcribe(MultipartFile audioFile) { try { // 1. 构建请求体通常ASR服务需要特定的格式 HttpHeaders headers new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMapString, Object body new LinkedMultiValueMap(); body.add(file, audioFile.getResource()); // 可能还需要添加其他参数如language, model等 // body.add(model, qwen3-asr-0.6b); HttpEntityMultiValueMapString, Object requestEntity new HttpEntity(body, headers); // 2. 发送请求到ASR服务 // 假设ASR服务返回一个JSON其中包含text字段 ResponseEntityMap response restTemplate.postForEntity(asrServiceUrl, requestEntity, Map.class); if (response.getStatusCode().is2xxSuccessful() response.getBody() ! null) { return (String) response.getBody().get(text); } else { log.error(ASR服务调用失败状态码: {}, response.getStatusCode()); throw new RuntimeException(语音识别服务暂时不可用); } } catch (Exception e) { log.error(语音识别过程发生异常, e); throw new RuntimeException(语音识别失败请重试); } } }这样我们就有了一个基础的工具能把用户发来的语音变成文字。3.2 第二步理解用户意图提取关键信息拿到文字后就要理解用户想干什么。在项目初期我们可以用一个简单但有效的规则匹配方法来实现意图识别。我们创建一个IntentParser类Component public class IntentParser { private static final MapString, String SEARCH_KEYWORDS Map.of( 找, SEARCH, 搜索, SEARCH, 附近, SEARCH, 推荐, SEARCH, 有什么, SEARCH ); private static final MapString, String ORDER_KEYWORDS Map.of( 点, ORDER, 要, ORDER, 下单, ORDER, 来一份, ORDER, 订, ORDER ); /** * 解析用户语音文本的意图 * param text 语音识别后的文本 * return 解析结果包含意图和参数 */ public IntentResult parse(String text) { IntentResult result new IntentResult(); result.setOriginalText(text); text text.toLowerCase(); // 转为小写方便匹配 // 1. 判断意图 if (containsAny(text, SEARCH_KEYWORDS.keySet())) { result.setIntent(SEARCH_SHOP); } else if (containsAny(text, ORDER_KEYWORDS.keySet())) { result.setIntent(CREATE_ORDER); } else { result.setIntent(UNKNOWN); return result; } // 2. 提取关键参数这里用非常简单的正则示例实际可更复杂或引入NLP工具 // 提取可能的菜品或店铺名简易版提取引号内容或特定模式 extractDishOrShopName(text, result); // 提取可能的数量 extractQuantity(text, result); // 提取可能的品类如“川菜” extractCategory(text, result); return result; } private boolean containsAny(String text, SetString keywords) { return keywords.stream().anyMatch(text::contains); } private void extractDishOrShopName(String text, IntentResult result) { // 简单逻辑匹配“一份XXX”或“XXX外卖”中的XXX java.util.regex.Pattern pattern java.util.regex.Pattern.compile((一份|来个|点个)?([\\u4e00-\\u9fa5a-zA-Z]{2,10})(外卖|套餐)?); java.util.regex.Matcher matcher pattern.matcher(text); if (matcher.find()) { result.setTargetName(matcher.group(2)); } } // ... 其他提取方法如 extractQuantity, extractCategory } Data class IntentResult { private String originalText; private String intent; // SEARCH_SHOP, CREATE_ORDER, UNKNOWN private String targetName; // 商品名或店铺名 private Integer quantity; // 数量 private String category; // 品类 // 其他参数... }这个解析器虽然简单但已经能处理很多常见句式了比如“我要一份宫保鸡丁”或“附近有什么川菜”。对于更复杂的句子后期可以考虑集成像Rasa、Dialogflow这样的对话框架或者微调一个小的文本分类模型。3.3 第三步组装并调用业务接口理解了用户意图最后一步就是“干活”。我们需要一个“语音网关”控制器作为所有语音请求的入口。RestController RequestMapping(/voice) Slf4j public class VoiceGatewayController { private final VoiceRecognitionService asrService; private final IntentParser intentParser; private final ShopService shopService; // 原有的店铺服务 private final OrderService orderService; // 原有的订单服务 PostMapping(/command) public ApiResult handleVoiceCommand(RequestParam(audio) MultipartFile audioFile, RequestParam(value userId) Long userId, RequestParam(value location, required false) String location) { try { // 1. 语音转文字 String text asrService.transcribe(audioFile); log.info(用户[{}]语音识别结果: {}, userId, text); // 2. 解析意图 IntentResult intentResult intentParser.parse(text); if (UNKNOWN.equals(intentResult.getIntent())) { return ApiResult.fail(抱歉我没有理解您的指令请再说一遍。); } // 3. 根据意图调用不同业务 Object data null; switch (intentResult.getIntent()) { case SEARCH_SHOP: // 组装搜索参数调用原有搜索接口 ShopSearchQuery query new ShopSearchQuery(); query.setName(intentResult.getTargetName()); query.setCategory(intentResult.getCategory()); query.setLocation(location); // 使用前端传递或获取的用户位置 query.setSortBy(rating); // 默认按评分排序符合“好吃的”语义 data shopService.searchShops(query); break; case CREATE_ORDER: // 组装订单参数这里需要更复杂的逻辑如确认商品详情、价格等 // 假设通过商品名找到了商品ID Long itemId findItemIdByName(intentResult.getTargetName()); if (itemId null) { return ApiResult.fail(未找到商品: intentResult.getTargetName()); } OrderSubmitDTO orderDTO new OrderSubmitDTO(); orderDTO.setUserId(userId); orderDTO.setItemId(itemId); orderDTO.setQuantity(intentResult.getQuantity() ! null ? intentResult.getQuantity() : 1); data orderService.createOrder(orderDTO); break; default: return ApiResult.fail(暂不支持该功能); } return ApiResult.ok(data); } catch (Exception e) { log.error(处理语音命令失败, e); return ApiResult.fail(语音处理失败请稍后重试); } } private Long findItemIdByName(String itemName) { // 这里实现根据商品名查找商品ID的逻辑可能调用商品服务 // 简化返回一个模拟ID return 12345L; } }前端的工作就相对清晰了在界面上添加一个醒目的语音按钮调用手机的录音API录制音频后连同用户ID、地理位置等信息一起POST到/voice/command这个接口。4. 实际效果与优化思考按照上面的步骤实现后一个基本的语音搜索和下单流程就跑通了。用户点击说话说完松手结果几乎在瞬间就展示出来。这种体验相比传统的打字搜索尤其是在移动场景下优势非常明显。不过这只是第一步。要让这个功能真正好用还有很多可以优化的地方意图识别的准确性初期的关键词匹配会遇到歧义问题。比如“我想找一家能点外卖的店”既有“找”搜索又有“点”下单。这就需要更精细的意图识别模型或者引入对话状态管理通过多轮对话来澄清用户意图。参数提取的鲁棒性用户不会总说“宫保鸡丁”可能会说“那个有点甜的、带花生的鸡肉”。这就需要商品名称的模糊匹配甚至结合用户历史订单来猜测。确认与反馈机制语音交互缺乏视觉上的“确认感”。在创建订单这种关键操作前最好能通过TTS文本转语音或者界面弹窗向用户复述一遍订单信息比如“确认要下单一份宫保鸡丁总计38元吗”用户回答“确认”后再执行。错误处理与引导当识别失败或意图不明时应该给出友好的引导提示比如“您是想找店铺还是想点餐呢”而不是直接报错。从技术演进角度看后期可以将Qwen3-ASR-0.6B与一个轻量级的NLP模型比如同样来自Qwen系列的对话模型结合构建一个端到端的语音对话系统不仅能处理单次指令还能进行多轮、复杂的订餐对话。5. 总结给“黑马点评”加上语音搜索和下单功能听起来是个挺大的工程但拆解下来核心就是三步把声音变成文字把文字变成意图把意图变成API调用。我们这次用Qwen3-ASR-0.6B和简单的规则引擎做了一个入门级的实现已经能让应用体验提升一个档次。这个功能的魅力在于它用一种更自然的方式连接了用户和平台。技术在这里扮演的不是炫技的角色而是默默润色体验的工匠。当你看到用户因为省去了打字的麻烦而更频繁地使用你的应用时这种投入就是值得的。如果你正在做类似的项目不妨从一个小功能点开始尝试比如先只做语音搜索看看用户的反馈再逐步迭代和完善。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻

如何让Qwen2.5更快?vLLM批处理优化部署详细步骤

如何让Qwen2.5更快?vLLM批处理优化部署详细步骤

如何让Qwen2.5更快?vLLM批处理优化部署详细步骤 通义千问2.5-7B-Instruct,这个来自阿里的70亿参数模型,最近在开发者圈子里热度很高。它能力全面,支持128K超长上下文,代码和数学能力都很能打,而且对商用友…

2026/7/4 14:52:27 阅读更多 →
Qwen3-Reranker-0.6B在Ubuntu系统上的快速部署指南

Qwen3-Reranker-0.6B在Ubuntu系统上的快速部署指南

Qwen3-Reranker-0.6B在Ubuntu系统上的快速部署指南 用10分钟让你的Ubuntu系统跑起来自阿里通义实验室的轻量级重排序模型 如果你正在搭建企业级检索系统或者构建智能知识库,肯定遇到过这样的问题:检索出来的结果很多,但真正相关的却没几个。这…

2026/7/6 15:35:22 阅读更多 →
YOLO12效果展示:YOLO12对模糊运动物体(奔跑人物)检测稳定性

YOLO12效果展示:YOLO12对模糊运动物体(奔跑人物)检测稳定性

YOLO12效果展示:YOLO12对模糊运动物体(奔跑人物)检测稳定性 1. 引言:当AI遇见运动模糊的挑战 在目标检测的实际应用中,最让人头疼的场景之一就是拍摄快速移动的物体。想象一下监控摄像头中奔跑的行人、体育赛事中高速…

2026/7/7 0:58:41 阅读更多 →

最新新闻

127.TwinCAT/CODESYS 通用!四相位交通灯控制系统标准化源码

127.TwinCAT/CODESYS 通用!四相位交通灯控制系统标准化源码

摘要 可编程逻辑控制器(PLC)是工业自动化系统的核心执行单元。本文从底层原理出发,系统梳理PLC的工作机制、扫描周期、I/O映射与编程范式,并以IEC 61131-3标准中的结构化文本(ST)语言为主线,提供一套从环境搭建到完整项目落地的全流程指南。文章包含一个可直接在CODESY…

2026/7/7 10:48:52 阅读更多 →
EM3080-W与PIC18F2610的条码识别系统设计

EM3080-W与PIC18F2610的条码识别系统设计

1. EM3080-W与PIC18F2610的硬件协同设计条形码识别系统的核心在于解码芯片与微控制器的完美配合。EM3080-W作为专业级解码芯片,其内部采用双核DSP架构,主核负责图像采集与预处理,工作频率高达120MHz,能够实时处理1280800分辨率的图…

2026/7/7 10:46:51 阅读更多 →
暗黑3智能按键助手D3KeyHelper:解放双手的游戏自动化神器

暗黑3智能按键助手D3KeyHelper:解放双手的游戏自动化神器

暗黑3智能按键助手D3KeyHelper:解放双手的游戏自动化神器 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 厌倦了在暗黑破坏神3中重复点击…

2026/7/7 10:46:51 阅读更多 →
基于Cortex构建自动化文件分析框架:以IndexTTS 2.0漏洞检测为例

基于Cortex构建自动化文件分析框架:以IndexTTS 2.0漏洞检测为例

1. 项目概述:为什么我们需要自动化分析可疑文件?最近在安全分析工作中,我遇到了一个挺有意思的挑战。团队里负责威胁情报的同事丢过来一批可疑文件,说怀疑是针对某个特定开源项目——IndexTTS 2.0的漏洞利用样本。IndexTTS 2.0是一…

2026/7/7 10:44:51 阅读更多 →
GraphQL 订阅驱动链上事件流:WebSocket 重连、去重与断线补偿策略

GraphQL 订阅驱动链上事件流:WebSocket 重连、去重与断线补偿策略

GraphQL 订阅驱动链上事件流:WebSocket 重连、去重与断线补偿策略 一、链上事件不能靠轮询维持 典型的 DApp 后端获取链上事件的做法是轮询:每 N 秒调用 eth_getLogs 或 getProgramAccounts,把新事件写入数据库,然后通知前端。这种…

2026/7/7 10:40:50 阅读更多 →
【电动机】等效电路建模对三相感应电动机Matlab仿真

【电动机】等效电路建模对三相感应电动机Matlab仿真

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、算法改进、程序设计科研仿真。🍎完整代码获取 定制创新 论文复现私信🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、…

2026/7/7 10:38:49 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻