更新记录
1.0.0(2026-10-26)
- 支持 Android、iOS、鸿蒙、Web、小程序及元服务文字转语音。
- 支持音色选择、语速、音调、音量调节与停止朗读。
平台兼容性
uni-app(4.86)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
uni-app x(4.86)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
umi-tts
基本使用
import { speak, stop, destroy, isSpeaking } from '@/uni_modules/umi-tts'
import { TtsError } from '@/uni_modules/umi-tts/utssdk/interface.uts'
speak({
text: '你好,欢迎使用文字合成语音。',
language: 'zh-CN',
voiceId: '', // 默认音色;其他音色请填写 getVoices 返回的 id
rate: 1,
pitch: 1,
volume: 1,
onStart: () => { console.log('开始朗读') },
success: (result) => { console.log(result.errMsg) },
fail: (error: TtsError) => { console.log(error.errCode, error.errMsg) },
complete: () => { console.log('任务结束') }
})
// isSpeaking() 包含初始化、网络合成、加载音频和实际播报阶段。
// stop() 取消当前任务,触发 fail(903003) 与 complete。
// destroy() 停止并释放资源,同时清空服务端配置。
调用 speak 后,通过回调了解朗读进度,函数本身不返回结果。整段文字朗读完毕才会调用 success,准备语音或下载音频完成时不会调用。
一次只能朗读一段文字。如果上一段还在准备或朗读,再次调用会返回错误码 903002,上一段会继续朗读。想换一段文字时,先调用 stop(),再调用 speak()。每次调用结束时,会先调用 success 或 fail,再调用 complete。
| SpeakOptions 字段 | 默认值 | 说明 |
|---|---|---|
| text | 必填 | 要朗读的文字,不能是空字符串或只有空格。长度上限为 4000,超过会报错,需要自行分段;大多数常用汉字计 1,部分表情计 2 |
| language | zh-CN | 朗读使用的语言,例如 zh-CN 为普通话、en-US 为美式英语。能否使用取决于设备、浏览器或服务端是否支持 |
| voiceId | 空字符串 | 发音人的音色 ID,从 getVoices 返回的列表中选择。不填或填空字符串时使用默认音色;具体音色应与 language 匹配 |
| rate | 1 | 语速,范围 0.5–2。小于 1 更慢,大于 1 更快;相同数值在不同平台上可能听起来略有差别 |
| pitch | 1 | 音调,范围 0.5–2。小于 1 更低沉,大于 1 更高;小程序和元服务需要服务端支持调整音调 |
| volume | 1 | 音量,范围 0–1。0 为静音,1 为最大音量;小程序和元服务在播放音频时调整,不发送给服务端 |
| onStart | 无 | 开始出声朗读时调用,每段文字最多调用一次 |
| success | 无 | 整段文字朗读完毕时调用,返回 { errMsg: 'speak:ok' } |
| fail | 无 | 朗读失败或被取消时调用,返回 errCode(错误码)和 errMsg(原因说明) |
| complete | 无 | 这次调用结束时都会调用,包括成功、失败和取消,不返回参数 |
目前不支持暂停后继续、自动排队、保证后台持续朗读或导出音频文件。同一个应用中的多个页面共用一个朗读任务。示例会在页面隐藏时调用 stop(),离开并卸载页面时调用 destroy()。
音色与音调
音色是选择谁来朗读,音调是调整这个声音的高低,两项可以单独设置。例如,先选择某位发音人,再用 pitch 调低声音。调高、调低音调不会切换发音人。
使用 getVoices 获取当前平台提供的音色,再把选中音色的 id 传给 speak:
import { getVoices, speak } from '@/uni_modules/umi-tts'
import { TtsVoice } from '@/uni_modules/umi-tts/utssdk/interface.uts'
let selectedVoiceId = ''
getVoices({
language: 'zh-CN',
success: (voices: Array<TtsVoice>) => {
console.log('可选音色', voices)
// 实际页面可以展示列表,让用户选择。此处示意选择第一项。
selectedVoiceId = voices.length > 0 ? voices[0].id : ''
},
fail: (error) => { console.log(error.errMsg) }
})
// 绑定到朗读按钮,由用户点击调用,避免浏览器限制自动发声。
function speakWithVoice() {
speak({ text: '你好,这是选中的发音人。', language: 'zh-CN', voiceId: selectedVoiceId, pitch: 1 })
}
| getVoices 参数 | 说明 |
|---|---|
| language | 可选,按语言筛选音色,例如 zh-CN;不填时返回全部可查询音色。zh-CN 和 zh_CN 视为相同语言 |
| success | 成功时返回音色数组,每项包含 id(选择用的标识)、name(显示名称)、language(适用语言) |
| fail | 读取失败时返回错误码和原因,不会中断正在朗读的内容 |
| complete | 查询结束时调用,无参数 |
| 平台 | 音色列表来源 |
|---|---|
| Android | 当前系统 TTS 引擎提供的音色,名称可能是引擎内部名称 |
| iOS | 系统提供的音色名称及标识 |
| HarmonyOS | 设备可用的离线音色 |
| Web | 浏览器提供的音色 |
| 小程序、元服务 | configureTtsService 中配置的真实业务音色列表 |
音色名称和数量取决于设备、语音引擎或服务端,不保证一定有男声、女声,也不会根据名字猜测性别。列表为空时仍可使用“默认音色”;刷新列表不会停止当前朗读。切换音色影响下一次朗读,不改变正在播放的声音。
Android 的 zh-CN 音色列表可能包含标记为 zh 或 zh-Hans 的音色,不包含明确不匹配的地区或简繁体音色,例如 zh-Hant。音色名称相同但 ID 不同时,仍可能是不同音色。
音色 ID 不能跨平台通用,切换语言或语音引擎后应重新查询。App 与 Web 指定的音色失效或语言不匹配时会报错,请刷新列表后重新选择。小程序和元服务会把所选 voiceId 发给服务端,由服务端检查并使用对应发音人。
小程序与元服务服务端协议
import { configureTtsService, speak } from '@/uni_modules/umi-tts'
configureTtsService({
url: 'https://你的业务域名/api/tts',
token: '业务短期访问凭证', // 可选,非云厂商 SecretKey
voices: [ // 可选,请填写业务服务实际支持的 ID 和名称
{ id: 'speaker-a', name: '发音人 A', language: 'zh-CN' },
{ id: 'speaker-b', name: '发音人 B', language: 'zh-CN' }
]
})
speak({ text: '这段文字将发送至业务服务端', voiceId: 'speaker-a', rate: 1, pitch: 1 })
configureTtsService 只用于小程序和元服务,在 App 与 Web 调用没有效果。voices 用于展示音色列表,应填写服务端实际支持的音色。未配置时 getVoices 返回空数组,仍可用默认音色朗读。修改配置只影响后续任务。调用 destroy 后接口、凭证与音色列表都会清空,需重新配置。
请求为 HTTPS POST,30 秒超时:
Content-Type: application/json
Authorization: Bearer 业务短期访问凭证
{"text":"你好","language":"zh-CN","voiceId":"speaker-a","rate":1,"pitch":1}
未配置 token 时 Authorization 为空。接口必须返回 HTTP 200 与 JSON:
{"audioUrl":"https://你的音频域名/临时签名地址.mp3"}
接口需支持传入的语言、音色、语速和音调,不支持时应返回错误。voiceId 为空字符串表示默认音色。返回的 HTTPS 音频地址必须可直接播放,播放请求不携带上述 Authorization。请勿在小程序或元服务中配置云厂商密钥。使用前需自行准备可用的语音合成接口;取消任务不保证撤销服务端合成计费。
微信配置 request 合法域名,以及音频下载/播放域名;其他小程序按宿主要求配置。元服务需在独立工程配置网络访问、AppID、包名和签名。开发阶段关闭域名校验不能替代发布配置。
原生及 Web 注意事项
- Android 无需录音权限。初始化最多等待 15 秒;缺少语音引擎或语言包时会失败。是否需要联网取决于设备使用的语音引擎。
- iOS 的声音路由、静音策略及与其他音频的协调需由应用按业务配置。
- HarmonyOS 需要可用的离线语言资源和音色,初始化最多等待 15 秒。
- Web 必须在用户交互中调用,不支持语音合成的浏览器会返回失败。不保证离线可用;停止朗读可能影响页面内其他语音库的播报,请避免同时使用。
- 操作系统/浏览器中断、后台挂起可能影响回调与播放。本插件不申请后台运行能力。
错误码
| errCode | 意义 |
|---|---|
| 903001 | 参数无效 |
| 903002 | 已有任务正在执行 |
| 903003 | 主动取消或系统取消 |
| 903004 | 不支持、未配置、初始化、网络、合成或播放失败;详见 errMsg |

收藏人数:
购买源码授权版(
试用
使用 HBuilder 导入示例项目
赞赏(0)
下载 1498
赞赏 4
下载 12716143
赞赏 1958
赞赏
京公网安备:11010802035340号