更新记录

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))
    }
})
  • 获取语言列表(仅支持Android)

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)
  • 关闭(仅支持Android)

textToSpeak.shutdown()

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: