华为创新赛获奖复盘:不仅是 TTS,用 HarmonyOS Speech Kit 让你的应用秒变“哄娃神器”

鸿蒙第16篇——数据持久化 本文介绍的数据持久化是指鸿蒙应用的数据持久化存储。它是将内存中的数据通过文件或数据库的形式保存到设备存储中。鸿蒙支持多种数据存储方式, 包括用户首选项Preferences、 键值型数据库KV-Store和关系型数据库。 阅读详情

华为创新赛获奖复盘:不仅是 TTS,用 HarmonyOS Speech Kit 让你的应用秒变“哄娃神器”

前言:在《智伴》的“古诗词学习”模块中,我们需要一个既能朗读古诗,又带有标准播控面板(播放/暂停/上一首/下一首)的功能。如果从零开发 UI 和后台播放逻辑,不仅成本高,还容易出现音频焦点冲突等问题。HarmonyOS Speech Kit 提供的 TextReader(朗读控件) 完美解决了这个问题,它就像是一个系统级的“朗读播放器”,让开发者能以极低的成本集成高质量的朗读功能。


一、 为什么选择 TextReader?

在 HarmonyOS 中,实现“文字转语音”主要有两种方式:

  1. textToSpeech (Core Speech Kit):底层的 TTS 引擎,只负责合成声音,不提供 UI,适合游戏音效、无障碍播报等场景。
  2. TextReader (Speech Kit):场景化的朗读控件,自带悬浮播控条,支持后台播放、锁屏控制、播放列表管理。

对于《智伴》的古诗朗读场景,我们需要用户能看到当前读到哪一首,能随时暂停或切换,且在应用切到后台时(比如孩子一边听诗一边玩积木)声音不能断。显然,TextReader 是最佳选择。


二、 实战:打造古诗朗读播放器

我们将结合《智伴》的源码 GushiPage.ets,一步步实现这个功能。

1. 权限配置

TextReader 支持后台朗读,因此需要在 module.json5 中申请长时任务权限,并在代码中配置。

module.json5:

"requestPermissions": [
  {
    "name": "ohos.permission.KEEP_BACKGROUND_RUNNING"
  }
]

2. 初始化 TextReader

在使用朗读功能前,必须先调用 init 方法。建议在页面的 aboutToAppear 生命周期中进行。

import { TextReader } from '@kit.SpeechKit';
import { common } from '@kit.AbilityKit';

@Entry
@Component
struct GushiPage {
  private context = getContext(this) as common.UIAbilityContext;

  aboutToAppear() {
    this.initTextReader();
  }

  private initTextReader() {
    // 初始化参数
    let readParams: textReader.ReaderParam = {
      isMinibarNeeded: true, // 是否显示悬浮播控条 (类似小艺朗读)
      keepBackgroundRunning: true, // 是否允许后台运行
      agentName: '智伴', // 播控条上显示的应用名称
      agentInfo: {
        icon: $r('app.media.logo'), // 播控条上的图标
        name: '智伴'
      }
    };

    TextReader.init(this.context, readParams).then(() => {
      console.info('TextReader 初始化成功');
    }).catch((err: BusinessError) => {
      console.error(`TextReader 初始化失败: ${err.code}, ${err.message}`);
    });
  }
}

3. 构造播放列表并起播

TextReader 接受 ReadInfo 数组作为播放列表。我们需要将数据库中的古诗数据转换为这种格式。

// 定义古诗数据结构
interface Gushi {
  id: number;
  title: string;
  author: string;
  content: string;
}

// 播放古诗
private playGushi(gushiList: Gushi[], startIndex: number) {
  // 1. 转换为 ReadInfo 数组
  let readInfoList: textReader.ReadInfo[] = gushiList.map(item => ({
    id: item.id.toString(),      // 唯一标识,必须是字符串
    title: item.title,           // 标题,显示在播控条上
    content: item.content,       // 朗读的文本内容
    author: item.author,         // 作者
    category: '古诗'             // 分类
  }));

  // 2. 指定起播文章的 ID
  let startId = gushiList[startIndex].id.toString();

  // 3. 调用 start 方法起播
  TextReader.start(readInfoList, startId).then(() => {
    console.info('开始朗读');
  }).catch((err: BusinessError) => {
    console.error(`起播失败: ${err.code}, ${err.message}`);
  });
}

