Flutter三方库适配OpenHarmony【flutter_speech】— 项目概述与适配背景
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net作为一个写了五六年Flutter的老开发,我见证了这个框架从"能用"到"好用"的整个过程。最近这大半年,身边越来越多做鸿蒙的朋友开始问我:"你那些Flutter插件能不能跑在OpenHarmony上?"说实话,一开始我也没底。直到我真正动手去做了flutter_speech这个插件的适配,
前言
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
作为一个写了五六年Flutter的老开发,我见证了这个框架从"能用"到"好用"的整个过程。最近这大半年,身边越来越多做鸿蒙的朋友开始问我:"你那些Flutter插件能不能跑在OpenHarmony上?"说实话,一开始我也没底。直到我真正动手去做了flutter_speech这个插件的适配,才发现这事儿虽然有不少坑,但整体思路其实是通的。
为什么选flutter_speech?原因很简单——语音识别是刚需。不管是做智能家居、车载应用还是无障碍功能,语音交互都是绕不开的话题。而flutter_speech这个插件虽然不算特别热门,但胜在代码结构清晰、架构设计合理,非常适合拿来做适配的"样板工程"。
这个系列我打算写30篇,从环境搭建一路写到生产部署,把我踩过的每一个坑都记录下来。今天是第一篇,先聊聊项目背景和整体规划,让大家心里有个数。
💡 写在前面:本系列所有代码均基于实际项目,Flutter-OHOS SDK版本为3.35.7-dev,OpenHarmony API版本为20。如果你用的版本不同,部分细节可能有差异。
一、flutter_speech 插件简介
1.1 功能定位与应用场景
flutter_speech(包名flutter_speech)是一个跨平台语音识别Flutter插件,最早由jaumard开发,后来社区陆续贡献了macOS支持等功能。
它的核心能力其实就四个字:语音转文字。具体来说:
- 实时语音识别:用户说话的同时就能看到文字输出,体验很流畅
- 多语言支持:中文、英文、法文、俄文、意大利文、西班牙文,覆盖了主流语种
- 权限自动管理:麦克风权限的申请和状态检测都封装好了,开发者不用操心
- 完整的状态回调:从开始识别到结束,每个阶段都有对应的回调
我在实际项目中用过这个插件做过一个会议记录App,效果还不错。当然,识别准确率主要取决于底层引擎,插件本身只是做了一层封装。
1.2 项目基本信息
先看一下pubspec.yaml里的关键配置:
name: flutter_speech
description: Flutter plugin to support voice recognition on Android, iOS and Mac OSX
version: 2.0.1
homepage: https://github.com/jaumard/flutter_speech_recognition
environment:
sdk: '>=3.0.0 <4.0.0'
flutter: '>=3.0.0'
| 字段 | 值 | 说明 |
|---|---|---|
| name | flutter_speech | 包名,Dart代码中import用的就是这个 |
| version | 2.0.1 | 当前版本,已经迁移到null safety |
| sdk | >=3.0.0 <4.0.0 | Dart SDK版本约束 |
| flutter | >=3.0.0 | Flutter SDK最低版本 |
📌 注意:这个插件的版本号是2.0.1,说明经历过一次大版本升级(从1.x到2.x),主要是为了适配null safety。如果你的项目还在用Dart 2.x,需要用旧版本。
1.3 技术架构概览
下图展示了项目的目录结构:
图:flutter_speech插件整体架构
整个插件的架构其实不复杂,经典的三层结构:
┌─────────────────────────────────────────┐
│ Dart Layer (flutter_speech.dart)│
│ SpeechRecognition 单例 + MethodChannel │
├─────────────────────────────────────────┤
│ Platform Channel │
│ com.flutter.speech_recognition │
├──────┬──────┬──────┬────────────────────┤
│Android│ iOS │macOS │ OpenHarmony │
│Speech │SFSpe │SFSpe │ Core Speech │
│Recog │echRe │echRe │ Kit │
│nizer │cogni │cogni │ │
│ │zer │zer │ │
└──────┴──────┴──────┴────────────────────┘
| 层级 | 技术栈 | 核心职责 | 我的理解 |
|---|---|---|---|
| Dart层 | Flutter SDK | 统一API接口 | 开发者直接打交道的层面,越简单越好 |
| Channel层 | MethodChannel | 跨平台消息桥梁 | 性能瓶颈往往在这里,序列化开销不可忽视 |
| 原生层 | 各平台SDK | 实际语音识别 | 每个平台都不一样,适配工作量最大 |
说实话,我第一次看这个架构的时候觉得"就这?",但真正动手适配才发现,魔鬼都在细节里。
1.4 核心API一览
Dart层的API设计得很克制,一共就这么几个方法:
class SpeechRecognition {
// 单例模式
static final SpeechRecognition _speech = new SpeechRecognition._internal();
factory SpeechRecognition() => _speech;
// 核心方法
Future activate(String locale); // 激活引擎,传入语言代码
Future listen(); // 开始监听
Future cancel(); // 取消识别
Future stop(); // 停止识别
// 回调设置
void setAvailabilityHandler(AvailabilityHandler handler);
void setRecognitionResultHandler(StringResultHandler handler);
void setRecognitionStartedHandler(VoidCallback handler);
void setRecognitionCompleteHandler(StringResultHandler handler);
void setErrorHandler(VoidCallback handler);
}
这个设计有几个值得学习的地方:
- 单例模式:语音识别引擎全局只需要一个实例,避免资源浪费
- 方法命名清晰:activate、listen、cancel、stop,一看就知道干什么
- 回调分离:不同事件用不同的handler,不会混在一起
二、OpenHarmony 生态现状与 Flutter 适配意义
2.1 OpenHarmony 发展概况
坦白讲,一年前我对OpenHarmony还是持观望态度的。但最近半年的变化确实让人刮目相看。
根据我在社区里收集到的信息:
- 设备覆盖面越来越广:手机、平板、智慧屏、车载、IoT设备,基本上主流品类都有了
- API迭代速度很快:从API 9到API 20,每个版本都有不少新能力。特别是API 20之后,多媒体和AI相关的Kit功能丰富了很多
- 开发者社区在快速增长:我们Flutter-OHOS的交流群半年前才几十人,现在已经好几千了
📊 一个有意思的数据:我统计了一下pub.dev上标记支持ohos平台的Flutter插件,从年初的不到50个增长到现在的200多个。虽然和Android/iOS比还差得远,但增速很可观。
2.2 为什么要在OpenHarmony上跑Flutter
这个问题我被问过很多次,我的回答一般是三个字:省钱省力。
- 开发效率:一套Dart代码跑四个平台(Android、iOS、macOS、OpenHarmony),团队不需要养四拨人
- 生态复用:pub.dev上两万多个插件,理论上都可以适配到OpenHarmony。每适配一个,整个社区都受益
- 学习成本低:会Flutter的开发者不需要从头学ArkTS,只需要了解平台差异就行
当然,我也不会回避问题:Flutter-OHOS目前还不够成熟。工具链偶尔会抽风,调试体验比Android差不少,有些Flutter特性在OpenHarmony上还没完全支持。但这些都在快速改善中。
2.3 语音识别在鸿蒙生态中的位置
华为的"1+8+N"战略里,语音交互是非常核心的一环:
- 智能家居场景:对着智慧屏说"打开空调",这背后就是语音识别在工作
- 车载场景:开车时用语音控制导航、打电话,安全又方便
- 无障碍功能:视障用户通过语音操作手机,这是刚需中的刚需
OpenHarmony提供了Core Speech Kit来支持语音识别,虽然目前只支持中文,但基本的识别能力已经具备了。我们要做的,就是把这个能力通过Flutter插件暴露给更多开发者。
三、插件支持的平台概览
3.1 多平台支持现状
看一下pubspec.yaml里的平台配置:
flutter:
plugin:
platforms:
ios:
pluginClass: FlutterSpeechRecognitionPlugin
macos:
pluginClass: FlutterSpeechRecognitionPlugin
android:
package: com.flutter.speech_recognition.flutter_speech
pluginClass: FlutterSpeechRecognitionPlugin
ohos:
package: com.flutter.speech_recognition.flutter_speech
pluginClass: FlutterSpeechPlugin
| 平台 | 支持状态 | 最低版本 | 底层引擎 | 特殊要求 |
|---|---|---|---|---|
| Android | ✅ 完全支持 | 4.1+ | SpeechRecognizer | RECORD_AUDIO权限 |
| iOS | ✅ 完全支持 | 10.0+ | SFSpeechRecognizer | Info.plist配置 |
| macOS | ✅ 完全支持 | 10.15+ | SFSpeechRecognizer | Info.plist配置 |
| OpenHarmony | ✅ 已适配 | API 20 | Core Speech Kit | MICROPHONE权限 |
3.2 各平台底层引擎对比
这张表我觉得挺有参考价值的,做适配之前一定要搞清楚各平台的差异:
| 对比维度 | Android | iOS/macOS | OpenHarmony |
|---|---|---|---|
| 引擎名称 | SpeechRecognizer | SFSpeechRecognizer | Core Speech Kit |
| 语言支持 | 多语言 | 多语言 | 仅中文 |
| 在线/离线 | 都支持 | 都支持 | 仅在线 |
| 权限类型 | RECORD_AUDIO | Microphone + Speech | MICROPHONE |
| 部分结果 | 支持 | 支持 | 支持(isLast判断) |
⚠️ 重点关注:OpenHarmony目前只支持中文识别,这是最大的限制。在示例代码里你会看到专门的语言校验逻辑。
3.3 平台差异带来的适配挑战
我在适配过程中遇到的主要挑战:
- API设计差异大:Android的
RecognitionListener有十几个回调方法,OpenHarmony的setListener只有五个。怎么映射是个问题 - 权限模型不同:Android用
ActivityCompat.requestPermissions,OpenHarmony用abilityAccessCtrl.createAtManager(),完全是两套体系 - 语言支持受限:原插件支持六种语言,到了OpenHarmony只能用中文。这个限制需要在Dart层做好提示
- 调试工具差异:Android用adb,OpenHarmony用hdc,日志格式也不一样
四、适配目标与整体技术路线
4.1 我给自己定的目标
在动手写代码之前,我先明确了几个原则:
- Dart层API零改动:用户现有的代码不需要改一行就能在OpenHarmony上跑。这是底线
- 功能尽量对齐:核心的语音识别流程(activate → listen → result → stop)必须完整
- 优雅降级:不支持的功能(比如英文识别)要给出明确的错误提示,而不是直接崩溃
- 代码质量不打折:错误处理、资源释放、日志输出,一个都不能少
4.2 技术路线规划
整个适配过程我分成了五步:
环境搭建 → 架构分析 → 平台实现 → 功能测试 → 性能调优
(1周) (3天) (2周) (1周) (3天)
- 环境搭建:装DevEco Studio、配Flutter-OHOS SDK、连真机。这步看着简单,实际上最容易出问题
- 架构分析:把现有的Android和iOS实现吃透,搞清楚每个方法调用的时序
- 平台实现:写OpenHarmony的原生代码,这是最核心的部分
- 功能测试:在真机上跑通所有场景,包括正常流程和异常流程
- 性能调优:优化识别延迟、内存占用等指标
4.3 关键技术选型
| 决策项 | 方案 | 为什么这么选 |
|---|---|---|
| 通信机制 | MethodChannel | 和现有架构一致,不引入额外复杂度 |
| 语音引擎 | Core Speech Kit | 官方推荐,稳定性有保障 |
| 权限管理 | abilityAccessCtrl | OpenHarmony标准权限API |
| 开发语言 | ArkTS (ets) | OpenHarmony插件的标准开发语言 |
| 错误处理 | 统一错误码映射 | 保持跨平台一致的错误体验 |
🎯 一个重要决策:OpenHarmony插件用ArkTS(.ets文件)开发,而不是C/C++。虽然C++性能更好,但ArkTS开发效率高,而且Core Speech Kit本身就提供了ArkTS接口。
五、本系列文章的内容规划与阅读指南
5.1 30篇文章的整体结构
我把30篇文章分成了四个阶段:
| 阶段 | 篇目 | 主题 | 难度 |
|---|---|---|---|
| 基础篇 | 第1-6篇 | 环境搭建、架构分析、现有平台实现 | ⭐⭐ |
| 适配篇 | 第7-18篇 | OpenHarmony平台的具体实现 | ⭐⭐⭐⭐ |
| 进阶篇 | 第19-24篇 | 示例开发、测试、性能优化 | ⭐⭐⭐ |
| 扩展篇 | 第25-30篇 | 部署发布、高级特性、未来展望 | ⭐⭐⭐ |
5.2 不同读者的阅读建议
如果你是Flutter新手:
- 建议从第1篇开始顺序阅读
- 重点关注第3篇(Plugin机制)和第4篇(源码分析)
- 每篇的代码示例都要自己跑一遍
如果你有Flutter插件开发经验:
- 可以跳过前6篇,直接看第7篇开始的适配实现
- 重点关注第8篇(FlutterPlugin接口)和第10篇(Core Speech Kit)
如果你只想快速上手:
- 直接看第19篇(示例应用开发)
- 遇到不理解的地方再回头看对应的原理篇
5.3 一些实用建议
- 一定要动手:光看不练等于白看。每篇文章的代码都是可以直接运行的
- 记录问题:适配过程中遇到的问题记下来,说不定就是别人也会遇到的
- 善用社区:遇到搞不定的问题,去开源鸿蒙跨平台社区提问,响应还是挺快的
六、开发环境准备清单
6.1 软件工具清单
在正式开始之前,确保你准备好了以下工具:
| 工具 | 版本 | 下载地址 | 备注 |
|---|---|---|---|
| DevEco Studio | 6.0.2 Release | 官方下载 | 鸿蒙IDE |
| Flutter-OHOS SDK | 3.35.7-dev | GitHub | 注意是dev分支 |
| OpenHarmony SDK | API 20 | SDK下载 | 通过DevEco安装 |
| hdc工具 | 随SDK | 使用指南 | 类似adb |
6.2 硬件要求
- 开发机:8GB内存起步,16GB推荐。Flutter编译很吃内存,加上DevEco Studio本身也不轻量
- 测试设备:需要一台运行OpenHarmony的真机,ROM版本6.0.0.130 SP8或更高
- 磁盘空间:至少预留100GB。Flutter SDK + OpenHarmony SDK + DevEco Studio,加起来挺大的
6.3 快速验证环境
装好之后跑一下这几个命令,确认环境没问题:
# 检查Flutter-OHOS环境
flutter doctor -v
# 检查设备连接
hdc list targets
# 创建并运行测试项目
flutter create --platforms=ohos hello_ohos
cd hello_ohos
flutter run -d ohos
⚠️ 常见问题:如果
flutter doctor显示OpenHarmony toolchain有问题,大概率是环境变量没配对。具体排查方法在第2篇会详细讲。
七、项目源码结构预览
7.1 目录结构
提前看一下flutter_speech项目的目录结构,后面的文章会逐个分析:
flutter_speech_recognition/
├── lib/
│ └── flutter_speech.dart # Dart层核心代码(85行)
├── android/ # Android平台实现
├── ios/ # iOS平台实现
├── macos/ # macOS平台实现
├── ohos/ # OpenHarmony平台实现(重点)
│ ├── src/main/ets/components/plugin/
│ │ └── FlutterSpeechPlugin.ets # 核心插件代码(265行)
│ ├── src/main/module.json5 # 模块配置
│ ├── oh-package.json5 # 包配置
│ ├── build-profile.json5 # 构建配置
│ └── index.ets # 入口文件
├── example/ # 示例应用
│ └── lib/main.dart # 示例代码(188行)
├── pubspec.yaml # 项目配置
└── README.md # 项目说明
7.2 代码量统计
| 文件 | 行数 | 语言 | 说明 |
|---|---|---|---|
| flutter_speech.dart | 85 | Dart | Dart层API |
| FlutterSpeechPlugin.ets | 265 | ArkTS | OpenHarmony实现 |
| main.dart (example) | 188 | Dart | 示例应用 |
| module.json5 | 11 | JSON5 | 模块声明 |
| oh-package.json5 | 10 | JSON5 | 包配置 |
💡 一个有趣的发现:整个OpenHarmony适配的核心代码只有265行。虽然不多,但每一行都有讲究,后面的文章会逐行分析。
八、适配成果预览
8.1 最终效果
适配完成后,示例应用在OpenHarmony设备上的运行效果:

