更新记录

1.0.13(2025-08-13)

  1. 修复标点符号实时性问题
  2. 修复TTS相关问题

1.0.12(2025-08-10)

  1. 新增离线ASR功能
    • 从手机文件选择音频识别
    • 陆毅后识别 2 新增标点符号支持 3 新增 TTS功能

1.0.11(2025-07-14)

  1. 修复与其他插件的冲突问题
  2. 新增LICENSE.txt,Apache-2.0 license文件
查看更多

平台兼容性

云端兼容性

阿里云 腾讯云 支付宝云

uni-app(4.42)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - - - 5.0 - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

uni-app x(4.42)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - 5.0 - - -

插件功能

  • 在线ASR 语音转文本

    • UI 风格
    • 后台服务,用户自定义UI
    • 模型下载可以配置自己的下载服务器地址。
    • 模型下载,支持进度查询,用户实现自定义UI
    • 支持热词功能
    • 支持中英文
  • 离线ASR 语音转文本

    • 从手机文件目录选取音频文件进行识别
    • 后台录音,录音后进行识别
    • 音频文件地址返回用户
    • 模型下载可以配置自己的下载服务器地址。
    • 模型下载,支持进度查询,用户实现自定义UI
    • 支持拼音词组匹配替换。类似热词,但是不是热词。后续会有介绍
    • 支持中英文
  • 标点符号功能

    • 模型加载成功后,可以给识别文本加上标点符号
    • 提供API,给文本加标点符号
    • 模型下载,支持进度查询,用户实现自定义UI
    • 支持中英文
  • TTS 文本转语音

    • 文字转语音
    • 支持5国男女声音,共10个人的声音音色。53种声音风格。参考api参数介绍
    • 支持音速配置
    • 支持自部署模型文件下载服务器配置(部分需要内网)
    • 支持中英文
    • 模型下载,支持进度查询,用户实现自定义UI

示例使用

  • 点击右边“使用HBuilderX导入示例项目”,项目名称不要有中文。
  • 试用插件并导入到示例项目。
  • 重新打包自定义基座

平台兼容性

  • 支持Android,CPU类型支持arm64-v8a,armeabi-v7a,x86

插件API的使用

引入插件到项目

所有API导入

import {ASROptions,checkDownloadModels,getDownloadModelStatusInfo,asrSetHotwords,asrRecognizeWithUI,asrRecognizeWithoutUIInit,asrRecognizeWithoutUIStart,getASRWithNoUIResult,asrRecognizeWithoutUIStop,asrRecognizeWithoutUIDestory,setOwnOfflineASRDownloadUrls, checkOfflineASRDownloadAndLoadModels, getOfflineASRDownloadModelStatus,startOflineASRPickAudioFile, startOflineASRAudioRecord, stopOflineASRAudioRecord,setOwnPunctuationDownloadUrls, checkPunctuationDownloadAndLoadModels,getPunctuationDownloadModelStatus,addPunctuation,TTSOptions,setTTSOwnDownloadUrls,checkAndDownloadTTSModel,getTTSDownloadModelStatusInfo,startTTSConvert,getTTSAudioFile,stopTTSConvert} from "@/uni_modules/zz-asr-recognize"  

只导入在线ASR

import {ASROptions,checkDownloadModels,getDownloadModelStatusInfo,asrSetHotwords,asrRecognizeWithUI,asrRecognizeWithoutUIInit,asrRecognizeWithoutUIStart,getASRWithNoUIResult,asrRecognizeWithoutUIStop,asrRecognizeWithoutUIDestory} from "@/uni_modules/zz-asr-recognize" 

只导入离线ASR

import {ASROptions,setOwnOfflineASRDownloadUrls, checkOfflineASRDownloadAndLoadModels, getOfflineASRDownloadModelStatus,startOflineASRPickAudioFile, startOflineASRAudioRecord, stopOflineASRAudioRecord} from "@/uni_modules/zz-asr-recognize" 

只导入标点符号

import {ASROptions,setOwnPunctuationDownloadUrls, checkPunctuationDownloadAndLoadModels,getPunctuationDownloadModelStatus,addPunctuation} from "@/uni_modules/zz-asr-recognize" 

只导入TTS

import {TTSOptions,setTTSOwnDownloadUrls,checkAndDownloadTTSModel,getTTSDownloadModelStatusInfo,startTTSConvert,getTTSAudioFile,stopTTSConvert} from "@/uni_modules/zz-asr-recognize"

在线ASR API