代码解析:

  • readInfoList:整个播放列表。TextReader 会自动管理这个列表,用户点击“下一首”时会自动播放列表中的下一项。
  • startId:指定从列表中的哪一项开始播放。

4. 监听播放状态与交互

为了让 App 界面(如播放按钮图标)与 TextReader 的状态保持同步,我们需要监听相关事件。

aboutToAppear() {
  // ... 初始化代码 ...

  // 监听状态变化
  TextReader.on('stateChange', (state: textReader.ReaderState) => {
    // state: 1(播放中), 2(暂停), 3(停止)
    this.isPlaying = (state === 1);
  });

  // 监听点击播控条文章标题事件
  TextReader.on('clickArticle', (articleId: string) => {
    // 用户在播控条点击了某首诗,App 可以跳转到对应的详情页
    console.info(`用户点击了文章: ${articleId}`);
  });
}

5. 资源释放

当用户退出页面或不再需要朗读时,务必释放资源。

aboutToDisappear() {
  // 停止播放并释放资源
  TextReader.stop();
  TextReader.release();
  // 取消所有监听
  TextReader.off('stateChange');
  TextReader.off('clickArticle');
}

三、 踩坑指南

在开发《智伴》的过程中,我们也遇到了一些“坑”,希望能帮你避开:

  1. 权限问题:如果在模拟器上运行,可能无法看到悬浮播控条,建议使用真机调试。
  2. ID 唯一性:ReadInfo 中的 id 必须在列表中唯一,否则可能会导致播放顺序混乱。
  3. 内容长度:虽然 TextReader 适合长文本,但如果单篇内容过长(如几万字),建议通过 RequestMore 事件进行分段加载,避免一次性传入导致内存占用过高。

四、 总结

通过 TextReader,《智伴》仅用不到 100 行核心代码,就实现了一个功能完备、体验一致的古诗朗读功能。它不仅节省了开发时间,更重要的是,它利用系统级能力保证了音频播放的稳定性和流畅性。

对于不需要复杂 UI 定制的朗读场景,TextReader 绝对是 HarmonyOS 开发者的首选。

下一篇,我们将深入更底层的 Core Speech Kit,看看如何实现游戏中的实时语音反馈和指令识别。

第10篇:打包上架:签名、打包 HAP、发布到华为应用市场 打包上架:签名、打包 HAP、发布到华为应用市场 阅读详情

相关推荐

【鸿蒙专题与实战】测试体系:单元测试、组件测试与 UI 测试

本文系统讲解鸿蒙开发中的三层测试实践:底层单元测试(用Hypium框架,优先覆盖纯函数、边界与异常)、中层ViewModel逻辑、顶层仅测3-5条关键UI路径。强调测试应“越往下写得越多”,因单元测试快且成本低,而UI测试慢易出错。通过实例说明断言拆分提升定位效率,结合覆盖率报告(hvigorwtest --coverage)发现盲区,核心是“用覆盖率找漏测,而非追求数字”。附五步落地清单:建测试文件、按优先级补用例、精简UI测试、生成报告、定位未覆盖行。下一篇将开启实战项目:从需求到上架全流程。

信息安全领域优质创作者|操作系统领域专家 166

华为昇腾910B4(A2)服务器环境搭建笔记

Qwen3.5 默认支持思考模式。首次测试建议关闭思考模式,更容易判断模型是否成功回答。我建议把模型统一存放在宿主机的 /data/models 目录中。这样即使删除 Docker 容器,模型文件也不会丢失。这里先进行单卡测试,确保容器能正确调用 NPU。安装ModelScope 用于下载模型。继续在刚才的容器内部执行。

