UNPKG

gpt-sovits-sdk

Version:

Node.js SDK for GPT-SoVITS API

259 lines (258 loc) 9.92 kB
"use strict"; /** * GPT-SoVITS SDK 模型配对示例 * * 这个示例展示了如何使用SDK进行模型配对操作,包括: * 1. 获取所有可用模型 * 2. 自动配对GPT和SoVITS模型 * 3. 使用配对的模型进行TTS */ 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, '../../output'); if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } // 创建客户端实例 const client = (0, index_1.createClient)({ baseUrl: 'http://127.0.0.1:9880', timeout: 60000, debug: true }); /** * 获取所有可用模型并进行配对 */ async function getModelPairs() { console.log('获取所有可用模型...'); const modelsResponse = await client.getModels(); if (!modelsResponse.data) { console.log('无法获取模型数据'); return []; } const { gpt_models, sovits_models } = modelsResponse.data; console.log(`找到 ${gpt_models.length} 个GPT模型和 ${sovits_models.length} 个SoVITS模型`); // 尝试自动配对模型 const pairs = []; // 基于名称相似度进行配对 for (const gptModel of gpt_models) { // 提取GPT模型名称的基本部分(去除后缀和版本号) const gptBaseName = gptModel.name.replace(/\.ckpt$|\.pth$|-e\d+$|-epoch\d+$/, ''); // 查找匹配的SoVITS模型 const matchingSovitsModels = sovits_models.filter((sovitsModel) => { const sovitsBaseName = sovitsModel.name.replace(/\.ckpt$|\.pth$|-e\d+$|-epoch\d+$/, ''); return sovitsBaseName === gptBaseName || sovitsBaseName.includes(gptBaseName) || gptBaseName.includes(sovitsBaseName); }); if (matchingSovitsModels.length > 0) { // 使用最匹配的SoVITS模型 pairs.push({ name: gptBaseName, gptModel, sovitsModel: matchingSovitsModels[0] }); } } console.log(`自动配对了 ${pairs.length} 对模型`); pairs.forEach((pair, index) => { console.log(`配对 ${index + 1}: ${pair.name}`); console.log(` GPT: ${pair.gptModel.path}`); console.log(` SoVITS: ${pair.sovitsModel.path}`); }); return pairs; } /** * 使用配对的模型进行TTS */ async function testModelPairs(pairs) { if (pairs.length === 0) { console.log('没有找到配对的模型,无法进行测试'); return; } // 获取参考音频 console.log('\n获取参考音频...'); const referenceAudiosResponse = await client.getReferenceAudios(); if (!referenceAudiosResponse.data || referenceAudiosResponse.data.audios.length === 0) { console.log('没有找到参考音频,无法进行测试'); return; } // 选择第一个参考音频 const refAudio = referenceAudiosResponse.data.audios[0]; console.log(`选择参考音频: ${refAudio.name}`); // 测试文本 const testText = '这是一个模型配对测试,使用不同的模型生成语音。'; // 对每对模型进行测试 for (let i = 0; i < Math.min(pairs.length, 3); i++) { // 最多测试3对模型 const pair = pairs[i]; console.log(`\n测试模型配对 ${i + 1}: ${pair.name}`); try { // 设置模型 await client.setGptModel(pair.gptModel.path); await client.setSovitsModel(pair.sovitsModel.path); // 执行TTS console.log(`使用模型 ${pair.name} 生成语音...`); const result = await client.textToSpeechDirect({ text: testText, textLang: index_1.TextLanguage.CHINESE, refAudioPath: refAudio.path, promptLang: index_1.TextLanguage.CHINESE, mediaType: index_1.MediaType.WAV }, path.join(outputDir, `model_pair_${pair.name}_${Date.now()}.wav`)); console.log(`模型 ${pair.name} 语音生成成功: ${result}`); } catch (error) { console.error(`模型 ${pair.name} 测试失败:`, error); } } } /** * 批量处理多个文本 */ async function batchProcess(modelPair, texts, refAudioPath) { console.log(`\n使用模型 ${modelPair.name} 批量处理 ${texts.length} 个文本...`); // 设置模型 await client.setGptModel(modelPair.gptModel.path); await client.setSovitsModel(modelPair.sovitsModel.path); // 批量处理 for (let i = 0; i < texts.length; i++) { const text = texts[i]; console.log(`处理文本 ${i + 1}/${texts.length}: ${text.substring(0, 30)}...`); try { const outputPath = path.join(outputDir, `batch_${modelPair.name}_${i + 1}_${Date.now()}.wav`); await client.textToSpeechDirect({ text, textLang: index_1.TextLanguage.CHINESE, refAudioPath, promptLang: index_1.TextLanguage.CHINESE, mediaType: index_1.MediaType.WAV }, outputPath); console.log(`文本 ${i + 1} 处理完成: ${outputPath}`); } catch (error) { console.error(`文本 ${i + 1} 处理失败:`, error); } } } /** * 获取可用模型 */ async function getModels() { try { const response = await client.getModels(); console.log('API响应状态:', response.code, response.message); if (response.data) { console.log('GPT模型数量:', response.data.gpt_models.length); console.log('SoVITS模型数量:', response.data.sovits_models.length); return { gptModels: response.data.gpt_models, sovitsModels: response.data.sovits_models }; } return { gptModels: [], sovitsModels: [] }; } catch (error) { console.error('获取模型失败:', error); return { gptModels: [], sovitsModels: [] }; } } /** * 创建模型配对 */ async function createModelPairs() { // 获取可用模型 const { gptModels, sovitsModels } = await getModels(); if (gptModels.length === 0 || sovitsModels.length === 0) { console.error('没有足够的模型可用于配对'); return; } // 显示所有可能的模型配对 console.log('\n所有可能的模型配对:'); let pairIndex = 1; for (const gptModel of gptModels) { for (const sovitsModel of sovitsModels) { console.log(`配对 ${pairIndex++}: GPT模型 "${gptModel.name}" + SoVITS模型 "${sovitsModel.name}"`); } } // 选择第一个GPT模型和第一个SoVITS模型进行配对 const selectedGptModel = gptModels[0]; const selectedSovitsModel = sovitsModels[0]; console.log(`\n选择配对: GPT模型 "${selectedGptModel.name}" + SoVITS模型 "${selectedSovitsModel.name}"`); return { gptModel: selectedGptModel.path, sovitsModel: selectedSovitsModel.path }; } /** * 运行示例 */ async function runExample() { try { // 获取模型配对 const modelPairs = await getModelPairs(); if (modelPairs.length === 0) { console.log('没有找到配对的模型,示例结束'); return; } // 测试模型配对 await testModelPairs(modelPairs); // 获取参考音频 const referenceAudiosResponse = await client.getReferenceAudios(); if (!referenceAudiosResponse.data || referenceAudiosResponse.data.audios.length === 0) { console.log('没有找到参考音频,无法进行批量处理'); return; } // 选择第一个参考音频 const refAudio = referenceAudiosResponse.data.audios[0]; // 批量处理示例 const testTexts = [ '人工智能正在改变我们的生活方式。', '语音合成技术让计算机能够说话。', '深度学习模型可以生成逼真的人声。', '未来,人机交互将变得更加自然。' ]; // 使用第一对模型进行批量处理 await batchProcess(modelPairs[0], testTexts, refAudio.path); console.log('\n示例执行完成!'); } catch (error) { console.error('执行示例时出错:', error); } } // 执行示例 runExample();