更新记录
1.0.13(2025-08-13)
- 修复标点符号实时性问题
- 修复TTS相关问题
1.0.12(2025-08-10)
- 新增离线ASR功能
- 从手机文件选择音频识别
- 陆毅后识别 2 新增标点符号支持 3 新增 TTS功能
1.0.11(2025-07-14)
- 修复与其他插件的冲突问题
- 新增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/