更新记录
1.0.0(2025-08-30)
初始版本
平台兼容性
云端兼容性
uni-app(4.36)
Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
- |
- |
- |
- |
- |
- |
5.0 |
15 |
12 |
微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
快应用-华为 |
快应用-联盟 |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(4.42)
Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
- |
- |
5.0 |
15 |
12 |
- |
示例使用
- 点击右边“使用HBuilderX导入示例项目”,项目名称不要有中文。
- 试用插件并导入到示例项目。
- 重新打包自定义基座
平台兼容性
- 支持Android,CPU类型支持arm64-v8a,armeabi-v7a,x86
- 支持iOS,CPU类型支持arm64 最低支持到iOS15
- 支持harmony cPU类型支持arm64 最低支持到API 12
插件功能
- 文字转语音
- 支持5国男女声音,共10个人的声音音色。53种声音风格。参考api参数介绍。中国人声音选择45以后的
- 支持音速配置
- 支持自部署模型文件下载服务器配置(部分需要内网)
- 支持中英文
插件API的使用
引入插件到项目
import {TTSOptions,setResourceJson,setPrivateDownloadServer,checkAndDownloadModel,getDownloadModelStatusInfo,startConvert,getTTSAudioFile,stopConvert } from "@/uni_modules/tt-tts-plugin"
API介绍(按调用顺序)
checkAndDownloadModel(showToastStatus : boolean) : boolean
- 检查是否完成模型下载及加载初始化。只有这个返回true,才能使用后面转语音接口
- showToastStatus是否显示下载状态
- 下载一次完成后,后续不会再次下载。下次运行直接加载模型。下载只需一次
getDownloadModelStatusInfo(): string
startConvert(text : string, id : Int, speed : Double, options : TTSOptions)
getTTSAudioFile(): string
- 用于获取转换后的音频文件地址。回调成功后获取,不然没有
stopConvert()
setPrivateDownloadServer(downloadUrl : string, modelName: string)
- 需要自己部署模型下载地址的使用
- downloadUrl模型下载地址
- 需要使用时,请在checkAndDownloadModel下载前调用
模型可以在这里下载:
https://pan.baidu.com/s/13EU9eBb1nuJlH9s8orIs0A?pwd=8p5p
- modelName模型名称,参考如下:
setPrivateDownloadServer("https://xxx.xxx/xxx/models.zip", "models")
uniapp调用案例代码
<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<text class="title">{{title}}</text>
</view>
<!-- 新增的显示文本按钮 -->
<button type="primary" @click="showHello" class="action-btn">下载模型</button>
<!-- 新增的文本显示区域 -->
<view class="display-box">
<text>{{displayText}}</text>
</view>
<!-- 输入框行 -->
<view class="input-row">
<view class="input-item">
<text class="input-label">音色ID:</text>
<input type="number" v-model="voiceId" class="input-box" />
</view>
<view class="input-item">
<text class="input-label">音速:</text>
<input type="digit" v-model="voiceSpeed" class="input-box" />
</view>
</view>
<!-- 生成并播放按钮 -->
<button type="primary" @click="generateAndPlay" class="generate-btn">生成并播放</button>
<view class="text-input-container">
<input type="text" v-model="inputText" class="text-input" placeholder="请输入要转换的文本" />
</view>
</view>
</template>
<script>
import {TTSOptions,setResourceJson,setPrivateDownloadServer,checkAndDownloadModel,getDownloadModelStatusInfo,startConvert,getTTSAudioFile,stopConvert } from "@/uni_modules/tt-tts-plugin"
export default {
data() {
return {
title: 'Hello',
voiceId: 0, // 音色ID,整型,默认0
voiceSpeed: 1.0, // 音速,浮点型,默认1.0
displayText: '' ,// 新增的显示文本
inputText: '我们要不要去非洲旅游,明天告诉我下' // 新增的文本输入框内容
}
},
onLoad() {
//需要部署自己的下载服务器的使用这个接口设置
//setPrivateDownloadServer("https://xxx.xxx/xxx/models.zip", "models")
},
methods: {
generateAndPlay() {
const voiceId = Number(this.voiceId);
const voiceSpeed = Number(this.voiceSpeed);
// Validate inputs
if (isNaN(voiceId) || isNaN(voiceSpeed)) {
uni.showToast({
title: '请输入有效的数字',
icon: 'none'
});
return;
}
console.log('音色ID:', voiceId);
console.log('音速:', voiceSpeed);
console.log('输入文本:', this.inputText);
if (checkAndDownloadModel(true)) {
console.log('startConvert:', voiceId);
startConvert(this.inputText, voiceId, voiceSpeed, {
complete: (res) => {
console.log(res);
console.log(getTTSAudioFile());
}
});
} else {
uni.showToast({
title: '模型下载加载中。。。',
icon: 'none'
});
}
},
// 新增的方法:显示hello到文本区域
showHello() {
checkAndDownloadModel(true)
this.displayText = 'hello';
if(this.timer) clearInterval(this.timer);
// 目前只支持主动获取的方式,避免内存泄露
this.timer = setInterval(() => {
const downloadinfo = getDownloadModelStatusInfo();
this.displayText = downloadinfo; // 更新到视图
}, 500);
}
}
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
/* 新增的样式 */
.input-row {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 80%;
margin: 40rpx 0;
}
.input-item {
display: flex;
flex-direction: column;
align-items: flex-start;
width: 45%;
}
.input-label {
font-size: 28rpx;
color: #333;
margin-bottom: 10rpx;
}
.input-box {
width: 100%;
height: 70rpx;
border: 1px solid #ddd;
border-radius: 8rpx;
padding: 0 20rpx;
font-size: 28rpx;
}
.generate-btn {
width: 80%;
margin-top: 40rpx;
}
/* 新增的按钮样式 */
.action-btn {
width: 80%;
margin-top: 20rpx;
margin-bottom: 20rpx;
}
/* 新增的文本显示框样式 */
.display-box {
width: 80%;
min-height: 100rpx;
border: 1px solid #eee;
border-radius: 8rpx;
padding: 20rpx;
margin-bottom: 20rpx;
background-color: #f9f9f9;
word-wrap: break-word; /* 允许长单词换行 */
word-break: break-all; /* 强制所有字符换行 */
white-space: pre-wrap; /* 保留空白符,但正常换行 */
}
.display-box text {
display: inline-block; /* 确保文本元素正确换行 */
width: 100%; /* 占满容器宽度 */
}
.text-input-container {
width: 80%;
margin: 20rpx 0;
}
.text-input {
width: 100%;
height: 80rpx;
border: 1px solid #ddd;
border-radius: 8rpx;
padding: 0 20rpx;
font-size: 28rpx;
background-color: #fff;
}
</style>
本插件开发使用到sherpa onnx tts能力支持
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/