diff --git a/public/scripts/extensions/rvc/index.js b/public/scripts/extensions/rvc/index.js index 27229574c..08ff62846 100644 --- a/public/scripts/extensions/rvc/index.js +++ b/public/scripts/extensions/rvc/index.js @@ -208,6 +208,7 @@ $(document).ready(function () { harvest torchcrepe rmvpe + None Index rate for feature retrieval () diff --git a/public/scripts/extensions/tts/coqui.js b/public/scripts/extensions/tts/coqui.js index 325668cca..f00b5e323 100644 --- a/public/scripts/extensions/tts/coqui.js +++ b/public/scripts/extensions/tts/coqui.js @@ -15,6 +15,7 @@ const UPDATE_INTERVAL = 1000 let inApiCall = false let charactersList = [] // Updated with module worker let coquiApiModels = {} // Initialized only once +let coquiLocalModels = [] // Initialized only once /* coquiApiModels format [language][dataset][name]:coqui-api-model-id, example: { @@ -45,11 +46,6 @@ function throwIfModuleMissing() { } } -function throwLocalOrigin() { - toastr.info("coming soon, ready when ready, etc", DEBUG_PREFIX+' Custom models not supported yet', { timeOut: 10000, extendedTimeOut: 20000, preventDuplicates: true }); - throw new Error(DEBUG_PREFIX,`requesting feature not implemented yet.`); -} - function resetModelSettings() { $("#coqui_api_model_settings_language").val("none"); $("#coqui_api_model_settings_speaker").val("none"); @@ -105,8 +101,8 @@ class CoquiTtsProvider { Models: gpu_mode Select Origin - Coqui TTS - My models + Coqui API + My Models @@ -129,6 +125,14 @@ class CoquiTtsProvider { Model installed on extras server + + + + + + + + @@ -151,6 +155,9 @@ class CoquiTtsProvider { this.updateVoiceMap(); // Overide any manual modification $("#coqui_api_model_div").hide(); + $("#coqui_local_model_div").hide(); + + $("#coqui_api_language").show(); $("#coqui_api_model_name").hide(); $("#coqui_api_model_settings").hide(); $("#coqui_api_model_install_status").hide(); @@ -242,7 +249,16 @@ class CoquiTtsProvider { } if (model_origin == "local") { - throwLocalOrigin(); + const model_id = $("#coqui_local_model_name").val(); + + if (model_name == "none") { + toastr.error(`Model not selected, please select one.`, DEBUG_PREFIX+" voice mapping model", { timeOut: 10000, extendedTimeOut: 20000, preventDuplicates: true }); + this.updateVoiceMap(); // Overide any manual modification + return; + } + + this.settings.voiceMapDict[character] = {model_type: "local", model_id: "local/"+model_id}; + console.debug(DEBUG_PREFIX,"Registered new voice map: ",character,":",this.settings.voiceMapDict[character]); this.updateVoiceMap(); // Overide any manual modification return; } @@ -282,7 +298,7 @@ class CoquiTtsProvider { console.debug(DEBUG_PREFIX,"Current voice map: ",this.settings.voiceMap); - this.settings.voiceMapDict[character] = {model_id: model_id, model_language:model_setting_language, model_speaker:model_setting_speaker}; + this.settings.voiceMapDict[character] = {model_type: "coqui-api", model_id: model_id, model_language:model_setting_language, model_speaker:model_setting_speaker}; console.debug(DEBUG_PREFIX,"Registered new voice map: ",character,":",this.settings.voiceMapDict[character]); @@ -311,16 +327,17 @@ class CoquiTtsProvider { const model_origin = $('#coqui_model_origin').val(); console.debug(model_origin); - // TODO: show coqui model list + // show coqui model list if (model_origin == "coqui-api") { + $("#coqui_local_model_div").hide(); $("#coqui_api_model_div").show(); } - else - $("#coqui_api_model_div").hide(); + - // TODO show local model list + // show local model list if (model_origin == "local") { - throwLocalOrigin(); + $("#coqui_api_model_div").hide(); + $("#coqui_local_model_div").show(); } } @@ -533,7 +550,33 @@ class CoquiTtsProvider { return apiResult } - // Get speakers + /* + Retrieve user custom models + */ + static async getLocalModelList() { + throwIfModuleMissing() + const url = new URL(getApiUrl()); + url.pathname = '/api/text-to-speech/coqui/local/get-models'; + + const apiResult = await doExtrasFetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Cache-Control': 'no-cache' + }, + body: JSON.stringify({ + "model_id": "model_id", + "action": "action" + }) + }) + + if (!apiResult.ok) { + toastr.error(apiResult.statusText, DEBUG_PREFIX+' Get local model list request failed'); + throw new Error(`HTTP ${apiResult.status}: ${await apiResult.text()}`); + } + + return apiResult + } // Expect voiceId format to be like: @@ -609,6 +652,28 @@ class CoquiTtsProvider { async function moduleWorker() { updateCharactersList(); + + if (!modules.includes('coqui-tts')) + return + + // Initialized local model once + if (coquiLocalModels.length == 0){ + let result = await CoquiTtsProvider.getLocalModelList(); + result = await result.json(); + + coquiLocalModels = result["models_list"]; + + $("#coqui_local_model_name").show(); + $('#coqui_local_model_name') + .find('option') + .remove() + .end() + .append('Select model') + .val('none'); + + for(const model_dataset of coquiLocalModels) + $("#coqui_local_model_name").append(new Option(model_dataset,model_dataset)); + } } $(document).ready(function () { diff --git a/public/scripts/extensions/tts/manifest.json b/public/scripts/extensions/tts/manifest.json index 7cfb20570..2f8afd419 100644 --- a/public/scripts/extensions/tts/manifest.json +++ b/public/scripts/extensions/tts/manifest.json @@ -4,7 +4,8 @@ "requires": [], "optional": [ "silero-tts", - "edge-tts" + "edge-tts", + "coqui-tts" ], "js": "index.js", "css": "style.css",