Flutter三方库适配OpenHarmony【flutter_speech】— 与其他 HarmonyOS Kit 的联动

前言

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

语音识别很少单独使用------它通常是更大交互链条中的一环。今天我们探讨flutter_speech如何与其他HarmonyOS Kit联动,构建更丰富的语音交互体验。

一、Core Speech Kit 与 Text-to-Speech 的结合

1.1 语音交互闭环

复制代码
用户说话 → [STT] → 文字 → 业务处理 → 回复文字 → [TTS] → 语音播报

1.2 TTS Kit基础用法

typescript 复制代码
import { textToSpeech } from '@kit.CoreSpeechKit';

const ttsEngine = await textToSpeech.createEngine({
  language: 'zh-CN',
  person: 0,
  online: 1
});

ttsEngine.speak('你好,今天天气晴朗', { requestId: '1' });

1.3 STT+TTS联动示例

dart 复制代码
// Dart层的语音对话实现
void onRecognitionComplete(String text) async {
  // 1. 识别完成,获取用户输入
  final userInput = text;

  // 2. 业务处理(例如查询天气)
  final response = await processCommand(userInput);

  // 3. TTS播报结果
  await _ttsPlugin.speak(response);
}

Future<String> processCommand(String input) async {
  if (input.contains('天气')) return '今天天气晴朗,气温25度';
  if (input.contains('时间')) return '现在是下午3点30分';
  return '抱歉,我没有理解您的意思';
}

1.4 STT和TTS的冲突处理

STT和TTS不能同时工作------TTS播报时麦克风会采集到播报声音,导致STT误识别。

dart 复制代码
// 播报前停止识别
await _speech.cancel();
await _tts.speak(response);
// 播报完成后恢复识别
await _speech.listen();
状态 STT TTS 说明
等待用户 监听中 静默 正常状态
用户说话 识别中 静默 STT工作
系统回复 暂停 播报中 TTS工作
回复完成 恢复监听 静默 回到等待

二、与 AI Framework Kit 的集成可能性

2.1 AI Framework Kit概述

AI Framework Kit提供了设备端AI推理能力,包括:

  • 自然语言处理(NLP)
  • 意图识别
  • 实体提取
  • 文本分类

2.2 语音识别+意图识别

复制代码
用户说:"帮我订明天下午3点去北京的机票"
    │
    ├── STT识别文字
    │
    └── AI Framework意图识别
        ├── 意图:订机票
        ├── 时间:明天下午3点
        ├── 目的地:北京
        └── → 调用订票API

2.3 集成示例

typescript 复制代码
// 原生端:STT结果传给AI Framework
onResult(sessionId, result) {
  if (result.isLast) {
    // 识别完成,进行意图分析
    const intent = await aiFramework.analyzeIntent(result.result);
    channel?.invokeMethod('speech.onIntent', JSON.stringify(intent));
  }
}
dart 复制代码
// Dart层接收意图分析结果
case 'speech.onIntent':
  final intent = jsonDecode(call.arguments);
  handleIntent(intent);
  break;

2.4 当前限制

AI Framework Kit的NLP能力目前还在发展中,功能不如云端AI服务丰富。对于复杂的意图识别,建议将文本发送到云端处理。

三、与 Audio Kit 的音频流协作

3.1 Audio Kit的作用

Audio Kit管理设备的音频输入输出,包括:

  • 音频焦点管理
  • 音频流路由
  • 音量控制
  • 音频录制

3.2 音频焦点冲突

当flutter_speech在使用麦克风时,如果其他App也请求麦克风,会产生焦点冲突:

场景 行为 影响
来电 系统抢占麦克风 STT中断
其他App录音 可能被拒绝 不影响STT
音乐播放 不冲突(不用麦克风) 可能影响识别准确率

3.3 处理音频焦点变化

typescript 复制代码
// 监听音频焦点变化(扩展方案)
import { audio } from '@kit.AudioKit';

audio.on('audioInterrupt', (event) => {
  if (event.forceType === audio.InterruptForceType.INTERRUPT_FORCE) {
    // 被系统强制中断(如来电)
    if (plugin.isListening) {
      plugin.isListening = false;
      channel?.invokeMethod('speech.onError', -1);
    }
  }
});

3.4 降低背景噪音的影响

如果设备正在播放音乐,识别准确率会下降。可以在识别前降低媒体音量:

dart 复制代码
// 识别前降低媒体音量
void start() async {
  await _audioManager.setMediaVolume(0.2);  // 降低到20%
  await _speech.listen();
}

void onRecognitionComplete(String text) {
  _audioManager.restoreMediaVolume();  // 恢复音量
}

四、多模态交互:语音 + 手势 + 视觉

4.1 多模态交互场景

模态 输入方式 Kit 适用场景
语音 说话 Core Speech Kit 解放双手
手势 触摸/滑动 触摸事件 精确操作
视觉 摄像头 Vision Kit 图像识别

4.2 语音+手势的结合

