本文档详细介绍如何在UniApp微信小程序中调用后端的文字转语音(TTS)接口。
完整的TTS功能页面组件,包含:
TTS功能的配置文件,包含:
将以下文件复制到你的UniApp项目中:
your-project/
├── pages/
│ └── tts/
│ └── index.vue # 复制 uniapp-tts-example.vue 内容
├── utils/
│ └── tts-config.js # 复制 uniapp-tts-config.js 内容
└── pages.json # 添加页面路由配置
在 pages.json
中添加TTS页面路由:
{
"pages": [
{
"path": "pages/tts/index",
"style": {
"navigationBarTitleText": "文字转语音",
"navigationBarBackgroundColor": "#007aff",
"navigationBarTextStyle": "white"
}
}
]
}
修改 uniapp-tts-config.js
中的API地址:
export const API_CONFIG = {
// 开发环境API地址
DEV_BASE_URL: 'http://localhost:8080', // 修改为你的开发环境地址
// 生产环境API地址
PROD_BASE_URL: 'https://your-domain.com', // 修改为你的生产环境地址
};
接口地址: GET /appletApi/tts/list
响应格式:
{
"success": true,
"result": [
{
"id": 0,
"name": "云小宁",
"description": "甜美女声"
}
]
}
接口地址: 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,用于日志记录 |
响应格式: 二进制音频数据
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);
}
}
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;
}
// 创建音频上下文
const audioContext = wx.createInnerAudioContext();
audioContext.src = audioFilePath;
// 监听播放事件
audioContext.onPlay(() => {
console.log('开始播放');
});
audioContext.onEnded(() => {
console.log('播放结束');
});
audioContext.onError((error) => {
console.error('播放失败:', error);
});
// 开始播放
audioContext.play();
在 manifest.json
中配置必要的权限:
{
"mp-weixin": {
"permission": {
"scope.writePhotosAlbum": {
"desc": "保存音频文件到相册"
}
}
}
}
在微信小程序后台配置服务器域名,将你的API域名添加到request合法域名中。
// 统一错误处理
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'
});
}
// 在开发环境开启详细日志
if (process.env.NODE_ENV === 'development') {
console.log('TTS请求参数:', params);
console.log('TTS响应数据:', response);
}
// 监控请求状态
uni.onNetworkStatusChange((res) => {
console.log('网络状态:', res.isConnected ? '已连接' : '已断开');
console.log('网络类型:', res.networkType);
});
// 监控转换耗时
const startTime = Date.now();
// ... TTS调用 ...
const endTime = Date.now();
console.log(`TTS转换耗时: ${(endTime - startTime) / 1000}秒`);
// 缓存音色列表,避免重复请求
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;
}
// 清理过期的音频文件
function cleanupAudioFiles() {
const fileManager = wx.getFileSystemManager();
// 实现文件清理逻辑
}
// 防止重复请求
let isConverting = false;
async function convertToVoice() {
if (isConverting) {
console.log('正在转换中,请稍候...');
return;
}
isConverting = true;
try {
// TTS转换逻辑
} finally {
isConverting = false;
}
}
如果在使用过程中遇到问题,请检查:
注意: 本示例基于JeecgBoot 3.8.1框架开发,使用腾讯云TTS服务。在实际使用时,请根据你的具体环境进行相应调整。