直接调用手机自带tts引擎最快、最省流量且支持离线,但ios、android、鸿蒙三端api互不兼容:ios用uni.startspeek(),android需plus.audio.createspeech(),鸿蒙必须用jack-tts等uts插件。

直接调用手机自带 TTS 引擎是最快、最省流量、且能离线使用的方式,但必须区分平台:iOS 和 Android 的 API 完全不同,uni-app 没有统一的跨端 uni.speak() 就能稳定覆盖所有场景。
uni.startSpeek() 在 iOS 和 Android 上行为不一致
这个 API 看似简单,实则坑多:
- iOS 上它调用的是系统 AVSpeechSynthesizer,基本可用;Android 上它依赖 WebView 的 Web Speech API,而绝大多数安卓 WebView(尤其系统 WebView)根本没启用或禁用了该功能,结果就是静默失败、无报错、也不播报
-
uni.pauseSpeek()仅在 iOS 生效,Android 调用后既不暂停也不报错,容易误判播放状态 -
uni.stopSpeek()全平台可用,但会彻底终止当前任务,无法 resume —— 如果你期望“暂停/继续”,这套 API 就不适用 - 语速(
rate)、语言(lang)参数在 Android 上常被忽略,实际发音仍为系统默认音色和语速
plus.audio.createSpeech() 是 Android 原生 TTS 的可靠入口
这是通过 plus 对象调用原生 Audio 模块的方案,只适用于 App 端(H5 / 小程序无效),但比 uni.startSpeek() 更底层、更可控:
- 必须等
plus.ready()触发后再初始化,否则plus.audio未就绪,调用直接报错或无响应 -
voice参数(如xiaoyan、yunyan)仅对 Android 有效,iOS 完全忽略;填错名字不会报错,但可能 fallback 到默认发音人 -
pitch和rate取值范围严格为0.5–2.0,设成0或3不报错,但无效 —— 建议始终做 clamping 处理 - 同一时间只允许一个
speech实例播放,重复调用start()会中断前一个;如需队列,得自己维护isSpeaking状态 + 数组缓冲 - 错误回调
onerror中常见'No TTS engine available',说明用户手机未安装 TTS 引擎(如 OPPO、vivo 出厂未预装),需引导用户去系统设置中下载语言包
鸿蒙(HarmonyOS)必须用 UTS 插件,不能走 plus
uni-app 编译到鸿蒙端时,plus 对象不可用,uni.*Speek() 也未适配鸿蒙原生 @kit.CoreSpeechKit。此时唯一可行路径是 UTS 插件:
- 推荐使用开源的
jack-tts插件,它已封装好鸿蒙平台的初始化、speak()、stop()、pause()等完整生命周期 - 插件内自动处理了权限申请(
ohos.permission.USE_SPEECH)、引擎就绪检测、以及language/rate/pitch到鸿蒙原生参数的映射 - 注意:鸿蒙 TTS 默认不支持离线中文语音包,首次调用若无网络,
init会失败,需捕获ERROR_ENGINE_NOT_AVAILABLE并提示用户联网安装 - 不要试图在鸿蒙端复用 Android 的
plus.android代码 —— 运行时直接 crash,且 HBuilderX 编译阶段不会报错
真正在意离线能力、低延迟和音质,就别依赖 Web 层 API;Android 看 plus.audio.createSpeech(),鸿蒙看 jack-tts,iOS 只能靠 uni.startSpeek() 将就 —— 三端逻辑必须分开写,没有银弹。