function checkDownloadModels(showToastStatus : boolean) : boolean

  • 检查模型是否已下载完成,true为下载并加载完成,可以使用
  • 需要配置自己的下载服务器地址,使用setOwnDownloadUrls接口。后续介绍。建议自己的下载服务器,稳定可控。特别只有内网环境的用户。

function getDownloadModelStatusInfo(): string

  • 获取下载加载的进度:返回结果是一个JSON数据格式,downloadStatus:0,下载未开始,1,下载中(downloadModelWholeSize:下载总大小,downloadingModelSize:已下载的大小),2,下载文件进行合并中, 3 合并完成进行解压缩中, 4. 模型文件下载并完成所有过程'

function asrRecognizeWithUI(options : ASROptions)

  • 模型加载完成调用
  • 此接口会弹出一个语音识别的UI,长按进行识别,识别结果返回。

function asrRecognizeWithoutUIInit(params : string) : boolean 后台识别第一步

  • 模型加载完成调用
  • 后台识别服务开始,此时没有真正识别,只是启动了服务。
  • 这是用户自定义UI进行ASR的第一步。必须调用按照顺序调用

function asrRecognizeWithoutUIStart() : boolean 后台识别第二步

  • 开启录音进行识别
  • 结果实时通过第三步接口获取。

function getASRWithNoUIResult(): string 后台识别第三步

  • 获取识别结果

function asrRecognizeWithoutUIStop() 后台识别第四步

  • 停止录音识别,此时服务没有停止,可以再次调用第二步进行下一轮识别

function asrRecognizeWithoutUIDestory() 后台识别第五步

  • 停止识别服务,调用后要重新识别,必须重新按顺序调用

function asrSetHotwords(hotwords : string)

  • 设置热词
  • 效果:热词设置前,语音识别后由:周旺军 -> 周望君 ,识别更精准
  • 此接口必须在初始化模型即调用checkDownloadModels之前调用。

function setOwnDownloadUrls(url : string)

  • 配置自己的下载服务器
  • 通过下面地址获取模型,部署到自己的服务器
链接:https://pan.baidu.com/s/1cYaDaVzdvM3QYVmgrGNgGA 
提取码:f8kc
这是案例:
setOwnDownloadUrls("https://xxx.com/download/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.zip");

离线ASR API

function checkOfflineASRDownloadAndLoadModels(showToastStatus : boolean) : boolean

  • 检查模型是否已下载完成,true为下载并加载完成,可以使用
  • 需要配置自己的下载服务器地址,setOwnOfflineASRDownloadUrls。后续介绍。建议自己的下载服务器,稳定可控。特别只有内网环境的用户。

function getOfflineASRDownloadModelStatus(): string

  • 获取下载加载的进度:返回结果是一个JSON数据格式,downloadStatus:0,下载未开始,1,下载中(downloadModelWholeSize:下载总大小,downloadingModelSize:已下载的大小),2,下载文件进行合并中, 3 合并完成进行解压缩中, 4. 模型文件下载并完成所有过程'

function startOflineASRPickAudioFile(options : ASROptions)

  • 模型加载完成调用
  • 自动跳转到手机文件目录选取音频文件进行识别
  • 返回识别结果
  • 返回音频文件地址
    {
    "result": "识别结果",
    "audioFile": "/data/user/0/uni.app.xxx/files/audio_saved.wav",
    "status": "success"
    }

function startOflineASRAudioRecord(options : ASROptions)

  • 开始录音
  • 使用系统录音后进行识别。
  • 调用下面接口后,停止录音,生成录音文件,开始识别
  • 返回的结果和上面一个接口类似

function stopOflineASRAudioRecord()

  • 停止录音

function setOwnOfflineASRDownloadUrls(url : string)

  • 配置自己的下载服务器
  • 通过下面地址获取模型,部署到自己的服务器
    https://pan.baidu.com/s/1IVgFl6OoE1_gbiZyiK5c1g?pwd=kh6f
    这是案例:
    setOwnOfflineASRDownloadUrls("https://xxx.com/download/sherpa-onnx-zipformer-zh-en-2023-11-22.zip");

    拼音词组匹配替换

  • 请参考此功能详情:https://k2-fsa.github.io/sherpa/onnx/homophone-replacer/index.html
  • 生成好的replace.fst放到放到插件的asset目录下 点击查看示例图片
  • sherpa 团队提供了在线生成工具(需要国际网络): https://colab.research.google.com/drive/1jEaS3s8FbRJIcVQJv2EQx19EM_mnuARi?usp=sharing
  • 替换完成重新打包自定义基座

标点符号API