guoqingru0311的博客 296

SQLite学习——Dapper初识

dapper下载:https://www.nuget.org/packages/Dapper/1.40.0

jiDxiaohuo的博客 1295

IPD咨询洞察:华为项目文化:让胜利成为一种信仰

华为“让胜利成为信仰”的本质是使命必达,落地为五项内核:开放创新、勇于担当、团队协同、契约精神、善思善结。使命必达不能停留在墙面标语,须转化为可落地、可考核的行为准则,胜利才能真正成为团队习惯。

weixin_58096508的博客 102

MuJoCo 仿真中的碰撞检测与参数优化实战

本文深入解析MuJoCo仿真中的碰撞检测机制与参数优化策略,涵盖位掩码配置、凸包分解实战及穿模问题解决方案。通过具体案例和参数设置建议,帮助开发者高效解决机械臂抖动、轴孔装配等常见问题,提升仿真精度与稳定性。特别针对步进电机仿真提供了高增益位置执行器的优化方案。

weixin_29081101的博客 332

4.UE数字人工程运行逻辑及程序逻辑

UE数字人工程运行逻辑及程序逻辑

6086

手头只有华为配置,新设备是华三?粘进来自动翻

手头有华为配置,新设备是华三?用「跨厂商转换」工具,粘贴配置后自动识别源厂商,一键转成目标厂商语法,支持华为、华三、锐捷、迈普、思科等主流设备。精准处理VLAN、access/trunk口、SVI IP、VTY/SSH等差异,避免手动修改时漏改“拼写级”错误。转换后需人工核对核心项与独有特性,建议结合备份、比对与模拟验证,确保安全上机。

qq_42614669的博客 389

ArcGIS栅格拼接全攻略:从核心原理到色彩平衡与大数据处理

在GIS数据处理中,栅格拼接是一项基础且关键的操作,其本质是将多幅具有重叠区域的栅格图像无缝整合为一张完整地图。该技术涉及空间参考统一、像元对齐与色彩融合等核心原理,是构建连续地理空间数据的基石。其技术价值在于保障数据完整性、提升可视化效果,并为后续的空间分析提供可靠底图。在遥感影像处理、数字高程模型构建及地图制图等应用场景中,高质量的拼接成果至关重要。本文聚焦于ArcGIS平台,深入解析其栅格拼接工具,并针对常见的色彩不一致与大数据量处理难题,提供了基于**色彩平衡**和**金字塔**优化的实战解决方案,

weixin_33158887的博客 262

【2026-11-06】华为研发机试三道编程题解

本文整理了华为11月6日研发岗三道编程题解法:第一题为按列填充句子,通过枚举行数模拟列宽计算,求最小行数;第二题为生鲜库存优化,利用动态分配思想,预处理“采购-销售”成本,贪心选择最便宜来源满足需求;第三题涉及AC自动机与动态规划结合的序列化奖励问题。代码均以Java实现,思路清晰,适合笔试刷题参考。关注公众号【TechGuide】获取更多真题解析。

试问道几许 360

利用CAT12做皮层指标的统计分析及可视化笔记记录

利用CAT12做皮层指标的统计分析及可视化 文章目录利用CAT12做皮层指标的统计分析及可视化前言一、统计步骤1.Basic Models2.Estimate Surface Models3.Results二、可视化1.t值可视化2.p值可视化 前言 本来没有打算做SBM的,因为自己是新手小白,许多操作都不太懂,但最后还是打算做一下,于是就从上周末开始将很久之前跑VBM得到的surf文件夹中的数据捡起来继续做皮层分析,因为之前看了一个博主的博客,关于如何做SBM已经讲得非常清楚了,但是在统计及可视化这里,我

weixin_52073820的博客 8094

Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案

本博客在总结这些问题及其解决方案,为遇到类似问题的兄弟提供参考,如果我后续有碰到其他Docker 问题也会在此更新补充。

