Flutter三方库适配OpenHarmony【flutter_speech】— 持续语音识别与长录音 📅 发布时间:2026/7/11 17:32:10 👁️ 浏览次数: 前言欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.netflutter_speech默认配置的最大录音时长是60秒识别模式是短语音recognitionMode0。对于语音搜索、语音指令这类场景完全够用。但如果你要做语音笔记、会议记录、实时字幕这类需要长时间识别的功能就需要突破这个限制。今天我们来探讨如何基于flutter_speech的架构实现持续语音识别。一、maxAudioDuration 参数扩展1.1 当前限制constextraParam:Recordstring,Object{recognitionMode:0,// 短语音模式vadBegin:2000,vadEnd:3000,maxAudioDuration:60000// 60秒};短语音模式下VAD检测到静音就会自动停止。即使把maxAudioDuration设到很大用户一停顿就结束了。1.2 长语音模式要实现持续识别需要切换到长语音模式constextraParam:Recordstring,Object{recognitionMode:1,// 长语音模式vadBegin:5000,// 5秒等待开口vadEnd:5000,// 5秒静音才停maxAudioDuration:300000// 5分钟};参数短语音模式长语音模式说明recognitionMode01长语音不会因静音自动停止vadBegin20005000给用户更多思考时间vadEnd30005000允许更长的停顿maxAudioDuration600003000005分钟1.3 通过Dart层传递模式参数当前flutter_speech的Dart API不支持传递识别模式。可以扩展// 扩展后的Dart API建议改进Futurelisten({bool continuousfalse})_channel.invokeMethod(speech.listen,{continuous:continuous,});// 原生端接收参数casespeech.listen:constargscall.argsasRecordstring,Object|null;constcontinuousargs?.[continuous]asboolean??false;this.startListening(result,continuous);break;二、长时间语音识别的会话管理2.1 单次长会话最简单的方案——一个会话持续到用户手动停止startListening(recognitionMode1, maxAudioDuration300000) │ ├── onResult(你好, isLastfalse) ├── onResult(你好今天, isLastfalse) ├── (用户停顿5秒) ├── onResult(你好今天开会, isLastfalse) ├── ...持续识别... │ └── 用户点击Stop → finish(sessionId) → onResult(最终结果, isLasttrue)优点实现简单。缺点maxAudioDuration有上限超长会话可能被系统中断。2.2 分段续接方案更健壮的方案——将长会话拆分为多个短会话自动续接第1段startListening → 识别 → onComplete → 保存结果 ↓ 自动 第2段startListening → 识别 → onComplete → 拼接结果 ↓ 自动 第3段startListening → 识别 → onComplete → 拼接结果 ↓ ... 直到用户手动停止2.3 分段续接的实现// 原生端实现扩展方案privatecontinuousMode:booleanfalse;privateaccumulatedText:string;privatesetupContinuousListener():void{if(!this.asrEngine)return;constchannelthis.channel;constpluginthis;this.asrEngine.setListener({onResult(sessionId,result){constfullTextplugin.accumulatedTextresult.result;channel?.invokeMethod(speech.onSpeech,fullText);if(result.isLast){plugin.accumulatedTextfullText;if(plugin.continuousMode){// 自动开始下一段plugin.startNextSegment();}else{plugin.isListeningfalse;channel?.invokeMethod(speech.onRecognitionComplete,fullText);}}},onComplete(sessionId,eventMessage){if(plugin.continuousModeplugin.isListening){plugin.startNextSegment();}},onError(sessionId,errorCode,errorMessage){console.error(TAG,onError in continuous mode:${errorCode});if(plugin.continuousModeerrorCode5){// 无语音输入继续等待plugin.startNextSegment();}else{plugin.isListeningfalse;channel?.invokeMethod(speech.onError,errorCode);}},// ... onStart, onEvent});}privatestartNextSegment():void{try{constparamsthis.buildStartParams(true);this.asrEngine?.startListening(params);}catch(e){console.error(TAG,startNextSegment error:${JSON.stringify(e)});}}2.4 分段间的无缝衔接分段续接的最大挑战是衔接处的文本连贯性。两段之间可能会有重复或遗漏第1段结果今天的会议主要讨论 第2段结果讨论三个议题 拼接结果今天的会议主要讨论讨论三个议题 ← 讨论重复了解决方案简单拼接直接拼接接受少量重复最简单重叠检测检测两段结尾和开头的重叠部分去重标点分隔在每段结尾加标点符号分隔// 简单的重叠去重privatemergeSegments(prev:string,next:string):string{// 检查prev的结尾是否和next的开头重叠constmaxOverlapMath.min(prev.length,next.length,10);for(letimaxOverlap;i0;i--){if(prev.endsWith(next.substring(0,i))){returnprevnext.substring(i);}}returnprevnext;}三、自动重连与断点续识策略3.1 网络中断的处理在线识别模式下网络中断会导致识别失败。对于长时间识别需要自动重连onError(sessionId,errorCode,errorMessage){if(plugin.continuousMode){if(errorCode1||errorCode2){// 网络错误延迟重试console.warn(TAG,network error, retrying in 3 seconds...);setTimeout((){if(plugin.continuousModeplugin.isListening){plugin.startNextSegment();}},3000);return;}}// 其他错误正常处理plugin.isListeningfalse;channel?.invokeMethod(speech.onError,errorCode);}3.2 重连策略策略实现适用场景立即重试错误后立即startListening临时网络抖动延迟重试等待3秒后重试网络短暂中断指数退避1s→2s→4s→8s…网络持续不稳定放弃超过N次重试后停止网络完全不可用3.3 断点续识网络恢复后已经说过的话不会重新识别。需要在UI上提示用户// Dart层提示voidonNetworkRecovery(){_showSnackBar(网络已恢复请继续说话);// 之前的识别结果已保存在accumulatedText中}四、识别结果拼接与文本累积4.1 文本累积策略// Dart层的文本累积classContinuousRecognitionState{finalListStringsegments[];// 每段的最终结果StringcurrentSegment;// 当前段的实时结果StringgetfullText{finalcompletedsegments.join();returncompletedcurrentSegment;}voidonPartialResult(Stringtext){currentSegmenttext;}voidonSegmentComplete(Stringtext){segments.add(text);currentSegment;}}4.2 UI显示// 显示累积的完整文本Widgetbuild(BuildContextcontext){returnSingleChildScrollView(child:Text(recognitionState.fullText,style:TextStyle(fontSize:16),),);}4.3 文本格式化长文本识别需要考虑格式化StringformatRecognitionText(Stringraw){// 1. 添加标点如果识别结果没有标点// 2. 分段落// 3. 首字母大写英文returnraw;}Core Speech Kit的中文识别通常会自带标点所以格式化的工作量不大。但分段续接时段与段之间的标点可能需要手动处理。五、电量与性能消耗的权衡5.1 长时间识别的资源消耗资源短语音(10秒)长语音(5分钟)长语音(1小时)CPU低中高内存~20MB~25MB~30MB网络流量~320KB~9.6MB~115MB电量忽略不计可感知显著5.2 优化建议降低CPU消耗使用长语音模式而不是反复创建短会话避免在onResult回调中做复杂计算降低网络消耗考虑离线识别模式准确率会降低弱网环境下降级到离线降低电量消耗在用户不说话时暂停识别但这会增加延迟提供省电模式选项5.3 用户提示长时间识别应该在UI上提示用户资源消耗// 显示录音时长和预估消耗Text(已录制${duration.inMinutes}:${(duration.inSeconds % 60).toString().padLeft(2, 0)}),Text(预估流量${(duration.inSeconds*32/1024).toStringAsFixed(1)}MB),5.4 后台识别的限制OpenHarmony对后台音频采集有限制。如果App进入后台麦克风可能被系统回收overridevoiddidChangeAppLifecycleState(AppLifecycleStatestate){if(stateAppLifecycleState.paused){// App进入后台if(_isListening){_speech.stop();// 保存当前结果_showNotification(语音识别已暂停);}}elseif(stateAppLifecycleState.resumed){// App回到前台if(_wasContinuousListening){_speech.listen();// 恢复识别}}}六、实现方案对比方案复杂度最大时长文本连贯性推荐场景单次长会话低5分钟好语音笔记分段续接中无限制中等会议记录分段重叠去重高无限制好实时字幕对于大多数场景单次长会话recognitionMode1 较大的maxAudioDuration就够了。只有需要超过5分钟的场景才需要分段续接。总结本文探讨了基于flutter_speech实现持续语音识别的方案长语音模式recognitionMode1不会因静音自动停止分段续接多个短会话自动衔接突破时长限制自动重连网络中断后延迟重试保证识别连续性文本累积分段结果拼接处理重叠和格式化资源权衡长时间识别需要关注CPU、内存、网络、电量消耗下一篇我们讲语音识别结果的后处理——标点符号、文本格式化、纠错等话题。如果这篇文章对你有帮助欢迎点赞、收藏、关注你的支持是我持续创作的动力相关资源Core Speech Kit长语音识别VAD语音活动检测指数退避算法Flutter App生命周期flutter_speech OpenHarmony源码开源鸿蒙跨平台社区
vue+springboot校园综合服务系统的设计与实现 目录系统架构设计前端技术实现后端技术实现核心功能模块系统安全方案部署运维方案测试方案开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统架构设计 前端采用Vue.js框架,基于Element UI或Ant Design Vue组件库构… 2026/5/17 5:56:49
本科生收藏!千笔,备受推崇的AI论文平台 你是否曾为论文选题而烦恼?是否在深夜面对空白文档无从下笔?是否反复修改却总对表达不满意?论文写作不仅是知识的考验,更是时间和精力的挑战。对于专科生来说,时间有限、经验不足,更易陷入“写不出来”的困… 2026/7/9 20:25:16
vue+springboot校园学生健康监测数据管理系统的设计与实现 目录系统架构设计前端技术栈后端技术栈数据库设计核心功能实现安全防护措施性能优化方案测试与部署开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统架构设计 采用前后端分离架构,Vue.js 3.x作为前端框架&#x… 2026/7/4 14:56:14
TypeScriptCompiler编译器测试框架:自动化测试套件与错误检测机制终极指南 TypeScriptCompiler编译器测试框架:自动化测试套件与错误检测机制终极指南 【免费下载链接】TypeScriptCompiler TypeScript Compiler (by LLVM) 项目地址: https://gitcode.com/gh_mirrors/ty/TypeScriptCompiler TypeScriptCompiler是一个基于LLVM/MLIR构建… 2026/7/11 17:28:38
编程器固件 MAC 地址修复:3 种方法解决刷机后地址冲突与丢失 编程器固件 MAC 地址修复:3 种方法解决刷机后地址冲突与丢失当技术人员进行路由器硬改、救砖或批量刷机时,经常会遇到一个棘手的问题:刷写编程器固件后,设备的 MAC 地址出现重复或丢失。这不仅会导致网络冲突,还可能影… 2026/7/11 17:22:36
CANN稀疏矩阵GPU测试 gpu_test-ops-sparse 【免费下载链接】cann-ops-competitions 本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。 项目地址: https://gitcode.com/cann/cann-ops-competitions SDDMM / SpGEMM / SpSM 的 GPU 内部验证࿱… 2026/7/11 17:20:36
Vulnhub Lampiao靶机:3种不同路径的渗透测试思路对比与复盘 Lampiao靶机渗透测试:多路径思维与实战决策树1. 靶机环境与渗透测试方法论概述Lampiao是Vulnhub平台上经典的渗透测试靶机,模拟了运行Drupal 7.54内容管理系统的Ubuntu服务器。与常规的线性渗透流程不同,本次我们将采用多路径渗透思维&#x… 2026/7/11 17:20:36
网页在 Edge 浏览器滚动卡顿?从 Performance 录制到根治的完整优化全过程 网页在 Edge 浏览器滚动卡顿?从 Performance 录制到根治的完整优化全过程 前言 最近我的网站首页在 Edge 浏览器上滚动时严重掉帧,鼠标滚轮一顿一顿的,体验极差,但是在chrome浏览器上就没有这个问题。我百度了很久,搜到的文章基本都是泛泛而谈"减少 DOM 操作"… 2026/7/11 17:18:35
功能测试报告模板(最常用的OA办公系统为例) 本测试报告模板以通用办公系统为例,涵盖了从引言、测试概述到结论分析的完整结构。在实际工作中,测试报告是项目交付的关键文档,用于评估软件质量、指导缺陷修复和风险决策。在面试中,是否写过测试报告、测试报告包含哪些内容也会经常被问到,一份结构清晰、数据详实的测试… 2026/7/11 17:14:34
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/11 14:53:30
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/11 12:30:52
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/11 15:29:59