function checkPunctuationDownloadAndLoadModels(showToastStatus : boolean) : boolean

  • 检查模型是否已下载完成,true为下载并加载完成,可以使用
  • 需要配置自己的下载服务器地址,setOwnPunctuationDownloadUrls。后续介绍。建议自己的下载服务器,稳定可控。特别只有内网环境的用户。

function getPunctuationDownloadModelStatus(): string

  • 获取下载加载的进度:返回结果是一个JSON数据格式,downloadStatus:0,下载未开始,1,下载中(downloadModelWholeSize:下载总大小,downloadingModelSize:已下载的大小),2,下载文件进行合并中, 3 合并完成进行解压缩中, 4. 模型文件下载并完成所有过程'

function addPunctuation(text: string): string

  • 给文本打标点符号

function setOwnPunctuationDownloadUrls(urls : string) : boolean

  • 配置自己的下载服务器
  • 通过下面地址获取模型,部署到自己的服务器
    https://pan.baidu.com/s/1auFpC-QVcS8Yurenijl3bA?pwd=ty2p
    这是案例:
    setOwnPunctuationDownloadUrls("https://xxx.com/download/sherpa-onnx-punct.zip");

TTS API

function checkAndDownloadTTSModel(showToastStatus : boolean) : boolean

  • 检查模型是否已下载完成,true为下载并加载完成,可以使用
  • 需要配置自己的下载服务器地址,使用setOwnDownloadUrls接口。后续介绍。建议自己的下载服务器,稳定可控。特别只有内网环境的用户。

function getTTSDownloadModelStatusInfo(): string

  • 获取下载加载的进度:返回结果是一个JSON数据格式
    {
    "downloadedFileSizeSum": 33333333,  ---已下载的大小
    "downloadStatus": 2,                ---状态:-1:下载失败 0:初始状态 1:下载中 2: 下载完成,解压中 3:解压完成加载模型中。4:加载模型完成
    "fileSizeSum": 444444444            ---总共的大小
    }

