/* * 获取已加载模型信息 * */ $(document).ready(function () { get_models_info(); get_model_to_load(); $("#save-current-model").click(function () { save_current_model(); }); } ); function get_models_info() { $.ajax({ url: '/admin/get_models_info', type: 'GET', dataType: 'json', contentType: 'application/json', success: function (response) { var model_list = response; show_model(model_list); } }); } var modelTypes = { 'VITS': $('#VITS'), 'HUBERT-VITS': $('#HUBERT-VITS'), 'W2V2-VITS': $('#W2V2-VITS'), 'BERT-VITS2': $('#BERT-VITS2'), 'GPT-SOVITS': $('#GPT-SOVITS') }; function show_model(model_list) { for (var modelType in modelTypes) { modelTypes[modelType].empty(); modelTypes[modelType].prev('label').remove(); } for (var model_type in model_list) { if (model_list[model_type].length > 0) { var model_datas = model_list[model_type]; var label = $('').text(model_type); modelTypes[model_type].before(label); $.each(model_datas, function (key, model_data) { renderModelCard(model_data, model_type); }); } } } function renderModelCard(model_data, model_type) { var id = String(model_data["model_id"]); var model_path = String(model_data["model_path"]); var n_speakers = String(model_data["n_speakers"]); var sovits_path = String(model_data["sovits_path"]); var gpt_path = String(model_data["gpt_path"]); var card = $('
').addClass("card model-card " + model_type).attr({ "data-model-type": model_type, "data-model-id": id }); var wrap = $('
').addClass("wrap"); // $('
').text("id: " + id).appendTo(wrap); if (model_type == "GPT-SOVITS") { $('
').text(sovits_path).addClass("model-card-info1").appendTo(wrap); $('
').text(gpt_path).addClass("model-card-info3").appendTo(wrap); $('
').text("x").addClass("unload-model").appendTo(wrap); } else { $('
').text(model_path).addClass("model-card-info1").appendTo(wrap); $('
').text("n_speakers: " + n_speakers).addClass("model-card-info2").appendTo(wrap); $('
').text("x").addClass("unload-model").appendTo(wrap); } card.append(wrap); modelTypes[model_type].append(card); } /* * 获取项目模型目录下的模型与配置文件路径 * */ var modelLoadContent = $('.model-load-content'); var isRequestInProgress = false; function get_model_to_load() { $.get('/admin/get_path', function (response) { var model_datas = response; renderModelLoadCards(model_datas); }); } function renderModelLoadCards(data) { modelLoadContent.empty(); $.each(data, function (index, model) { var card = $('
').addClass('model-load-item flex'); var model_id = model.model_id; var model_type = model.model_type; var model_path = model.model_path; var config_path = model.config_path; var sovits_path = model.sovits_path; var gpt_path = model.gpt_path; var folder = null; var model_name = null; var config_name = null; var sovits_name = null; var gpt_name = null; $('
').text(model_id.toString()).addClass("unload-model-id").appendTo(card); if (model_path != null && config_path != null) { folder = model_path.split("/")[0]; model_name = model_path.split("/")[1]; config_name = config_path.split("/")[1]; $('
').text(folder).addClass("unload-model-folder").appendTo(card); $('
').text(model_name).addClass("unload-model-path model1").appendTo(card); $('
').text(config_name).addClass("unload-model-config model2").appendTo(card); } else { folder = sovits_path.split("/")[0]; sovits_name = sovits_path.split("/")[1]; gpt_name = gpt_path.split("/")[1]; $('
').text(folder).addClass("unload-model-folder").appendTo(card); $('
').text(sovits_name).addClass("unload-sovits-path model1").appendTo(card); $('
').text(gpt_name).addClass("unload-gpt-config model2").appendTo(card); } // $('
').text(model_type).addClass("model-type").appendTo(card); // var formattedString = folder + " | " + filename + " | " + config_path; // $('
').text(formattedString).addClass("unload-model-path").appendTo(card); // card.text(formattedString); card.on('click', function () { if (!isRequestInProgress) { isRequestInProgress = true; loadModel(card, model_path, config_path, sovits_path, gpt_path); } }); modelLoadContent.append(card); }); } /* * 加载模型 * */ function loadModel(card, model_path, config_path, sovits_path, gpt_path) { var csrftoken = $('meta[name="csrf-token"]').attr('content'); $.ajax({ url: '/admin/load_model', type: 'POST', contentType: 'application/json', headers: { 'X-CSRFToken': csrftoken }, data: JSON.stringify({ model_path: model_path, config_path: config_path, sovits_path: sovits_path, gpt_path: gpt_path }), success: function (response) { card.fadeOut(); get_models_info(); isRequestInProgress = false; }, error: function (response) { alert("Model loading failed!"); isRequestInProgress = false; } }); } /* * 卸载模型 * */ $('#model-data').on('click', '.unload-model', function (event) { var cardElement = $(event.target).closest('.card'); var modelType = cardElement.attr('data-model-type'); var modelId = cardElement.attr('data-model-id'); var params = { "model_type": modelType, "model_id": modelId }; $.ajax({ url: '/admin/unload_model', type: 'POST', dataType: 'json', contentType: 'application/json', data: JSON.stringify(params), headers: { 'X-CSRFToken': $('meta[name="csrf-token"]').attr('content') }, success: function (response) { get_models_info(); }, error: function (response) { alert("Unload model failed!"); } }); }); function save_current_model() { $.ajax({ url: '/admin/save_current_model', type: 'POST', headers: { 'X-CSRFToken': $('meta[name="csrf-token"]').attr('content') }, success: function (response) { alert("当前已加载的模型已保存,下次启动将自动加载。"); }, error: function (response) { alert("保存失败!"); } }); }