前言

欢迎加入开源鸿蒙跨平台社区: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);
}

这个设计有几个值得学习的地方:

  1. 单例模式:语音识别引擎全局只需要一个实例,避免资源浪费
  2. 方法命名清晰:activate、listen、cancel、stop,一看就知道干什么
  3. 回调分离:不同事件用不同的handler,不会混在一起

二、OpenHarmony 生态现状与 Flutter 适配意义

2.1 OpenHarmony 发展概况

坦白讲,一年前我对OpenHarmony还是持观望态度的。但最近半年的变化确实让人刮目相看。

根据我在社区里收集到的信息:

  1. 设备覆盖面越来越广:手机、平板、智慧屏、车载、IoT设备,基本上主流品类都有了
  2. API迭代速度很快:从API 9到API 20,每个版本都有不少新能力。特别是API 20之后,多媒体和AI相关的Kit功能丰富了很多
  3. 开发者社区在快速增长:我们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"战略里,语音交互是非常核心的一环:

  1. 智能家居场景:对着智慧屏说"打开空调",这背后就是语音识别在工作
  2. 车载场景:开车时用语音控制导航、打电话,安全又方便
  3. 无障碍功能:视障用户通过语音操作手机,这是刚需中的刚需

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 平台差异带来的适配挑战

我在适配过程中遇到的主要挑战:

  1. API设计差异大:Android的RecognitionListener有十几个回调方法,OpenHarmony的setListener只有五个。怎么映射是个问题
  2. 权限模型不同:Android用ActivityCompat.requestPermissions,OpenHarmony用abilityAccessCtrl.createAtManager(),完全是两套体系
  3. 语言支持受限:原插件支持六种语言,到了OpenHarmony只能用中文。这个限制需要在Dart层做好提示
  4. 调试工具差异:Android用adb,OpenHarmony用hdc,日志格式也不一样

四、适配目标与整体技术路线

4.1 我给自己定的目标

在动手写代码之前,我先明确了几个原则:

  1. Dart层API零改动:用户现有的代码不需要改一行就能在OpenHarmony上跑。这是底线
  2. 功能尽量对齐:核心的语音识别流程(activate → listen → result → stop)必须完整
  3. 优雅降级:不支持的功能(比如英文识别)要给出明确的错误提示,而不是直接崩溃
  4. 代码质量不打折:错误处理、资源释放、日志输出,一个都不能少

4.2 技术路线规划

整个适配过程我分成了五步:

环境搭建 → 架构分析 → 平台实现 → 功能测试 → 性能调优
  (1周)     (3天)      (2周)      (1周)      (3天)
  1. 环境搭建:装DevEco Studio、配Flutter-OHOS SDK、连真机。这步看着简单,实际上最容易出问题
  2. 架构分析:把现有的Android和iOS实现吃透,搞清楚每个方法调用的时序
  3. 平台实现:写OpenHarmony的原生代码,这是最核心的部分
  4. 功能测试:在真机上跑通所有场景,包括正常流程和异常流程
  5. 性能调优:优化识别延迟、内存占用等指标

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 一些实用建议

  1. 一定要动手:光看不练等于白看。每篇文章的代码都是可以直接运行的
  2. 记录问题:适配过程中遇到的问题记下来,说不定就是别人也会遇到的
  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设备上运行

核心功能验证:

  1. ✅ 语音识别引擎激活
  2. ✅ 实时语音转文字
  3. ✅ 识别结果回调
  4. ✅ 停止/取消识别
  5. ✅ 错误处理与恢复
  6. ⚠️ 多语言支持(仅中文)

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的上下文

总结

写到这里,第一篇差不多了。回顾一下本文的核心内容:

  1. flutter_speech是什么:一个跨平台语音识别Flutter插件,API简洁,架构清晰
  2. 为什么要适配OpenHarmony:鸿蒙生态在快速发展,Flutter-OHOS让我们能用一套代码覆盖四个平台
  3. 适配的核心挑战:API差异、权限模型不同、语言支持受限
  4. 技术路线:MethodChannel + Core Speech Kit + ArkTS,五步走完成适配
  5. 系列规划:30篇文章,从入门到部署,覆盖完整适配流程

下一篇我们正式进入实战,手把手搭建Flutter-OHOS开发环境。DevEco Studio的安装配置、Flutter-OHOS SDK的下载编译、真机连接调试…这些内容都会详细覆盖。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