在HarmonyOS中实现文本语音播报需调用TextReader控件,初始化须在onWindowStageCreate后完成并配置必填参数,文本数据需符合字段要求且清洗HTML标签,启动朗读需匹配articleId或使用TextReaderIcon组件,状态监听与资源释放必须严格遵循生命周期。

在HarmonyOS应用中实现文本语音播报,需调用系统级AI朗读控件TextReader,它直接集成HiAI引擎,无需自建TTS服务,支持10000字符以内实时合成与播放,且已预置中文女声“聆小珊”音色。
初始化朗读控件
第一步:在entryability/EntryAbility.ets中获取UIAbilityContext并传入init方法。这一步必须在Ability生命周期的onWindowStageCreate阶段之后执行,否则context为空会导致初始化失败。
第二步:导入SpeechKit模块并配置ReaderParam参数。其中businessBrandInfo.panelName和panelIcon为必填项,否则面板无法正常显示品牌标识;【isVoiceBrandVisible必须设为true,否则朗读面板不弹出】。
第三步:调用TextReader.init()并处理Promise异常。若返回错误码201,说明缺少ohos.permission.KEEP_BACKGROUND_RUNNING权限;若返回401,大概率是ReaderParam字段缺失或类型错误。
准备待朗读文本数据
在Index.ets页面中声明ReadInfo数组,每个对象必须包含id、title、author、date和bodyInfo五个字段。title、author、date的isClickable属性决定对应区域是否可点击跳转,bodyInfo是实际被朗读的正文内容,长度不能超过10000字符。
注意:bodyInfo中若含HTML标签或特殊控制符(如\u200B零宽空格),会导致朗读中断或静音,建议提前用正则stripTags(bodyInfo.replace(/[\u200B-\u200F\uFEFF]/g, ''))清洗。
启动朗读并监听状态
方法一:调用TextReader.start()传入完整readInfoList和articleId。articleId必须与列表中某项id完全匹配,否则默认朗读第一项;若传入不存在的id,朗读将静默失败且无报错提示。
方法二:使用TextReaderIcon组件嵌入页面,用户点击后自动触发朗读面板。该组件会绑定当前selectedReadInfo,无需手动传参,但要求TextReader已成功init且isInit为true。
监听stateChange事件时,ReadStateCode枚举值包括WAITING、PLAYING、PAUSED、STOPPED。当收到PLAYING状态后,才可安全调用pause()或stop();在WAITING状态下调用pause()无效。
释放资源与错误处理
在页面aboutToDisappear生命周期中,必须调用TextReader.off('stateChange')和TextReader.off('showPanel')清除监听器,否则可能引发内存泄漏。
调用TextReader.release()释放TTS引擎资源,该操作不可逆——再次调用start前必须重新init。若未release就退出应用,后台TTS进程可能持续占用音频通道,导致其他App播放异常。

















