更新记录

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

  • 获取下载状态,需要的可以用于ui显示进度
  • 返回结果为json格式数据,如下:
    {
    "downloadedFileSizeSum": 33333333,  ---已下载的大小
    "downloadStatus": 2,                ---状态:-1:下载失败 0:初始状态 1:下载中 2: 下载完成,解压中 3:解压完成加载模型中。4:加载模型完成
    "fileSizeSum": 444444444            ---总共的大小
    }

startConvert(text : string, id : Int, speed : Double, options : TTSOptions)

  • 开始文本转语音,成功后回掉success,这时候可以调用下面的接口获取音频文件地址。回调其他为失败
  • text 要转换的文本,不可以为空
  • id 语音音色,不同人不同风格的声音id,选择一个你需要的。(必须在0-52中选一个)具体情况如下。
    af -> American female   0-10
    am -> American male    11-21
    bf -> British female   22-23
    bm -> British male     24-30
    hf -> Hindi female     31-32
    bm -> Hindi male       33-38
    jf -> Japanese female  39-40
    jm -> Japanese male    41-44
    zf -> Chinese female   45-48
    zm -> Chinese male     49-52
  • speed 默认为1.语速自行设置
  • options 用于回调结果

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/

隐私、权限声明

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

<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" /> <uses-permission android:name= "android.permission.FOREGROUND_SERVICE_DATA_SYNC"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"

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

不采集数据 不发送数据 只下载模型

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

没有广告

暂无用户评论。