uni-app 无法直接调用系统 tts,必须通过原生插件(如 uni-app-tts 或 speech-tts)实现 android/ios 端语音朗读;android 需配置权限与中文语言包,ios 限制多且不稳定,微信小程序和 h5 基本不可用,多端统一推荐云端 tts 方案。

uni-app 本身不内置系统级 TTS(Text-to-Speech)能力,**无法直接调用 Android/iOS 系统原生 TTS 引擎**(如 android.speech.tts.TextToSpeech 或 AVSpeechSynthesizer)——除非你引入原生插件或使用条件编译 + 平台专属 API。
如果你的目标是「在 App 端(Android/iOS)用系统语音朗读文字」,而不是走百度 PAI 等云端 HTTP 接口,那必须依赖原生能力封装。下面分场景说明怎么做、为什么这么选、以及最容易卡住的地方。
uni-app 调用系统 TTS 的前提:必须用原生插件
uni-app 的 uni.showToast、uni.playVoice 这类 API 都不处理文本朗读;uni.getSystemInfo 也拿不到 TTS 实例。真要调系统 TTS,只有两条路:
- 使用 HBuilderX 官方提供的
uni-app-tts插件(仅支持 App 端,iOS/Android 均需配置原生权限和初始化) - 自己写或集成第三方原生插件(如 DCloud 社区的
speech-tts插件),并在manifest.json中声明对应模块 - 微信小程序等平台完全不支持系统 TTS,只能降级为播放预生成音频或用 web Speech API(但 iOS Safari 不支持
SpeechSynthesis)
Android 端调用系统 TTS 的关键配置
即使插件已安装,Android 仍需手动补全两件事,否则 tts.speak() 会静默失败或报错 ERROR_NOT_INSTALLED:
- 在
manifest.json → "Android 设置" → "模块配置"中勾选TTS(文字转语音)模块 - 确保用户设备已安装中文语言包(尤其国产 ROM 如 MIUI/HarmonyOS,可能默认只装英文 TTS);可在代码中用
tts.isLanguageAvailable('zh-CN')主动检测 - 首次调用前建议显式调用
tts.setLanguage('zh-CN'),避免 fallback 到英文发音
示例调用(假设使用社区插件 speech-tts):
const tts = uni.requireNativePlugin('speech-tts');
tts.speak({
text: '你好,这是系统语音',
lang: 'zh-CN',
rate: 0.8,
pitch: 1.0
}, (res) => {
console.log('朗读完成', res);
});
iOS 端限制比 Android 更严格
iOS 上系统 TTS 在 uni-app 中可用性极低,原因很实际:
- HBuilderX 默认打包不包含
AVFoundation和AVSpeechSynthesis权限链,插件需额外 link framework - 部分插件在 iOS 上仅支持后台静音朗读(无声音输出),因未正确设置
AVAudioSessioncategory - 即便成功,
AVSpeechSynthesis不支持中文 SSML 控制,语调语速调节粒度远不如 Android - 真要稳定可用,推荐改用
webview内嵌一个带SpeechSynthesis的 HTML 页面(但注意:iOS 15.4+ 才开始有限支持中文语音)
别踩「以为能跨端」这个坑
很多开发者试了 Android 成功,就默认 iOS / 微信小程序也能跑通——结果三端表现完全不同:
- Android:可调系统 TTS,延迟低,发音自然,支持离线
- iOS:多数插件失效,或需用户手动开启「辅助功能→朗读内容」开关,且仅限当前 App 内生效
- 微信小程序:完全不可用;
web Speech API被禁用;唯一办法是提前把文字转成 MP3 上传 CDN,再用<audio></audio>播放 - H5:可尝试
window.speechSynthesis,但兼容性差(Safari 仅支持英文,Chrome 对中文支持不稳定)
所以,如果项目必须多端统一,**不要押注系统 TTS,优先走百度 PAI / 阿里云 TTS 等云端方案**——虽然要发请求、有 token 管理、受网络影响,但行为可控、输出一致、无需原生适配。











