gpt-sovits-sdk
Version:
Node.js SDK for GPT-SoVITS API
202 lines (201 loc) • 8.4 kB
JavaScript
;
/**
* 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);
});