UNPKG

gpt-sovits-sdk

Version:

Node.js SDK for GPT-SoVITS API

202 lines (201 loc) 8.4 kB
"use strict"; /** * GPT-SoVITS SDK 情感参考音频测试脚本 */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); const index_1 = require("./index"); const path = __importStar(require("path")); const fs = __importStar(require("fs")); // 创建输出目录 const outputDir = path.join(__dirname, '../test-output'); if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } // 创建客户端实例 const client = (0, index_1.createClient)({ baseUrl: 'http://127.0.0.1:9880', // 默认API地址 timeout: 60000, // 设置超时时间为60秒 debug: true, // 启用调试输出 retries: 2 // 设置重试次数 }); /** * 测试获取情感参考音频 */ async function testGetEmotionReferenceAudios() { console.log("开始测试获取情感参考音频列表..."); try { // 获取情感参考音频列表 const response = await client.getEmotionReferenceAudios(); console.log("情感参考音频响应状态码:", response.code); console.log("情感参考音频响应消息:", response.message); // 检查响应是否成功 if (!response || !response.data) { console.log("没有收到有效响应数据,跳过TTS测试"); return null; } // 打印响应数据结构 console.log("响应数据结构:", Object.keys(response.data)); // 获取参考音频列表 const audioList = response.data.referenceAudios; if (!audioList || audioList.length === 0) { console.log("没有找到可用的情感参考音频,跳过TTS测试"); return null; } // 打印找到的音频数量 console.log(`找到 ${audioList.length} 个情感参考音频`); console.log(`可用角色: ${response.data.characters.join(', ')}`); console.log(`可用语言: ${response.data.languages.join(', ')}`); console.log(`可用情感: ${response.data.emotions.join(', ')}`); // 打印前5个音频的详细信息 console.log("前5个音频详细信息:"); for (let i = 0; i < Math.min(5, audioList.length); i++) { const audio = audioList[i]; console.log(`\n音频 ${i + 1}:`); console.log(`- 名称: ${audio.name}`); console.log(`- 角色: ${audio.character}`); console.log(`- 语言: ${audio.language}`); console.log(`- 情感: ${audio.emotion}`); console.log(`- ID: ${audio.id}`); console.log(`- 路径: ${audio.path}`); } // 选择第一个音频 const firstAudio = audioList[0]; console.log("\n选择的音频信息:"); console.log(`- 名称: ${firstAudio.name}`); console.log(`- 角色: ${firstAudio.character}`); console.log(`- 语言: ${firstAudio.language}`); console.log(`- 情感: ${firstAudio.emotion}`); console.log(`- ID: ${firstAudio.id}`); return firstAudio; } catch (error) { console.error("获取情感参考音频列表失败:", error); return null; } } /** * 测试使用情感参考音频进行TTS */ async function testTTSWithEmotionAudio(audioInfo) { console.log("\n开始测试使用情感参考音频进行TTS..."); if (!audioInfo) { console.log("没有可用的情感参考音频,跳过TTS测试"); return; } try { // 获取可用模型 console.log("获取可用模型..."); const modelsResponse = await client.getModels(); console.log("模型响应状态码:", modelsResponse.code); console.log("模型响应消息:", modelsResponse.message); if (!modelsResponse.data || !modelsResponse.data.gpt_models || !modelsResponse.data.sovits_models || modelsResponse.data.gpt_models.length === 0 || modelsResponse.data.sovits_models.length === 0) { console.log("没有找到可用的模型,跳过TTS测试"); return; } else { // 使用第一个可用的模型 var gptModel = modelsResponse.data.gpt_models[0].path; var sovitsModel = modelsResponse.data.sovits_models[0].path; console.log(`找到 ${modelsResponse.data.gpt_models.length} 个GPT模型和 ${modelsResponse.data.sovits_models.length} 个SoVITS模型`); } console.log("使用的模型:"); console.log(`- GPT模型: ${gptModel}`); console.log(`- SoVITS模型: ${sovitsModel}`); // 构建TTS请求文本 const ttsText = `这是一个使用${audioInfo.character}${audioInfo.emotion}情感的测试。我们可以根据不同的情感来改变语音的风格。`; console.log(`TTS文本: ${ttsText}`); // 确定语言代码 const langCode = audioInfo.language === '中文' ? 'zh' : (audioInfo.language === '英文' ? 'en' : 'ja'); console.log(`语言代码: ${langCode}`); // 构建TTS请求 const ttsOptions = { text: ttsText, textLang: langCode, refAudioPath: audioInfo.id, // 使用音频ID而不是完整路径 promptLang: langCode, promptText: audioInfo.prompt_text, // 使用音频的提示文本 mediaType: "wav", gptModel: gptModel, sovitsModel: sovitsModel }; console.log("发送TTS请求:"); console.log(JSON.stringify(ttsOptions, null, 2)); // 发送TTS请求 const ttsResponse = await client.textToSpeech(ttsOptions); console.log("TTS响应:"); console.log(JSON.stringify(ttsResponse, null, 2)); if (ttsResponse && ttsResponse.audio_path) { console.log(`生成的音频文件: ${ttsResponse.audio_path}`); console.log(`音频时长: ${ttsResponse.duration} 秒`); // 保存音频文件 try { const outputPath = path.join(outputDir, `emotion_tts_${Date.now()}.wav`); const audioData = await client.getAudio(ttsResponse.audio_path, outputPath); console.log(`音频已保存到: ${outputPath}`); } catch (saveError) { console.error("保存音频文件失败:", saveError); } } else { console.log("TTS请求未返回有效的音频路径"); } } catch (error) { console.error("TTS测试失败:", error); } } /** * 运行测试 */ async function runTests() { console.log('开始测试 GPT-SoVITS SDK 情感参考音频功能...\n'); // 测试获取情感参考音频 const audioInfo = await testGetEmotionReferenceAudios(); // 如果获取情感参考音频成功,测试TTS if (audioInfo) { await testTTSWithEmotionAudio(audioInfo); } console.log('\n测试完成!'); } // 执行测试 runTests().catch(error => { console.error('测试过程中发生错误:', error); });