各位开发者朋友们大家好啊,最近项目太紧了不过也有好消息呢,我申请的华为HDE认证通过啦,这样更加鞭策我的更新频率了,2026年共勉。
说到AI类API并不是我们想的那种一句汉语,就出结果了,而是在以往开发中我们需要后端配合或者其他三方插件才能实现的需求。那今天我们看下文字转语音,这个功能在一几年的时候比较火,那时候大家都在玩自媒体又不想出镜也不想出声,文字转语音功能就比较有市场了,那时候我也在玩这个,像科大讯飞和其他专业的公司也有相应服务,不过字数多和对声音细节调整的时候往往需要充值了。那么我们今天完成这个也可以在后续细节调整到专业级状态。一起看看吧。
这个项目完整代码已开源,请关注评论区git地址哈,另外这一些列为南大实训演示项目,我在开发时也留了开发录屏发布到小破站了,也会一并提供给大家,不过要拜托大家多多一键三连凹,为开发动力加加95号油。

1.创建TextToSpeech转语音引擎实例
textToSpeech.createEngine,根据文档我们要配置这个引擎的参数,我们选择中文,离线,音色为0或者13,因为其他需要下载,在配置这个的时候我也是第一次,但是不慌,只要文档是健全的,耐心跟着配置就可调试出来


回到代码中,单独封装一个自定义函数,方便调用,我们选择一进入页面就初始化引擎


**增加一个知识点,**页面的生命周期,aboutToAppear常用在普通Router路由模式下给带有@Entry装饰器的页面使用的,但是我们使用NavDestination作为子页面,不带@Entry装饰器也用不到这个,在navigation路由框架下我们使用这个组件自带的一套生命周期,onReada是这个页面初始化时触发,最适合做一些实例的初始化和页面数据的整备,其他我们在工作中常用的还有onShow就是这个页面每次出现的时候触发,根据具体的场景使用这些生命周期函数,避免重复调用减少内存消耗提升性能。
对navigation路由框架的搭建还不太了解的童鞋,可以看下我上一篇文章呢!
2.开始播放的speak配置
根据文档导读,我们看实例下面的方法,有speak我们去看下具体内容。


那我们找到这个方法后 才发现要在setListenner方法后才可以,调用这个方法去播放,那就先封装好这个方法,把需要转化的文本我们作为自定义函数的参数,调用的时候传进去,也可以做一个页面的状态变量放进去,避免忘了传参数引发报错,

这里有个播放参数,其中有个必选参数requestId,我在调试时 ,先给了一个固定的字符串,确保参数有效,能让我首次发出声音,后来呢,我们想在这个页面进行多次的更换文本播放,就做了动态的id传入,因为他是不能重复的,更换文本后想要再 次播放就要切换id。

3.设置转语音监听函数(方法)
上文我们根据常规思维,设置好引擎后就去speak,发现要先设置监听才可以播放,那么我们就来配置监听,这类方法在音频播放AVplayer这类语言类API中很常见,文档中也会给出简要的配置方法
大家需要注意,监听和speak都是基于引擎实例来配置,所以我们在封装自定义方法时在外部都要留一个参数让我们初始化的引擎传进来

4.开始播放
等着急了吧,开始播放!
整合我们前面封装好的三个方法,调用启动引擎,引擎成功后设置监听,监听做好后就播放
看下图就明白了我们做封装的意义所在,既保证了引擎初始化成功后才调用设置监听,也简化了代码,一行来取代这一套监听配置的诸行代码,利于代码调试和维护

将封装好的speak方法绑定在播放键的点击事件下,即可播放,文本内容我们已经通过TextArea组件的双向绑定机制实时传给了speak方法。
在触发播放前要确保有文字内容外(这里省略了,这是前端的一个常见的非空判断习惯),还要确保引擎已经成功启动且监听已设置,我们就做一个变量初始值为false,等引擎初始化完成后就为true作为控制能佛正常播放的安全把手。


任何容器都可设置enabled属性,当这里传入true的时候,这个容器是可操作可点击的,false反之。这里我一开始用的不可点击作为引擎安全机制,写材料的时间想到还是替换为提示窗比较友好哈。具体还要看产品要求和UX给你的设计图。
总结:初始化引擎,设置监听,开始播放。三步走,再加一些细节的考量,比如提前对于大步骤封装在一个函数内,方便顺序化调用和维护。每一步方法中耐心读文档看下调用限制和参数配置,看参数时要注意可选参数和必选参数。还有一点是API版本的问题,比如监听里的音频流回调,需要API19及以上才可以,那我手里的真机是鸿蒙5,还不支持拿到音频流,所以这期这个功能没能闭环,这时候如果工作中有这个需求,就要及时跟领导反应再买个真机或者选一个鸿蒙5测试机升级为6.切不可擅自升级哈,变砖了就砸手里了。
写在后面
其实调试调试就是不断的试错,在开发路上有完整的文档,就没有调不出来的功能,耐心些,遇到一个场景解决一个场景,后面调试就快了。
如果在调试时遇到任何问题都可以在线留言一起交流呢。祝大家新的一年bug不多,少加班。