From cd86b70a358a24c5521850f8e52e0bd34a83c86c Mon Sep 17 00:00:00 2001
From: huliyong <2783385703@qq.com>
Date: Sat, 13 Sep 2025 14:21:10 +0800
Subject: [PATCH] 1
---
UniApp微信小程序TTS接口调用说明.md | 364 -------------
.../src/main/resources/application-dev.yml | 2 +-
uniapp-tts-config.js | 243 ---------
uniapp-tts-example.vue | 591 ---------------------
uniapp-tts-service.js | 429 ---------------
uniapp-tts-simple-example.vue | 522 ------------------
6 files changed, 1 insertion(+), 2150 deletions(-)
delete mode 100644 UniApp微信小程序TTS接口调用说明.md
delete mode 100644 uniapp-tts-config.js
delete mode 100644 uniapp-tts-example.vue
delete mode 100644 uniapp-tts-service.js
delete mode 100644 uniapp-tts-simple-example.vue
diff --git a/UniApp微信小程序TTS接口调用说明.md b/UniApp微信小程序TTS接口调用说明.md
deleted file mode 100644
index 5237333..0000000
--- a/UniApp微信小程序TTS接口调用说明.md
+++ /dev/null
@@ -1,364 +0,0 @@
-# UniApp微信小程序TTS接口调用说明
-
-本文档详细介绍如何在UniApp微信小程序中调用后端的文字转语音(TTS)接口。
-
-## 📁 文件说明
-
-### 1. uniapp-tts-example.vue
-完整的TTS功能页面组件,包含:
-- 文本输入界面
-- 音色选择功能
-- 语速和音量调节
-- 音频格式选择
-- 音频播放功能
-- 完整的错误处理
-
-### 2. uniapp-tts-config.js
-TTS功能的配置文件,包含:
-- API接口配置
-- 参数验证工具
-- 错误处理配置
-- 通用工具函数
-
-## 🚀 快速开始
-
-### 1. 文件集成
-
-将以下文件复制到你的UniApp项目中:
-
-```
-your-project/
-├── pages/
-│ └── tts/
-│ └── index.vue # 复制 uniapp-tts-example.vue 内容
-├── utils/
-│ └── tts-config.js # 复制 uniapp-tts-config.js 内容
-└── pages.json # 添加页面路由配置
-```
-
-### 2. 页面路由配置
-
-在 `pages.json` 中添加TTS页面路由:
-
-```json
-{
- "pages": [
- {
- "path": "pages/tts/index",
- "style": {
- "navigationBarTitleText": "文字转语音",
- "navigationBarBackgroundColor": "#007aff",
- "navigationBarTextStyle": "white"
- }
- }
- ]
-}
-```
-
-### 3. 配置API地址
-
-修改 `uniapp-tts-config.js` 中的API地址:
-
-```javascript
-export const API_CONFIG = {
- // 开发环境API地址
- DEV_BASE_URL: 'http://localhost:8080', // 修改为你的开发环境地址
-
- // 生产环境API地址
- PROD_BASE_URL: 'https://your-domain.com', // 修改为你的生产环境地址
-};
-```
-
-## 🔧 功能特性
-
-### 1. 音色管理
-- 自动加载后端音色列表
-- 支持音色选择和切换
-- 音色信息缓存
-
-### 2. 参数控制
-- **语速调节**:支持-2到6的语速范围
-- **音量控制**:支持-10到10的音量范围
-- **格式选择**:支持WAV、MP3、PCM格式
-
-### 3. 音频处理
-- 二进制音频数据处理
-- 本地音频文件创建
-- 音频播放控制
-- 文件大小显示
-
-### 4. 用户体验
-- 实时状态反馈
-- 转换进度提示
-- 错误信息展示
-- 响应式界面设计
-
-## 📋 接口说明
-
-### 1. 获取音色列表
-
-**接口地址:** `GET /appletApi/tts/list`
-
-**响应格式:**
-```json
-{
- "success": true,
- "result": [
- {
- "id": 0,
- "name": "云小宁",
- "description": "甜美女声"
- }
- ]
-}
-```
-
-### 2. 文字转语音
-
-**接口地址:** `GET /appletApi/tts/textToVoice`
-
-**请求参数:**
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| text | String | 是 | 要转换的文本内容 |
-| speed | Float | 否 | 语速,范围[-2,6],默认0 |
-| voiceType | Integer | 否 | 音色ID,默认0 |
-| volume | Float | 否 | 音量,范围[-10,10],默认0 |
-| codec | String | 否 | 音频格式,默认wav |
-| userId | String | 否 | 用户ID,用于日志记录 |
-
-**响应格式:** 二进制音频数据
-
-## 💡 使用示例
-
-### 1. 基础调用
-
-```javascript
-import { API_CONFIG, UTILS } from '@/utils/tts-config.js';
-
-// 调用TTS接口
-async function callTTS() {
- try {
- const response = await uni.request({
- url: UTILS.buildApiUrl(API_CONFIG.ENDPOINTS.TEXT_TO_VOICE),
- method: 'GET',
- data: {
- text: '你好,世界!',
- speed: 0,
- voiceType: 0,
- volume: 0,
- codec: 'wav',
- userId: 'user123'
- },
- responseType: 'arraybuffer'
- });
-
- if (response.statusCode === 200) {
- // 处理音频数据
- console.log('TTS调用成功');
- }
- } catch (error) {
- console.error('TTS调用失败:', error);
- }
-}
-```
-
-### 2. 参数验证
-
-```javascript
-import { UTILS } from '@/utils/tts-config.js';
-
-// 验证文本
-const textValidation = UTILS.validateText('要转换的文本');
-if (!textValidation.valid) {
- console.error(textValidation.message);
- return;
-}
-
-// 验证语速
-const speedValidation = UTILS.validateSpeed(1);
-if (!speedValidation.valid) {
- console.error(speedValidation.message);
- return;
-}
-```
-
-### 3. 音频播放
-
-```javascript
-// 创建音频上下文
-const audioContext = wx.createInnerAudioContext();
-audioContext.src = audioFilePath;
-
-// 监听播放事件
-audioContext.onPlay(() => {
- console.log('开始播放');
-});
-
-audioContext.onEnded(() => {
- console.log('播放结束');
-});
-
-audioContext.onError((error) => {
- console.error('播放失败:', error);
-});
-
-// 开始播放
-audioContext.play();
-```
-
-## ⚠️ 注意事项
-
-### 1. 权限配置
-
-在 `manifest.json` 中配置必要的权限:
-
-```json
-{
- "mp-weixin": {
- "permission": {
- "scope.writePhotosAlbum": {
- "desc": "保存音频文件到相册"
- }
- }
- }
-}
-```
-
-### 2. 网络配置
-
-在微信小程序后台配置服务器域名,将你的API域名添加到request合法域名中。
-
-### 3. 文件大小限制
-
-- 微信小程序本地文件存储有限制
-- 建议音频文件不超过10MB
-- 长文本建议分段处理
-
-### 4. 错误处理
-
-```javascript
-// 统一错误处理
-function handleError(error, context = '') {
- console.error(`${context}错误:`, error);
-
- let message = '操作失败,请重试';
-
- if (error.errMsg) {
- if (error.errMsg.includes('network')) {
- message = '网络连接失败,请检查网络';
- } else if (error.errMsg.includes('timeout')) {
- message = '请求超时,请重试';
- }
- }
-
- uni.showToast({
- title: message,
- icon: 'error'
- });
-}
-```
-
-## 🔍 调试技巧
-
-### 1. 开启调试日志
-
-```javascript
-// 在开发环境开启详细日志
-if (process.env.NODE_ENV === 'development') {
- console.log('TTS请求参数:', params);
- console.log('TTS响应数据:', response);
-}
-```
-
-### 2. 网络请求监控
-
-```javascript
-// 监控请求状态
-uni.onNetworkStatusChange((res) => {
- console.log('网络状态:', res.isConnected ? '已连接' : '已断开');
- console.log('网络类型:', res.networkType);
-});
-```
-
-### 3. 性能监控
-
-```javascript
-// 监控转换耗时
-const startTime = Date.now();
-// ... TTS调用 ...
-const endTime = Date.now();
-console.log(`TTS转换耗时: ${(endTime - startTime) / 1000}秒`);
-```
-
-## 📈 性能优化
-
-### 1. 音色列表缓存
-
-```javascript
-// 缓存音色列表,避免重复请求
-const VOICE_CACHE_KEY = 'tts_voice_list';
-const CACHE_EXPIRE_TIME = 24 * 60 * 60 * 1000; // 24小时
-
-function getCachedVoiceList() {
- const cached = uni.getStorageSync(VOICE_CACHE_KEY);
- if (cached && (Date.now() - cached.timestamp) < CACHE_EXPIRE_TIME) {
- return cached.data;
- }
- return null;
-}
-```
-
-### 2. 音频文件管理
-
-```javascript
-// 清理过期的音频文件
-function cleanupAudioFiles() {
- const fileManager = wx.getFileSystemManager();
- // 实现文件清理逻辑
-}
-```
-
-### 3. 请求防抖
-
-```javascript
-// 防止重复请求
-let isConverting = false;
-
-async function convertToVoice() {
- if (isConverting) {
- console.log('正在转换中,请稍候...');
- return;
- }
-
- isConverting = true;
- try {
- // TTS转换逻辑
- } finally {
- isConverting = false;
- }
-}
-```
-
-## 🤝 技术支持
-
-如果在使用过程中遇到问题,请检查:
-
-1. **网络连接**:确保设备网络正常
-2. **API地址**:确认API地址配置正确
-3. **参数格式**:检查请求参数是否符合要求
-4. **权限设置**:确认小程序权限配置正确
-5. **后端服务**:确认后端TTS服务正常运行
-
-## 📝 更新日志
-
-### v1.0.0 (2025-01-XX)
-- 初始版本发布
-- 支持基础TTS功能
-- 完整的参数控制
-- 音频播放功能
-- 错误处理机制
-
----
-
-**注意:** 本示例基于JeecgBoot 3.8.1框架开发,使用腾讯云TTS服务。在实际使用时,请根据你的具体环境进行相应调整。
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml
index 451e3d7..130adbd 100644
--- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml
+++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml
@@ -161,7 +161,7 @@ spring:
#driver-class-name: com.mysql.cj.jdbc.Driver
#redis 配置
redis:
- database: 1
+ database: 10
host: 175.178.47.147
port: 6379
password: 'Abc.123456'
diff --git a/uniapp-tts-config.js b/uniapp-tts-config.js
deleted file mode 100644
index bfab470..0000000
--- a/uniapp-tts-config.js
+++ /dev/null
@@ -1,243 +0,0 @@
-/**
- * UniApp TTS接口配置文件
- * 用于配置文字转语音相关的API接口和参数
- */
-
-// API配置
-export const API_CONFIG = {
- // 开发环境API地址
- DEV_BASE_URL: 'http://localhost:8080',
-
- // 生产环境API地址(请根据实际情况修改)
- PROD_BASE_URL: 'https://your-domain.com',
-
- // 接口路径
- ENDPOINTS: {
- // 获取音色列表
- VOICE_LIST: '/appletApi/tts/list',
- // 文字转语音
- TEXT_TO_VOICE: '/appletApi/tts/textToVoice'
- },
-
- // 请求超时时间(毫秒)
- TIMEOUT: 30000
-};
-
-// TTS参数配置
-export const TTS_CONFIG = {
- // 语速配置
- SPEED: {
- MIN: -2,
- MAX: 6,
- DEFAULT: 0,
- OPTIONS: [
- { value: -2, label: '0.6倍速', description: '很慢' },
- { value: -1, label: '0.8倍速', description: '慢' },
- { value: 0, label: '1.0倍速', description: '正常' },
- { value: 1, label: '1.2倍速', description: '快' },
- { value: 2, label: '1.5倍速', description: '很快' },
- { value: 6, label: '2.5倍速', description: '极快' }
- ]
- },
-
- // 音量配置
- VOLUME: {
- MIN: -10,
- MAX: 10,
- DEFAULT: 0
- },
-
- // 音频格式配置
- CODEC: {
- OPTIONS: [
- { value: 'wav', label: 'WAV', description: '无损音质,文件较大' },
- { value: 'mp3', label: 'MP3', description: '压缩音质,文件适中' },
- { value: 'pcm', label: 'PCM', description: '原始音频,文件最大' }
- ],
- DEFAULT: 'wav'
- },
-
- // 文本限制
- TEXT: {
- MAX_LENGTH: 500,
- MIN_LENGTH: 1
- }
-};
-
-// 错误码配置
-export const ERROR_CODES = {
- // 网络错误
- NETWORK_ERROR: 'NETWORK_ERROR',
- // 参数错误
- PARAM_ERROR: 'PARAM_ERROR',
- // 服务器错误
- SERVER_ERROR: 'SERVER_ERROR',
- // 音频播放错误
- AUDIO_ERROR: 'AUDIO_ERROR',
- // 文件操作错误
- FILE_ERROR: 'FILE_ERROR'
-};
-
-// 错误消息配置
-export const ERROR_MESSAGES = {
- [ERROR_CODES.NETWORK_ERROR]: '网络连接失败,请检查网络设置',
- [ERROR_CODES.PARAM_ERROR]: '参数错误,请检查输入内容',
- [ERROR_CODES.SERVER_ERROR]: '服务器错误,请稍后重试',
- [ERROR_CODES.AUDIO_ERROR]: '音频播放失败,请重试',
- [ERROR_CODES.FILE_ERROR]: '文件操作失败,请重试'
-};
-
-// 工具函数
-export const UTILS = {
- /**
- * 获取当前环境的API基础地址
- */
- getBaseUrl() {
- // #ifdef MP-WEIXIN
- // 微信小程序环境
- return process.env.NODE_ENV === 'production' ? API_CONFIG.PROD_BASE_URL : API_CONFIG.DEV_BASE_URL;
- // #endif
-
- // #ifdef H5
- // H5环境
- return process.env.NODE_ENV === 'production' ? API_CONFIG.PROD_BASE_URL : API_CONFIG.DEV_BASE_URL;
- // #endif
-
- // #ifdef APP-PLUS
- // App环境
- return API_CONFIG.PROD_BASE_URL;
- // #endif
-
- return API_CONFIG.DEV_BASE_URL;
- },
-
- /**
- * 构建完整的API地址
- * @param {string} endpoint 接口路径
- */
- buildApiUrl(endpoint) {
- return this.getBaseUrl() + endpoint;
- },
-
- /**
- * 格式化文件大小
- * @param {number} bytes 字节数
- */
- formatFileSize(bytes) {
- if (bytes === 0) return '0 B';
- const k = 1024;
- const sizes = ['B', 'KB', 'MB', 'GB'];
- const i = Math.floor(Math.log(bytes) / Math.log(k));
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
- },
-
- /**
- * 验证文本长度
- * @param {string} text 文本内容
- */
- validateText(text) {
- if (!text || typeof text !== 'string') {
- return { valid: false, message: '请输入文本内容' };
- }
-
- const trimmedText = text.trim();
- if (trimmedText.length < TTS_CONFIG.TEXT.MIN_LENGTH) {
- return { valid: false, message: '文本内容不能为空' };
- }
-
- if (trimmedText.length > TTS_CONFIG.TEXT.MAX_LENGTH) {
- return { valid: false, message: `文本长度不能超过${TTS_CONFIG.TEXT.MAX_LENGTH}个字符` };
- }
-
- return { valid: true, text: trimmedText };
- },
-
- /**
- * 验证语速参数
- * @param {number} speed 语速值
- */
- validateSpeed(speed) {
- if (typeof speed !== 'number') {
- return { valid: false, message: '语速参数必须为数字' };
- }
-
- if (speed < TTS_CONFIG.SPEED.MIN || speed > TTS_CONFIG.SPEED.MAX) {
- return { valid: false, message: `语速范围为${TTS_CONFIG.SPEED.MIN}到${TTS_CONFIG.SPEED.MAX}` };
- }
-
- return { valid: true, speed };
- },
-
- /**
- * 验证音量参数
- * @param {number} volume 音量值
- */
- validateVolume(volume) {
- if (typeof volume !== 'number') {
- return { valid: false, message: '音量参数必须为数字' };
- }
-
- if (volume < TTS_CONFIG.VOLUME.MIN || volume > TTS_CONFIG.VOLUME.MAX) {
- return { valid: false, message: `音量范围为${TTS_CONFIG.VOLUME.MIN}到${TTS_CONFIG.VOLUME.MAX}` };
- }
-
- return { valid: true, volume };
- },
-
- /**
- * 获取语速描述
- * @param {number} speed 语速值
- */
- getSpeedDescription(speed) {
- const option = TTS_CONFIG.SPEED.OPTIONS.find(item => item.value === speed);
- return option ? option.description : '未知';
- },
-
- /**
- * 获取音频格式描述
- * @param {string} codec 音频格式
- */
- getCodecDescription(codec) {
- const option = TTS_CONFIG.CODEC.OPTIONS.find(item => item.value === codec);
- return option ? option.description : '未知格式';
- },
-
- /**
- * 生成唯一ID
- */
- generateId() {
- return 'id_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
- },
-
- /**
- * 获取当前时间戳
- */
- getCurrentTimestamp() {
- return Date.now();
- },
-
- /**
- * 格式化时间
- * @param {number} timestamp 时间戳
- */
- formatTime(timestamp) {
- const date = new Date(timestamp);
- return date.toLocaleString('zh-CN', {
- year: 'numeric',
- month: '2-digit',
- day: '2-digit',
- hour: '2-digit',
- minute: '2-digit',
- second: '2-digit'
- });
- }
-};
-
-// 默认导出配置对象
-export default {
- API_CONFIG,
- TTS_CONFIG,
- ERROR_CODES,
- ERROR_MESSAGES,
- UTILS
-};
\ No newline at end of file
diff --git a/uniapp-tts-example.vue b/uniapp-tts-example.vue
deleted file mode 100644
index e2f5a99..0000000
--- a/uniapp-tts-example.vue
+++ /dev/null
@@ -1,591 +0,0 @@
-
-
-
-
-
-
-
- 输入文本:
-
-
-
-
-
- 音色:
-
-
- {{ voiceTypeList[voiceTypeIndex]?.name || '请选择音色' }}
-
-
-
-
-
-
- 语速:{{ formData.speed }}
-
-
-
-
-
- 音量:{{ formData.volume }}
-
-
-
-
-
- 音频格式:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 转换结果:
-
- 音频大小:{{ audioSize }}
- 转换耗时:{{ convertTime }}秒
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/uniapp-tts-service.js b/uniapp-tts-service.js
deleted file mode 100644
index 845a9c9..0000000
--- a/uniapp-tts-service.js
+++ /dev/null
@@ -1,429 +0,0 @@
-/**
- * UniApp TTS服务类
- * 封装文字转语音功能,提供简单易用的API
- */
-
-import { API_CONFIG, TTS_CONFIG, UTILS, ERROR_CODES, ERROR_MESSAGES } from './uniapp-tts-config.js';
-
-class TTSService {
- constructor() {
- this.audioContext = null;
- this.isPlaying = false;
- this.isConverting = false;
- this.voiceList = [];
- this.currentAudioUrl = '';
- }
-
- /**
- * 初始化TTS服务
- * @param {Object} options 配置选项
- */
- async init(options = {}) {
- try {
- // 加载音色列表
- await this.loadVoiceList();
-
- // 初始化音频上下文
- this.initAudioContext();
-
- console.log('TTS服务初始化成功');
- return { success: true };
- } catch (error) {
- console.error('TTS服务初始化失败:', error);
- return { success: false, error: error.message };
- }
- }
-
- /**
- * 加载音色列表
- */
- async loadVoiceList() {
- try {
- // 先尝试从缓存获取
- const cached = this.getCachedVoiceList();
- if (cached) {
- this.voiceList = cached;
- return cached;
- }
-
- // 从服务器获取
- const response = await this.request({
- url: API_CONFIG.ENDPOINTS.VOICE_LIST,
- method: 'GET'
- });
-
- if (response.success && response.result) {
- this.voiceList = response.result;
- this.cacheVoiceList(this.voiceList);
- return this.voiceList;
- } else {
- throw new Error(response.message || '获取音色列表失败');
- }
- } catch (error) {
- console.error('加载音色列表失败:', error);
- throw error;
- }
- }
-
- /**
- * 文字转语音
- * @param {Object} params 转换参数
- * @param {string} params.text 文本内容
- * @param {number} params.speed 语速
- * @param {number} params.voiceType 音色ID
- * @param {number} params.volume 音量
- * @param {string} params.codec 音频格式
- * @param {string} params.userId 用户ID
- */
- async textToVoice(params) {
- if (this.isConverting) {
- throw new Error('正在转换中,请稍候...');
- }
-
- // 参数验证
- const validation = this.validateParams(params);
- if (!validation.valid) {
- throw new Error(validation.message);
- }
-
- this.isConverting = true;
- const startTime = Date.now();
-
- try {
- // 构建请求参数
- const requestParams = {
- text: params.text,
- speed: params.speed || TTS_CONFIG.SPEED.DEFAULT,
- voiceType: params.voiceType || 0,
- volume: params.volume || TTS_CONFIG.VOLUME.DEFAULT,
- codec: params.codec || TTS_CONFIG.CODEC.DEFAULT,
- userId: params.userId || this.generateUserId()
- };
-
- // 发起请求
- const audioData = await this.requestBinary({
- url: API_CONFIG.ENDPOINTS.TEXT_TO_VOICE,
- method: 'GET',
- data: requestParams
- });
-
- if (!audioData || audioData.byteLength === 0) {
- throw new Error('转换失败,未返回音频数据');
- }
-
- // 创建音频文件
- const audioUrl = await this.createAudioFile(audioData, requestParams.codec);
-
- // 计算转换耗时
- const convertTime = ((Date.now() - startTime) / 1000).toFixed(2);
-
- // 更新当前音频URL
- this.currentAudioUrl = audioUrl;
-
- return {
- success: true,
- audioUrl: audioUrl,
- audioSize: UTILS.formatFileSize(audioData.byteLength),
- convertTime: convertTime,
- params: requestParams
- };
- } catch (error) {
- console.error('文字转语音失败:', error);
- throw error;
- } finally {
- this.isConverting = false;
- }
- }
-
- /**
- * 播放音频
- * @param {string} audioUrl 音频文件路径(可选,默认使用最后转换的音频)
- */
- async playAudio(audioUrl) {
- const targetUrl = audioUrl || this.currentAudioUrl;
-
- if (!targetUrl) {
- throw new Error('没有可播放的音频文件');
- }
-
- if (this.isPlaying) {
- this.stopAudio();
- }
-
- return new Promise((resolve, reject) => {
- try {
- this.initAudioContext();
- this.audioContext.src = targetUrl;
- this.isPlaying = true;
-
- this.audioContext.onPlay(() => {
- console.log('音频开始播放');
- resolve({ success: true, action: 'play_started' });
- });
-
- this.audioContext.onEnded(() => {
- console.log('音频播放结束');
- this.isPlaying = false;
- });
-
- this.audioContext.onError((error) => {
- console.error('音频播放失败:', error);
- this.isPlaying = false;
- reject(new Error('音频播放失败'));
- });
-
- this.audioContext.play();
- } catch (error) {
- this.isPlaying = false;
- reject(error);
- }
- });
- }
-
- /**
- * 停止音频播放
- */
- stopAudio() {
- if (this.audioContext && this.isPlaying) {
- this.audioContext.stop();
- this.isPlaying = false;
- console.log('音频播放已停止');
- }
- }
-
- /**
- * 暂停音频播放
- */
- pauseAudio() {
- if (this.audioContext && this.isPlaying) {
- this.audioContext.pause();
- console.log('音频播放已暂停');
- }
- }
-
- /**
- * 获取音色列表
- */
- getVoiceList() {
- return this.voiceList;
- }
-
- /**
- * 根据ID获取音色信息
- * @param {number} voiceId 音色ID
- */
- getVoiceById(voiceId) {
- return this.voiceList.find(voice => voice.id === voiceId);
- }
-
- /**
- * 获取当前播放状态
- */
- getPlayStatus() {
- return {
- isPlaying: this.isPlaying,
- isConverting: this.isConverting,
- currentAudioUrl: this.currentAudioUrl
- };
- }
-
- /**
- * 清理资源
- */
- destroy() {
- if (this.audioContext) {
- this.audioContext.destroy();
- this.audioContext = null;
- }
- this.isPlaying = false;
- this.isConverting = false;
- this.currentAudioUrl = '';
- console.log('TTS服务已销毁');
- }
-
- // ==================== 私有方法 ====================
-
- /**
- * 初始化音频上下文
- */
- initAudioContext() {
- if (this.audioContext) {
- this.audioContext.destroy();
- }
-
- // #ifdef MP-WEIXIN
- this.audioContext = wx.createInnerAudioContext();
- // #endif
-
- // #ifdef H5
- this.audioContext = uni.createInnerAudioContext();
- // #endif
- }
-
- /**
- * 参数验证
- */
- validateParams(params) {
- if (!params || typeof params !== 'object') {
- return { valid: false, message: '参数格式错误' };
- }
-
- // 验证文本
- const textValidation = UTILS.validateText(params.text);
- if (!textValidation.valid) {
- return textValidation;
- }
-
- // 验证语速
- if (params.speed !== undefined) {
- const speedValidation = UTILS.validateSpeed(params.speed);
- if (!speedValidation.valid) {
- return speedValidation;
- }
- }
-
- // 验证音量
- if (params.volume !== undefined) {
- const volumeValidation = UTILS.validateVolume(params.volume);
- if (!volumeValidation.valid) {
- return volumeValidation;
- }
- }
-
- return { valid: true };
- }
-
- /**
- * 创建音频文件
- */
- async createAudioFile(arrayBuffer, codec) {
- return new Promise((resolve, reject) => {
- const fileName = `tts_${Date.now()}.${codec}`;
-
- // #ifdef MP-WEIXIN
- const filePath = `${wx.env.USER_DATA_PATH}/${fileName}`;
- wx.getFileSystemManager().writeFile({
- filePath: filePath,
- data: arrayBuffer,
- success: () => resolve(filePath),
- fail: (error) => reject(new Error('创建音频文件失败: ' + error.errMsg))
- });
- // #endif
-
- // #ifdef H5
- // H5环境下创建Blob URL
- const blob = new Blob([arrayBuffer], { type: `audio/${codec}` });
- const url = URL.createObjectURL(blob);
- resolve(url);
- // #endif
- });
- }
-
- /**
- * 生成用户ID
- */
- generateUserId() {
- // 尝试从存储获取用户ID
- let userId = uni.getStorageSync('tts_user_id');
- if (!userId) {
- userId = 'user_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
- uni.setStorageSync('tts_user_id', userId);
- }
- return userId;
- }
-
- /**
- * 缓存音色列表
- */
- cacheVoiceList(voiceList) {
- const cacheData = {
- data: voiceList,
- timestamp: Date.now()
- };
- uni.setStorageSync('tts_voice_cache', cacheData);
- }
-
- /**
- * 获取缓存的音色列表
- */
- getCachedVoiceList() {
- try {
- const cached = uni.getStorageSync('tts_voice_cache');
- if (cached && cached.data) {
- // 检查缓存是否过期(24小时)
- const expireTime = 24 * 60 * 60 * 1000;
- if (Date.now() - cached.timestamp < expireTime) {
- return cached.data;
- }
- }
- } catch (error) {
- console.error('获取缓存失败:', error);
- }
- return null;
- }
-
- /**
- * 通用请求方法
- */
- request(options) {
- return new Promise((resolve, reject) => {
- uni.request({
- url: UTILS.buildApiUrl(options.url),
- method: options.method || 'GET',
- data: options.data || {},
- timeout: API_CONFIG.TIMEOUT,
- header: {
- 'Content-Type': 'application/json',
- // 如果需要token认证,在这里添加
- // 'Authorization': 'Bearer ' + uni.getStorageSync('token')
- },
- success: (res) => {
- if (res.statusCode === 200) {
- resolve(res.data);
- } else {
- reject(new Error(`HTTP ${res.statusCode}: ${res.data?.message || '请求失败'}`));
- }
- },
- fail: (error) => {
- reject(new Error(ERROR_MESSAGES[ERROR_CODES.NETWORK_ERROR] || error.errMsg));
- }
- });
- });
- }
-
- /**
- * 二进制数据请求方法
- */
- requestBinary(options) {
- return new Promise((resolve, reject) => {
- uni.request({
- url: UTILS.buildApiUrl(options.url),
- method: options.method || 'GET',
- data: options.data || {},
- responseType: 'arraybuffer',
- timeout: API_CONFIG.TIMEOUT,
- header: {
- // 如果需要token认证,在这里添加
- // 'Authorization': 'Bearer ' + uni.getStorageSync('token')
- },
- success: (res) => {
- if (res.statusCode === 200) {
- resolve(res.data);
- } else {
- reject(new Error(`HTTP ${res.statusCode}: 请求失败`));
- }
- },
- fail: (error) => {
- reject(new Error(ERROR_MESSAGES[ERROR_CODES.NETWORK_ERROR] || error.errMsg));
- }
- });
- });
- }
-}
-
-// 创建单例实例
-const ttsService = new TTSService();
-
-// 导出服务实例和类
-export { TTSService, ttsService };
-export default ttsService;
\ No newline at end of file
diff --git a/uniapp-tts-simple-example.vue b/uniapp-tts-simple-example.vue
deleted file mode 100644
index c27ff6c..0000000
--- a/uniapp-tts-simple-example.vue
+++ /dev/null
@@ -1,522 +0,0 @@
-
-
-
-
-
-
-
-
- {{ quickText.length }}/200
-
-
-
-
-
-
-
-
-
-
-
-
- 高级设置
- {{ showAdvanced ? '▼' : '▶' }}
-
-
-
-
-
- 音色:
-
-
- {{ voiceOptions[voiceIndex]?.name || '默认音色' }}
-
-
-
-
-
-
- 语速:{{ speedValue }}
-
-
-
-
-
- 音量:{{ volumeValue }}
-
-
-
-
-
-
-
-
- 状态:
- {{ statusInfo.status }}
-
-
- 大小:
- {{ statusInfo.size }}
-
-
- 耗时:
- {{ statusInfo.time }}秒
-
-
-
-
-
- 预设文本
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file