function startTTSConvert(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 用于回调结果

function getTTSAudioFile(): string

  • 用于获取转换后的音频文件地址。回调成功后获取,不然没有

function stopTTSConvert()

  • 用于停止播放

function setTTSOwnDownloadUrls(downloadUrl : string, modelName: string)

  • 需要自己部署模型下载地址的使用
    模型可以在这里下载:
    https://pan.baidu.com/s/13EU9eBb1nuJlH9s8orIs0A?pwd=8p5p
  • downloadUrl模型下载地址
  • 需要使用时,请在checkAndDownloadModel下载前调用
  • modelName模型名称,参考如下:
    setTTSOwnDownloadUrls("https://xxx.xxx/xxx/models.zip", "models")

uniapp demo页面API调用案例

<template>
    <view class="content">
        <view class="text-area" style="background-color: red;">
            <text class="title">以下是在线ASR功能</text>
        </view>
        <button @tap="checkAndDownload">检查ASR模型是否下载并进行下载(在线)</button>
        <view class="text-area">
            <text class="title">{{downloadinfo}}</text>
        </view>
        <view class="text-area">
            <text class="title">{{hotwordsInfo}}</text>
        </view>
        <button @tap="setHotwords">设置热词(在线)</button>
        <button @tap="asrWithUI">使用插件UI进行ASR(在线)</button>
        <view class="text-area">
            <text class="title">{{recognizeInfo1}}</text>
        </view>
        <button @tap="asrWithoutUIInit">不使用插件UI进行ASR初始化(在线)</button>
        <button @tap="asrWithoutUIStart">不使用插件UI进行ASR识别开始(在线)</button>
        <button @tap="asrWithoutUIStop">不使用插件UI进行ASR识别暂停(在线)</button>
        <button @tap="asrWithoutUIDestory">不使用插件UI进行ASR停止(在线)</button>
        <view class="text-area">
            <text class="title">{{result}}</text>
        </view>
        <view class="text-area" style="background-color: red;">
            <text class="title">以下是离线ASR功能</text>
        </view>
        <button @tap="checkAndDownloadoffline">检查ASR模型是否下载并进行下载(离线)</button>
        <view class="text-area">
            <text class="title">{{downloadinfo2}}</text>
        </view>
        <button @tap="openFileOfflineASR">从手机上选择音频文件进行ASR(离线)</button>
        <button @tap="recordOfflineASR">录音开始(离线)</button>
        <button @tap="stopRecordOfflineASR">停止录音开始ASR(离线)</button>
        <view class="text-area">
            <text class="title">{{recognizeInfo2}}</text>
        </view>

        <view class="text-area" style="background-color: red;">
            <text class="title">以下是标点符号功能,模型加载好后,识别结果会有标点符号</text>
        </view>
        <!-- 新增的显示文本按钮 -->
        <button type="primary" @click="downloadPunc" class="action-btn">下载并初始化标点符号模型</button>
        <!-- 新增的文本显示区域 -->
        <view class="display-box">
            <text>{{puncdisplayText}}</text>
        </view>

        <view class="text-area" style="background-color: red;">
            <text class="title">以下是TTS功能</text>
        </view>
        <!-- 新增的显示文本按钮 -->
        <button type="primary" @click="showHello" class="action-btn">下载TTS模型</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>
        <button type="primary" @click="stophere" class="generate-btn">停止播放</button>
    </view>
</template>

<script>
    import {ASROptions,checkDownloadModels,getDownloadModelStatusInfo,asrSetHotwords,asrRecognizeWithUI,asrRecognizeWithoutUIInit,asrRecognizeWithoutUIStart,getASRWithNoUIResult,asrRecognizeWithoutUIStop,asrRecognizeWithoutUIDestory,setOwnOfflineASRDownloadUrls, checkOfflineASRDownloadAndLoadModels, getOfflineASRDownloadModelStatus,startOflineASRPickAudioFile, startOflineASRAudioRecord, stopOflineASRAudioRecord,setOwnPunctuationDownloadUrls, checkPunctuationDownloadAndLoadModels,getPunctuationDownloadModelStatus,addPunctuation,TTSOptions,setTTSOwnDownloadUrls,checkAndDownloadTTSModel,getTTSDownloadModelStatusInfo,startTTSConvert,getTTSAudioFile,stopTTSConvert} from "@/uni_modules/zz-asr-recognize"

    export default {
        data() {
            return {
                hotwordsInfo:'热词用‘##’进行分隔,如:带权重的:“周望君 :5.0##蒋有伯 :4.0##朱丽楠 :3.0” 不带权重的:“周望君##蒋有伯##朱丽楠”',
                recognizeInfo1:'使用UI的实时识别结果',
                recognizeInfo2:'离线识别结果区域',
                result: '不使用UI的实时识别结果',
                downloadinfo: '下载状态更新显示,这是一个JSON数据格式,downloadStatus: 0,下载未开始,1,下载中(downloadModelWholeSize:下载总大小,downloadingModelSize:已下载的大小),2,下载文件进行合并中, 3 合并完成进行解压缩中, 4. 模型文件下载并完成所有过程',
                downloadinfo2: '下载状态更新显示,这是一个JSON数据格式,downloadStatus: 0,下载未开始,1,下载中(downloadModelWholeSize:下载总大小,downloadingModelSize:已下载的大小),2,下载文件进行合并中, 3 合并完成进行解压缩中, 4. 模型文件下载并完成所有过程',
                voiceId: 0,       // 音色ID,整型,默认0
                voiceSpeed: 0.8,   // 音速,浮点型,默认1.0
                displayText: '' ,// 新增的显示文本
                puncdisplayText: '标点符号下载加载进度,成功后,识别的文本会自动加上标点符号',
                inputText: '我们要不要去非洲旅游,明天告诉我下'      // 新增的文本输入框内容
            }
        },
        onLoad() {

        },
        methods: {
            checkAndDownload() {
                const that = this;
                checkDownloadModels(true);
                if(this.timer) clearInterval(this.timer);

                // 目前只支持主动获取的方式,避免内存泄露
                this.timer = setInterval(() => {
                    const downloadinfo = getDownloadModelStatusInfo();
                    this.downloadinfo = downloadinfo; // 更新到视图
                }, 500);
            },
            setHotwords() {
                asrSetHotwords("");
                // asrSetHotwords("周望君 :5.0##蒋有伯 :4.0##朱丽楠 :3.0##元宇宙 :5.0");
            },
            asrWithUI() {
                if (!checkDownloadModels(true)) {
                    return;
                }
                const that = this;
                const succ = asrRecognizeWithUI({  
                    params: '{"recognizeType": 0,"showBeep": true,"imgLocation": 0,"pickTextFromImg": false,"pickTextAreaType": 3,"textAreaType": 1}',  
                    complete: (res) => {  
                        console.log(res);
                        that.recognizeInfo1 = res;
                    }  
                });
                if (!succ) {
                    uni.showToast({
                        title: '模型下载中...!',
                        icon: 'error', // 可选值:success/error/none
                        duration: 3000,   // 默认 1500ms
                        position: 'bottom' // 可选值:top/center/bottom
                      });
                } 
            },
            asrWithoutUIInit() {
                if (!checkDownloadModels(true)) {
                    return;
                }
                const that = this;
                const succ = asrRecognizeWithoutUIInit('{"recognizeType": 0,"showBeep": true,"imgLocation": 0,"pickTextFromImg": false,"pickTextAreaType": 3,"textAreaType": 1}');
                if (!succ) {
                    uni.showToast({
                        title: '模型下载中...!',
                        icon: 'error', // 可选值:success/error/none
                        duration: 3000,   // 默认 1500ms
                        position: 'bottom' // 可选值:top/center/bottom
                      });
                } 
            },
            asrWithoutUIStart() {
                const succ = asrRecognizeWithoutUIStart();
                if (!succ) {
                    uni.showToast({
                        title: '模型未初始化,请调用asrRecognizeWithoutUIStart...!',
                        icon: 'error', // 可选值:success/error/none
                        duration: 3000,   // 默认 1500ms
                        position: 'bottom' // 可选值:top/center/bottom
                      });
                      return;
                } 
                if(this.timer) clearInterval(this.timer);

                // 目前只支持主动获取的方式,避免内存泄露
                this.timer = setInterval(() => {
                    const result = getASRWithNoUIResult();
                    this.result = result; // 更新到视图
                }, 500);
            },
            asrWithoutUIStop() {
                asrRecognizeWithoutUIStop();
            },
            asrWithoutUIDestory() {
                asrRecognizeWithoutUIDestory();
            },

            checkAndDownloadoffline() {
                const that = this;
                checkOfflineASRDownloadAndLoadModels(true);
                if(this.timer) clearInterval(this.timer);

                // 目前只支持主动获取的方式,避免内存泄露
                this.timer = setInterval(() => {
                    const downloadinfo = getOfflineASRDownloadModelStatus();
                    this.downloadinfo2 = downloadinfo; // 更新到视图
                }, 500);
            },
            openFileOfflineASR() {
                const that = this;
                startOflineASRPickAudioFile({
                    params: "",  
                    complete: (res) => {  
                        console.log(res);
                        that.recognizeInfo2 = res;
                    }  
                });
            },
            recordOfflineASR() {
                const that = this;
                startOflineASRAudioRecord({
                    params: "",  
                    complete: (res) => {  
                        console.log(res);
                        that.recognizeInfo2 = res;
                    }  
                });
            },
            stopRecordOfflineASR() {
                stopOflineASRAudioRecord();
            },

            downloadPunc() {
                const that = this;
                checkPunctuationDownloadAndLoadModels(true);
                if(this.timer) clearInterval(this.timer);

                // 目前只支持主动获取的方式,避免内存泄露
                this.timer = setInterval(() => {
                    const downloadinfo = getPunctuationDownloadModelStatus();
                    this.puncdisplayText = downloadinfo; // 更新到视图
                }, 500);
            },

            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 (checkAndDownloadTTSModel(true)) {
                        console.log('startConvert:', voiceId);
                        startTTSConvert(this.inputText, voiceId, voiceSpeed, {  
                            complete: (res) => {  
                                console.log(res);
                                console.log(getTTSAudioFile());
                            }
                        });
                    } else {
                        uni.showToast({
                            title: '模型下载加载中。。。',
                            icon: 'none'
                        });
                    }

            },
            stophere() {
                stopTTSConvert()
            },
            // 新增的方法:显示hello到文本区域
            showHello() {
                checkAndDownloadTTSModel(true)
                this.displayText = 'hello';
                if(this.timer) clearInterval(this.timer);

                // 目前只支持主动获取的方式,避免内存泄露
                this.timer = setInterval(() => {
                    const downloadinfo = getTTSDownloadModelStatusInfo();
                    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 {
        width: 100%; 
        padding: 10rpx;
        box-sizing: border-box;
        display: flex;
        justify-content: center;
    }

    .title {
        /* 自动换行核心样式 */
          white-space: normal;       /* 允许自动换行 */
          overflow-wrap: break-word; /* 强制单词内换行 */
          word-break: break-all;     /* 允许在任意字符处换行 */

          /* 可选辅助样式 */
          font-size: 28rpx;
          color: #333;
          line-height: 1.5;
          text-align: left;

          /* 调试边框(移除生产环境) */
          border: 1px solid #eee;
    }

    /* 新增的样式 */
    .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>

//TTS -end

此功能使用到了sherpa onnx能力。 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. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

没有广告