App端语音合成必须用plus.audio.createSpeech,因uni.getBackgroundAudioManager不支持TTS;需在plus.ready后调用,指定lang: 'zh-CN',并处理Android厂商引擎差异。

uni-app App端语音合成用 plus.audio.createSpeech 而不是 uni.getBackgroundAudioManager
App端(iOS/Android)的语音播报必须走原生层,uni.getBackgroundAudioManager 是为背景音频设计的,不支持 TTS(文本转语音),强行用会静音或报错 errCode: 1001。真正能用的是 plus.audio.createSpeech —— 这是 uni-app 封装的 5+ Runtime 原生语音合成接口,仅在 App 环境下可用。
常见错误现象:
• 调用 uni.createInnerAudioContext() 播放 base64 音频失败(TTS 不生成音频文件)
• H5 或小程序里能跑的语音逻辑,在 App 端完全没声音
• 控制台无报错但 onStart 不触发,其实是 createSpeech 初始化失败没 catch
- 只在 App 环境生效:需用
uni.getSystemInfoSync().platform === 'app'包裹调用 - 必须等
plus.ready触发后才能用,否则plus.audio未加载 - 中文需指定
lang: 'zh-CN',否则 iOS 默认英文发音(Android 有时自动识别,但不稳定) - 语音质量依赖系统引擎:iOS 用 Siri 引擎,Android 各厂商差异大(华为、小米可能需要用户手动启用 TTS 服务)
如何正确初始化并播放一句话
不能直接 new 实例就播,plus.audio.createSpeech 返回的是一个对象,要显式调用 start(),且需处理平台兼容性兜底。
if (uni.getSystemInfoSync().platform === 'app') {
plus.ready(() => {
const speech = plus.audio.createSpeech('你好,欢迎使用', {
lang: 'zh-CN',
voice: 'xiaoyan', // Android 可选,iOS 忽略
pitch: 1,
rate: 1
});
speech.start();
speech.onerror = (e) => {
console.error('TTS error:', e.message); // 如 'No TTS engine available'
};
});
}
-
voice参数在 Android 上可选(如xiaoyan、yunyan),iOS 不识别,填了也无效 -
pitch(音调)和rate(语速)取值范围都是 0.5–2,超出会被截断,设成 0 或 3 不报错但无效果 - 同一时间只能有一个
speech实例在播放,重复调用start()会中断前一个 —— 如需队列,得自己维护状态 - 没网络时 iOS 仍可播(离线引擎),但部分 Android 厂商(如 OPPO)TTS 需联网下载语音包,首次可能卡住
遇到「No TTS engine available」怎么办
这不是代码写错了,是用户设备没启用系统级语音合成功能,尤其 Android 碎片化严重。
- iOS:设置 → 辅助功能 → 朗读内容 → 开启「朗读所选内容」即可(无需额外安装)
- Android:进入「设置 → 语言与输入 → 文字转语音(TTS)输出」,确认默认引擎已安装并设为启用
- 华为/荣耀用户常卡在「智慧语音」未开启,需去「设置 → 智慧助手 → 智慧语音」里打开
- 代码里可加提示:
speech.onerror捕获后,弹出uni.showToast({ title: '请在系统设置中启用文字转语音' })
为什么不用 WebView 内嵌 Web Speech API
因为 App 端的 window.speechSynthesis 在 5+ WebView 中被禁用(安全策略),即使写了也不会触发 onvoiceschanged,getVoices() 返回空数组,speechSynthesis.speak() 静默失败。
- 这不是 bug,是 5+ Runtime 明确限制:Web Speech API 仅在 H5 环境(即浏览器中)可用
- 试图用
uni.navigateTo({ url: 'tts.html' })打开本地 HTML 也无效——该页面仍在 5+ WebView 容器内 - 所以别绕路,老实用
plus.audio.createSpeech,它是唯一稳定路径
真正麻烦的是 Android 多厂商 TTS 引擎行为不一致,比如小米可能把「小艺」当默认,但不支持 lang: 'zh-CN' 参数;测试时至少覆盖华为、小米、OPPO、vivo 的最新系统版本,别只信模拟器。