dart 复制代码
// 按住说话(Push-to-Talk)
GestureDetector(
  onLongPressStart: (_) {
    _speech.listen();
    setState(() => _isListening = true);
  },
  onLongPressEnd: (_) {
    _speech.stop();
    setState(() => _isListening = false);
  },
  child: Container(
    decoration: BoxDecoration(
      shape: BoxShape.circle,
      color: _isListening ? Colors.red : Colors.blue,
    ),
    padding: EdgeInsets.all(24),
    child: Icon(Icons.mic, color: Colors.white, size: 48),
  ),
)

4.3 语音+视觉的结合

复制代码
用户拍照 → Vision Kit识别物体 → "这是一个苹果"
用户说:"这个多少钱?"
    → STT识别文字
    → 结合视觉上下文:"苹果的价格是..."
    → TTS播报

4.4 多模态状态管理

dart 复制代码
class MultiModalState {
  bool isListening = false;      // 语音输入中
  bool isSpeaking = false;       // TTS播报中
  bool isCameraActive = false;   // 摄像头活跃
  String? lastVisualContext;     // 最近的视觉识别结果

  bool get canListen => !isSpeaking && !isCameraActive;
  bool get canSpeak => !isListening;
}

五、未来 Kit 能力扩展展望

5.1 期待的能力

能力 当前状态 期望 对flutter_speech的影响
多语言STT 仅中文 英文、日文等 消除最大限制
离线STT优化 基础 高准确率离线 无网络也能用
说话人识别 区分不同说话人 多人对话场景
情感识别 识别语气情感 更智能的交互
实时翻译 STT+翻译一体 跨语言交流
声纹认证 通过声音验证身份 安全场景

5.2 flutter_speech的扩展准备

当前的架构已经为未来扩展做好了准备:

复制代码
Dart API层(不变)
    │
    ├── activate(locale) → 未来支持更多语言
    ├── listen() → 未来支持更多参数
    ├── callbacks → 未来支持更多事件类型
    │
MethodChannel(扩展方法名即可)
    │
    ├── speech.activate → 不变
    ├── speech.listen → 可加参数
    ├── speech.onSpeaker → 新增:说话人识别
    ├── speech.onEmotion → 新增:情感识别
    │
Native层(跟进Kit更新)
    │
    └── Core Speech Kit → 新API直接对接

5.3 保持向后兼容

扩展时要保持向后兼容:

  • 新增的回调用可选参数
  • 新增的方法不影响现有方法
  • 新增的平台能力通过Feature Detection暴露
dart 复制代码
// 未来可能的API扩展
class SpeechRecognition {
  // 现有方法不变
  Future activate(String locale) => ...;
  Future listen() => ...;

  // 新增方法(可选)
  Future<bool> isSpeakerRecognitionAvailable() => ...;
  Future<List<String>> getSupportedLanguages() => ...;
}

总结

本文探讨了flutter_speech与其他HarmonyOS Kit的联动:

  1. STT+TTS:构建语音对话闭环,注意音频焦点冲突
  2. STT+AI Framework:语音识别+意图分析,实现智能语音助手
  3. STT+Audio Kit:音频焦点管理,处理中断和噪音
  4. 多模态交互:语音+手势+视觉的结合
  5. 未来展望:多语言、离线优化、说话人识别等能力

下一篇我们讲生产环境部署与发布------插件打包、版本管理、文档编写等实战话题。

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


相关资源:

相关推荐
2501_9197490335 分钟前
华为鸿蒙免费反诈APP—小羊反诈
华为·harmonyos·鸿蒙
2501_919749031 小时前
华为鸿蒙免费视频播放器—小羊免费播放器
华为·harmonyos·鸿蒙
贾伟康2 小时前
【天体运行模拟|15】HarmonyOS ArkTS 本地状态持久化实战:让保存、删除和页面返回后的数据即时一致
harmonyos·arkts·数据持久化·状态管理·preferences
黑臂麒麟2 小时前
Harmony鸿蒙实战应用10:随手账本——发布检查与最终验收
华为·app·arkts·鸿蒙
贾伟康3 小时前
【天体运行模拟|16】HarmonyOS ArkTS 多设备布局实战:适配手机、平板和 PC/2in1 的窗口变化
harmonyos·arkts·arkui·响应式布局·多设备适配
黑臂麒麟3 小时前
HarmonyOS鸿蒙实战应用6:随手账本——Preferences本地持久化
数据库·华为·app·鸿蒙
「、皓子~3 小时前
海狸IM 2.1 正式发布
flutter·微服务·golang·electron·开源软件·im·海狸im
大雷神3 小时前
HarmonyOS AR Engine高精几何重建实战——扫描纸盒并测量体积
华为·ar·harmonyos
用户0934077735143 小时前
HarmonyOS WPS Open SDK 实践:registerApp 鉴权与就绪门禁
android·typescript·harmonyos
里欧跑得慢3 小时前
AI 驱动的 UI 国际化方案自动适配:从单一语言到多语言布局的智能转换
前端·css·flutter·web