更新记录
1.0.0(2025-11-20)
TTS文字转语音,可以设置语调、语速等,支持安卓苹果鸿蒙
平台兼容性
uni-app(3.6.14)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| - |
- |
- |
- |
√ |
√ |
5.0 |
√ |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
快应用-华为 |
快应用-联盟 |
| - |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(3.7.3)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| - |
- |
5.0 |
√ |
√ |
- |
其他
TTS文字转语音,可以设置语调、语速等,支持安卓苹果鸿蒙
import {
UTSTts
} from "@/uni_modules/wrs-uts-tts"
let tts = new UTSTts()
let params = {}
switch (uni.getSystemInfoSync().platform) {
// android
case 'android': {
}
break;
case 'ios': {
}
break;
case 'harmonyos': {
let extraParam = {
}
extraParam.style = "interaction-broadcast"
extraParam.locate = "CN"
extraParam.name = "EngineName"
params.language = "zh-CN" // zh-CN、en-US
params.person = 0 // 音色。 中文:13为聆小珊女声音色(推荐使用13,同时支持0);21为凌飞哲男声音色(需下载)。 英文:8为英语(美国)劳拉女声音色(需下载)。
params.online = 1 // 模式。0为在线,目前不支持;1为离线,当前仅支持离线模式
params.extraParam = extraParam
}
break;
default:
break;
}
tts.initSpeak(params, (resp) => {
let flag = resp.flag
if (flag) {
} else {
this.showMsg("引擎初始化失败:" + JSON.stringify(resp))
}
})
tts.setCallback((resp) => {
this.showMsg(JSON.stringify(resp))
var opt = resp.opt
switch (opt) {
case "onStart":
this.showMsg("开始播放")
break;
case "onFinish":
this.showMsg("播放完成")
break;
case "onError": // 不支持iOS
this.showMsg("播放出错")
break;
case "onPause": // 不支持Android
this.showMsg("播放暂停")
break;
case "onCancel": // 仅支持ios
this.showMsg("播放取消")
break;
case "onWillSpeakRangeOfSpeechString": // 仅支持ios
this.showMsg("willSpeakRangeOfSpeechString")
break;
default:
break;
}
})
var params = {}
params.text = this.text
switch (uni.getSystemInfoSync().platform) {
// android
case 'android': {
if (this.voice) {
params.voice = this.voice // 声音
}
if (this.language) {
params.language = { // 语言
language: this.language.language,
country: this.language.country
}
}
params.params = {
utteranceId: Date.now() + "" // 声音ID,自定义
}
params.queueMode = 0 // 队列模式,0: 中断当时的播报,播报新的语音 1: 添加到当前任务之后
}
break;
case 'ios': {
params.volume = 1 // 声音大小[0~1]
if (this.voiceIdentifier) {
params.voiceIdentifier = this.voiceIdentifier
}
}
break;
case 'harmonyos': {
params.extraParam = {
// "queueMode": 0,
// "volume": 2,
// "languageContext": 'zh-CN',
// "audioType": "pcm",
// "soundChannel": 3,
// "playType": 1
}
if(this.voice) {
params.extraParam.languageContext = this.voice
}
}
break;
default:
break;
}
params.pitch = parseFloat(this.pitch) // 音调,鸿蒙音调范围[0.5, 2]
params.speechRate = parseFloat(this.speechRate) // 语速, 鸿蒙语速范围[0.5, 2]
tts.speak(params)
let params = {}
params.online = 1
tts.getVoices(params, (resp) => {
let voices = resp.voices
if (voices) {
var itemList = []
var length = voices.length
for (var i = 0; i < length; i++) {
var model = voices[i]
var title = "--"
switch (uni.getSystemInfoSync().platform) {
// android
case 'android': {
title = model.name + "(" + model.locale.displayName + ")"
}
break;
case 'ios': {
title = model.name + "(" + model.language + ")"
}
break;
case 'harmonyos': {
title = model.language
}
break;
default:
break;
}
itemList.push(title)
}
this.showActionSheet(itemList, (i) => {
switch (uni.getSystemInfoSync().platform) {
// android
case 'android': {
this.voice = voices[i].name
}
break;
case 'ios': {
this.voiceIdentifier = voices[i].identifier
}
break;
case 'harmonyos': {
this.voice = voices[i].language
}
break;
default:
break;
}
})
} else {
this.showMsg("获取失败!" + JSON.stringify(resp))
}
})
let locales = textToSpeak.getAvailableLocales()
var localesArray = JSON.parse(locales)
var itemList = []
var length = localesArray.length
for (var i = 0; i < length; i++) {
var model = localesArray[i]
var title = model.displayName + "(" + model.displayLanguage + ")"
itemList.push(title)
}
this.showActionSheet(itemList, (i) => {
var model = localesArray[i]
this.language = {
language: model.language,
country: model.country
}
})
var params = {}
params.boundary = 0 // 仅支持iOS, 0: 马上停止 1: 说完一个单词再停止
textToSpeak.stop(params)
textToSpeak.shutdown()