图:flutter_speech示例应用在OpenHarmony设备上运行
核心功能验证:
- ✅ 语音识别引擎激活
- ✅ 实时语音转文字
- ✅ 识别结果回调
- ✅ 停止/取消识别
- ✅ 错误处理与恢复
- ⚠️ 多语言支持(仅中文)
8.2 关键代码片段预览
这是OpenHarmony端的核心插件类声明,后面会详细展开:
export default class FlutterSpeechPlugin implements FlutterPlugin, MethodCallHandler, AbilityAware {
private channel: MethodChannel | null = null;
private asrEngine: speechRecognizer.SpeechRecognitionEngine | null = null;
private sessionId: string = '10000';
private isListening: boolean = false;
private lastTranscription: string = '';
private abilityContext: common.UIAbilityContext | null = null;
// ...
}
三个接口的实现是整个适配的骨架:
- FlutterPlugin:插件生命周期管理
- MethodCallHandler:处理Dart层的方法调用
- AbilityAware:获取OpenHarmony的上下文
总结
写到这里,第一篇差不多了。回顾一下本文的核心内容:
- flutter_speech是什么:一个跨平台语音识别Flutter插件,API简洁,架构清晰
- 为什么要适配OpenHarmony:鸿蒙生态在快速发展,Flutter-OHOS让我们能用一套代码覆盖四个平台
- 适配的核心挑战:API差异、权限模型不同、语言支持受限
- 技术路线:MethodChannel + Core Speech Kit + ArkTS,五步走完成适配
- 系列规划:30篇文章,从入门到部署,覆盖完整适配流程
下一篇我们正式进入实战,手把手搭建Flutter-OHOS开发环境。DevEco Studio的安装配置、Flutter-OHOS SDK的下载编译、真机连接调试…这些内容都会详细覆盖。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
更多推荐



所有评论(0)