我其实什么都不会 1645

华为HCIP网络工程师认证—网络管理与运维

随着网络的规模越来越庞大,网络中的设备种类繁多,如何对越来越复杂的网络进行有效的管理,从而提供高质量的网络服务,已成为网络管理所面临的巨大挑战。网络的管理与运维手段多样,本博客将对几种网络管理与运维手段展开介绍。网络管理与运维,就是让你从“一台一台跑去敲命令的消防员”,变成“坐在总控室看大屏的指挥官”的一套技术体系。 它的核心目标就四个字:可视、可控——你得先“看见”网络在发生什么,然后才能“控制”它不出事。网络管理与运维,在 HCIP 里不像 OSPF、VLAN 那样需要算得很深,但它是一个“框架性”……

极客园地 246

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

华为VXLAN OVER EVPN(EBGP)

本文基于 eNSP Pro 模拟器,完整复现 Spine-Leaf 架构下 VXLAN over EVPN 的二层互通实验。实验目标是:通过 EBGP 在 Spine 与 Leaf 之间建立 Underlay 路由,再借助 BGP EVPN 承载 VXLAN 隧道,最终实现跨 Leaf 的同一子网二层互通,并验证头端复制(Head-End Replication)方式的 BUM 流量转发。

257

1、工作流介绍

工作流起源于办公自动化,是对软件中业务流程的抽象。通过工作流将各个任务有序组织起来形成一个完整的业务闭环。比如:请假审批流程,网上购物流程,银行贷款流程;!

leyoliu的博客 5108

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

华为云云硬盘 EVS:挂载、初始化与快照回滚,一块数据盘的完整生命周期

一块云硬盘的生命周期是「买 → 挂 → 初始化 → 用 → 卸 → 再挂」。Windows 靠磁盘管理初始化、靠脱机保证能换机;Linux 靠。

xbzb的博客 707

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

YOLOv11m 部署华为 Atlas 300I Pro

部署到的全过程拆成可照抄的步骤:装驱动固件 → 装 CANN toolkit 与算子包 → 装 Ultralytics / ais_bench → 导出 ONNX → ATC 编译成.om→ 命令行/Python 推理 → CPU 端解码 NMS。给出两条路线(一键导出 / 手工 ATC)、完整可运行的预处理与后处理代码、报错排查表和验收清单。先认清硬件:300I Pro 到底是颗什么芯片部署总览:软件栈与两条技术路线环境与软件清单(开工前先对齐)

巽视达的专栏 575

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

变相解决华为Mate 8锁屏后无法建立入站网络连接

当你的华为Mate 8手机锁屏时,拒绝一切入站网络连接……

xyzzklk的博客 366

华为VPLS over SRV6

IGP IPv6:在 P 与 PE 上启用 IS-IS Level-2 和 IPv6 拓扑,并在物理接口与 LoopBack0 上使能 IS-IS IPv6,打通底层 IPv6 可达性。BGP 邻居:以 LoopBack0 为源建立 IBGP 邻居,P 作为反射器,为 EVPN 路由传递提供通道。EVPN 对等体:在 l2vpn-family evpn 下使能邻居并声明 SRv6 封装类型,确保 EVPN 路由可正常收发。locator 与 SID 动态分配。

277

鸿蒙远程控制软件哪个好?华为远程PC、ToDesk、向日葵三款实测

综合来看,本次横测最终更推荐ToDesk:它在支持跨品牌连接的基础上,外接鼠标、全屏远控、移动设备协助和多屏功能覆盖更完整,更适合作为主力远控工具。

2401_85083137的博客 340

华为CE设备配置EVPN OVER VXLAN

本文基于华为 CE 交换机,完整演示 EVPN 与 RFC 5549 的配置过程。全文以 IPv6 链路本地地址建立 EBGP 邻居,无需配置互联接口 IP,即可用 IPv6 下一跳转发 IPv4 地址;随后通过 EBGP 发布环回地址,并用 IPv6 环回地址建立 EVPN 邻居。内容依次覆盖接口配置、BGP unnumbered、EVPN BGP 邻居、EVPN VXLAN、分布式网关与 TYPE5 路由引入、三层 VPC 模拟,以及 TYPE2/TYPE5 路由与三层 VPN 路由表的查看验证。

