Added Coqui TTS extension option to use local models (no language/no speakers)
This commit is contained in:
parent
1fa281b03c
commit
735066fe10
|
@ -208,6 +208,7 @@ $(document).ready(function () {
|
||||||
<option value="harvest">harvest</option>
|
<option value="harvest">harvest</option>
|
||||||
<option value="torchcrepe">torchcrepe</option>
|
<option value="torchcrepe">torchcrepe</option>
|
||||||
<option value="rmvpe">rmvpe</option>
|
<option value="rmvpe">rmvpe</option>
|
||||||
|
<option value="">None (Shitty ASMR)</option>
|
||||||
</select>
|
</select>
|
||||||
<label for="rvc_index_rate">
|
<label for="rvc_index_rate">
|
||||||
Index rate for feature retrieval (<span id="rvc_index_rate_value"></span>)
|
Index rate for feature retrieval (<span id="rvc_index_rate_value"></span>)
|
||||||
|
|
|
@ -15,6 +15,7 @@ const UPDATE_INTERVAL = 1000
|
||||||
let inApiCall = false
|
let inApiCall = false
|
||||||
let charactersList = [] // Updated with module worker
|
let charactersList = [] // Updated with module worker
|
||||||
let coquiApiModels = {} // Initialized only once
|
let coquiApiModels = {} // Initialized only once
|
||||||
|
let coquiLocalModels = [] // Initialized only once
|
||||||
/*
|
/*
|
||||||
coquiApiModels format [language][dataset][name]:coqui-api-model-id, example:
|
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() {
|
function resetModelSettings() {
|
||||||
$("#coqui_api_model_settings_language").val("none");
|
$("#coqui_api_model_settings_language").val("none");
|
||||||
$("#coqui_api_model_settings_speaker").val("none");
|
$("#coqui_api_model_settings_speaker").val("none");
|
||||||
|
@ -105,8 +101,8 @@ class CoquiTtsProvider {
|
||||||
<label for="coqui_model_origin">Models:</label>
|
<label for="coqui_model_origin">Models:</label>
|
||||||
<select id="coqui_model_origin">gpu_mode
|
<select id="coqui_model_origin">gpu_mode
|
||||||
<option value="none">Select Origin</option>
|
<option value="none">Select Origin</option>
|
||||||
<option value="coqui-api">Coqui TTS</option>
|
<option value="coqui-api">Coqui API</option>
|
||||||
<option value="local">My models</option>
|
<option value="local">My Models</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<div id="coqui_api_model_div">
|
<div id="coqui_api_model_div">
|
||||||
|
@ -129,6 +125,14 @@ class CoquiTtsProvider {
|
||||||
<span id="coqui_api_model_install_status">Model installed on extras server</span>
|
<span id="coqui_api_model_install_status">Model installed on extras server</span>
|
||||||
<input id="coqui_api_model_install_button" class="menu_button" type="button" value="Install" />
|
<input id="coqui_api_model_install_button" class="menu_button" type="button" value="Install" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="coqui_local_model_div">
|
||||||
|
<select id="coqui_local_model_name">
|
||||||
|
<!-- Populated by JS and request -->
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -151,6 +155,9 @@ class CoquiTtsProvider {
|
||||||
this.updateVoiceMap(); // Overide any manual modification
|
this.updateVoiceMap(); // Overide any manual modification
|
||||||
|
|
||||||
$("#coqui_api_model_div").hide();
|
$("#coqui_api_model_div").hide();
|
||||||
|
$("#coqui_local_model_div").hide();
|
||||||
|
|
||||||
|
$("#coqui_api_language").show();
|
||||||
$("#coqui_api_model_name").hide();
|
$("#coqui_api_model_name").hide();
|
||||||
$("#coqui_api_model_settings").hide();
|
$("#coqui_api_model_settings").hide();
|
||||||
$("#coqui_api_model_install_status").hide();
|
$("#coqui_api_model_install_status").hide();
|
||||||
|
@ -242,7 +249,16 @@ class CoquiTtsProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (model_origin == "local") {
|
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
|
this.updateVoiceMap(); // Overide any manual modification
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -282,7 +298,7 @@ class CoquiTtsProvider {
|
||||||
|
|
||||||
console.debug(DEBUG_PREFIX,"Current voice map: ",this.settings.voiceMap);
|
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]);
|
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();
|
const model_origin = $('#coqui_model_origin').val();
|
||||||
console.debug(model_origin);
|
console.debug(model_origin);
|
||||||
|
|
||||||
// TODO: show coqui model list
|
// show coqui model list
|
||||||
if (model_origin == "coqui-api") {
|
if (model_origin == "coqui-api") {
|
||||||
|
$("#coqui_local_model_div").hide();
|
||||||
$("#coqui_api_model_div").show();
|
$("#coqui_api_model_div").show();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
$("#coqui_api_model_div").hide();
|
|
||||||
|
|
||||||
// TODO show local model list
|
// show local model list
|
||||||
if (model_origin == "local") {
|
if (model_origin == "local") {
|
||||||
throwLocalOrigin();
|
$("#coqui_api_model_div").hide();
|
||||||
|
$("#coqui_local_model_div").show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -533,7 +550,33 @@ class CoquiTtsProvider {
|
||||||
return apiResult
|
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:
|
// Expect voiceId format to be like:
|
||||||
|
@ -609,6 +652,28 @@ class CoquiTtsProvider {
|
||||||
|
|
||||||
async function moduleWorker() {
|
async function moduleWorker() {
|
||||||
updateCharactersList();
|
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('<option value="none">Select model</option>')
|
||||||
|
.val('none');
|
||||||
|
|
||||||
|
for(const model_dataset of coquiLocalModels)
|
||||||
|
$("#coqui_local_model_name").append(new Option(model_dataset,model_dataset));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
"requires": [],
|
"requires": [],
|
||||||
"optional": [
|
"optional": [
|
||||||
"silero-tts",
|
"silero-tts",
|
||||||
"edge-tts"
|
"edge-tts",
|
||||||
|
"coqui-tts"
|
||||||
],
|
],
|
||||||
"js": "index.js",
|
"js": "index.js",
|
||||||
"css": "style.css",
|
"css": "style.css",
|
||||||
|
|
Loading…
Reference in New Issue