29

〖物流终端实战 05〗纯血鸿蒙 ArkTS 高阶性能优化:长列表渲染、组件复用与内存泄漏排查

本文深度剖析鸿蒙ArkTS高阶性能优化,直击长列表卡顿与内存泄漏痛点。针对渲染,指出ForEach全量构建的缺陷,强调采用LazyForEach(V2推荐Repeat)配合增量通知及稳定业务Key;针对组件复用,明确@Reusable仅复用实例不重置状态,必须在aboutToReuse中手动清理UI状态;针对内存泄漏,总结全局监听未注销、定时器未清理及长生命周期对象持有页面引用三大元凶,并指导通过DevEco Profiler的Heap快照排查引用链。文章强调优化需遵循“先定位后改代码”原则,助力开发者打造

Eyf • 半字节的博客 641

HarmonyOS 7 端侧 AI 图像超分的工程化落地

用户抱怨网络差的时候图片传不上去,更严重的是,大量的私密照片上传到云端,引发了严重的隐私合规审查危机。痛定思痛后,我们决定把 AI 模型直接塞进手机里,用端侧的 NPU 来做推理,但这绝非易事。我们首先在服务端对模型进行了知识蒸馏,把参数砍掉了一大半,然后利用 MindSpore Lite 的转换工具,将模型转成了鸿蒙底层支持的。即便如此,模型依然有 20 多兆,我们最终选择了 FP16 量化,牺牲了极其微小的画质,换取了内存占用减半。推理过程极其消耗 CPU 和内存,稍微大一点的图,处理时间长达几秒。

2602_97267507的博客 158

AppGallery 上架自检 SOP:签名、隐私对齐与包体校验实战【鸿蒙心迹】

上架被驳回多因签名、隐私声明与包体不一致。本文提炼“签名→隐私对齐→包体校验”自检SOP,配套一键脚本与权限三角校验代码,实现90%驳回前置拦截。通过CI强制release签名、代码/声明/功能三者权限对齐、包体完整性校验,确保提审一次过。实战清单可直接抄,让过审从运气变为流程。

wdracky的专栏 322

窗口销毁了监听还在,HarmonyOS 7 生命周期释放的归属分界

综上所述,onWindowStageWillDestroy 是窗口监听的最后安全出口,onWindowStageDestroy 只负责断开窗口引用,onDestroy 管 Ability 级资源——三者不是“程度不同的退出回调”,而是各自有明确的归属范围。窗口监听的所有者是 WindowStage,定时器的所有者是 UIAbility,播放器的所有者是页面或 Ability(取决于你在哪一层创建的),ApplicationContext 监听的所有者是 Ability 的 context。

qq_61905492的博客 199

鸿蒙平板能当电脑第二块屏幕吗?ToDesk、向日葵镜像/副屏实测

本文对比测试了ToDesk鸿蒙版4.8.3.0与向日葵鸿蒙版16.8.0在连接鸿蒙平板作为电脑副屏的表现。结果显示,ToDesk可直接实现镜像屏与扩展屏功能,支持参数调节,操作流畅;而向日葵副屏需开通会员才能使用。对于已有鸿蒙平板的用户,ToDesk能有效拓展工作空间,提升多任务效率,尤其适合临时办公、出差等场景,具备较高实用价值。

2501_91062530的博客 2326
上一篇: 华为创新赛获奖复盘:如何用纯端侧 AI 打造一款“有温度”的 HarmonyOS Next 应用?
下一篇: 华为创新赛获奖复盘:告别“傻瓜式”问答,基于 Core Speech Kit 打造媲美真人的全双工语音交互
秦城季
博客等级 码龄10年 46粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值