diff --git a/public/scripts/extensions/expressions/index.js b/public/scripts/extensions/expressions/index.js index 2e6e7e67a..52715ea99 100644 --- a/public/scripts/extensions/expressions/index.js +++ b/public/scripts/extensions/expressions/index.js @@ -9,7 +9,7 @@ const MODULE_NAME = 'expressions'; const UPDATE_INTERVAL = 2000; const FALLBACK_EXPRESSION = 'joy'; const DEFAULT_EXPRESSIONS = [ - "live2d", + "talkinghead", "admiration", "amusement", "anger", @@ -396,7 +396,7 @@ function onExpressionsShowDefaultInput() { async function unloadLiveChar() { try { const url = new URL(getApiUrl()); - url.pathname = '/api/live2d/unload'; + url.pathname = '/api/talkinghead/unload'; const loadResponse = await doExtrasFetch(url); if (!loadResponse.ok) { throw new Error(loadResponse.statusText); @@ -409,8 +409,8 @@ async function unloadLiveChar() { } async function loadLiveChar() { - if (!modules.includes('live2d')) { - console.debug('live2d module is disabled'); + if (!modules.includes('talkinghead')) { + console.debug('talkinghead module is disabled'); return; } @@ -426,22 +426,22 @@ async function loadLiveChar() { spriteFolderName = expressionOverride.path; } - const live2dPath = `/characters/${encodeURIComponent(spriteFolderName)}/live2d.png`; + const talkingheadPath = `/characters/${encodeURIComponent(spriteFolderName)}/talkinghead.png`; try { - const spriteResponse = await fetch(live2dPath); + const spriteResponse = await fetch(talkingheadPath); if (!spriteResponse.ok) { throw new Error(spriteResponse.statusText); } const spriteBlob = await spriteResponse.blob(); - const spriteFile = new File([spriteBlob], 'live2d.png', { type: 'image/png' }); + const spriteFile = new File([spriteBlob], 'talkinghead.png', { type: 'image/png' }); const formData = new FormData(); formData.append('file', spriteFile); const url = new URL(getApiUrl()); - url.pathname = '/api/live2d/load'; + url.pathname = '/api/talkinghead/load'; const loadResponse = await doExtrasFetch(url, { method: 'POST', @@ -453,10 +453,10 @@ async function loadLiveChar() { } const loadResponseText = await loadResponse.text(); - console.log(`Load live2d response: ${loadResponseText}`); + console.log(`Load talkinghead response: ${loadResponseText}`); } catch (error) { - console.error(`Error loading live2d image: ${live2dPath} - ${error}`); + console.error(`Error loading talkinghead image: ${talkingheadPath} - ${error}`); } } @@ -468,11 +468,11 @@ function handleImageChange() { return; } - if (extension_settings.expressions.live2d) { + if (extension_settings.expressions.talkinghead) { // Method get IP of endpoint - const live2dResultFeedSrc = `${getApiUrl()}/api/live2d/result_feed`; + const talkingheadResultFeedSrc = `${getApiUrl()}/api/talkinghead/result_feed`; $('#expression-holder').css({ display: '' }); - if (imgElement.src !== live2dResultFeedSrc) { + if (imgElement.src !== talkingheadResultFeedSrc) { const expressionImageElement = document.querySelector('.expression_list_image'); if (expressionImageElement) { @@ -481,7 +481,7 @@ function handleImageChange() { }) .then(response => { if (response.ok) { - imgElement.src = live2dResultFeedSrc; + imgElement.src = talkingheadResultFeedSrc; } }) .catch(error => { @@ -514,9 +514,9 @@ async function moduleWorker() { imgElement.src = ""; //set checkbox to global var - $('#image_type_toggle').prop('checked', extension_settings.expressions.live2d); - if (extension_settings.expressions.live2d) { - setLive2dState(extension_settings.expressions.live2d); + $('#image_type_toggle').prop('checked', extension_settings.expressions.talkinghead); + if (extension_settings.expressions.talkinghead) { + settalkingheadState(extension_settings.expressions.talkinghead); } } @@ -622,7 +622,7 @@ async function moduleWorker() { } } -async function live2dcheck() { +async function talkingheadcheck() { const context = getContext(); let spriteFolderName = context.name2; const message = getLastCharacterMessage(); @@ -638,14 +638,14 @@ async function live2dcheck() { try { await validateImages(spriteFolderName); - let live2dObj = spriteCache[spriteFolderName].find(obj => obj.label === 'live2d'); - let live2dPath_f = live2dObj ? live2dObj.path : null; + let talkingheadObj = spriteCache[spriteFolderName].find(obj => obj.label === 'talkinghead'); + let talkingheadPath_f = talkingheadObj ? talkingheadObj.path : null; - if (live2dPath_f != null) { - //console.log("live2dPath_f " + live2dPath_f); + if (talkingheadPath_f != null) { + //console.log("talkingheadPath_f " + talkingheadPath_f); return true; } else { - //console.log("live2dPath_f is null"); + //console.log("talkingheadPath_f is null"); unloadLiveChar(); return false; } @@ -654,15 +654,15 @@ async function live2dcheck() { } } -function setLive2dState(switch_var) { - extension_settings.expressions.live2d = switch_var; // Store setting +function settalkingheadState(switch_var) { + extension_settings.expressions.talkinghead = switch_var; // Store setting saveSettingsDebounced(); - live2dcheck().then(result => { + talkingheadcheck().then(result => { if (result) { - //console.log("Live2d exists!"); + //console.log("talkinghead exists!"); - if (extension_settings.expressions.live2d) { + if (extension_settings.expressions.talkinghead) { loadLiveChar(); } else { unloadLiveChar(); @@ -671,7 +671,7 @@ function setLive2dState(switch_var) { } else { - //console.log("Live2d does not exist."); + //console.log("talkinghead does not exist."); } }); } @@ -863,7 +863,7 @@ async function getExpressionsList() { } async function setExpression(character, expression, force) { - if (!extension_settings.expressions.live2d) { + if (!extension_settings.expressions.talkinghead) { console.debug('entered setExpressions'); await validateImages(character); const img = $('img.expression'); @@ -976,14 +976,14 @@ async function setExpression(character, expression, force) { } else { - live2dcheck().then(result => { + talkingheadcheck().then(result => { if (result) { // Find the element with id="expression-image" and class="expression" const imgElement = document.querySelector('img#expression-image.expression'); //console.log("searching"); if (imgElement) { //console.log("setting value"); - imgElement.src = getApiUrl() + '/api/live2d/result_feed'; + imgElement.src = getApiUrl() + '/api/talkinghead/result_feed'; } } else { @@ -1255,7 +1255,7 @@ function setExpressionOverrideHtml(forceClear = false) {
@@ -1305,7 +1305,7 @@ function setExpressionOverrideHtml(forceClear = false) { $('.expression_settings').hide(); $('#image_type_toggle').on('click', function () { - setLive2dState(this.checked); + settalkingheadState(this.checked); }); } diff --git a/public/scripts/extensions/tts/index.js b/public/scripts/extensions/tts/index.js index ad5514e2c..d1a4d8bef 100644 --- a/public/scripts/extensions/tts/index.js +++ b/public/scripts/extensions/tts/index.js @@ -9,6 +9,7 @@ import { SystemTtsProvider } from './system.js' import { NovelTtsProvider } from './novel.js' import { power_user } from '../../power-user.js' import { rvcVoiceConversion } from "../rvc/index.js" +export { talkingAnimation }; const UPDATE_INTERVAL = 1000 @@ -171,12 +172,13 @@ function talkingAnimation(switchValue) { if (switchValue !== storedvalue) { try { console.log(animationType + " Talking Animation"); - doExtrasFetch(`${apiUrl}/api/live2d/${animationType}_talking`); + doExtrasFetch(`${apiUrl}/api/talkinghead/${animationType}_talking`); storedvalue = switchValue; // Update the storedvalue to the current switchValue } catch (error) { // Handle the error here or simply ignore it to prevent logging } } + updateUiAudioPlayState() } function resetTtsPlayback() { @@ -305,10 +307,8 @@ function updateUiAudioPlayState() { // Give user feedback that TTS is active by setting the stop icon if processing or playing if (!audioElement.paused || isTtsProcessing()) { img = 'fa-solid fa-stop-circle extensionsMenuExtensionButton' - talkingAnimation(true) } else { img = 'fa-solid fa-circle-play extensionsMenuExtensionButton' - talkingAnimation(false) } $('#tts_media_control').attr('class', img); } else { @@ -345,6 +345,7 @@ function completeCurrentAudioJob() { audioQueueProcessorReady = true currentAudioJob = null lastAudioPosition = 0 + talkingAnimation(false) //stop lip animation // updateUiPlayState(); } diff --git a/public/scripts/extensions/tts/system.js b/public/scripts/extensions/tts/system.js index acbf3d4e9..5e8c5f2b0 100644 --- a/public/scripts/extensions/tts/system.js +++ b/public/scripts/extensions/tts/system.js @@ -1,5 +1,6 @@ import { isMobile } from "../../RossAscends-mods.js"; import { getPreviewString } from "./index.js"; +import { talkingAnimation } from './index.js'; export { SystemTtsProvider } @@ -69,6 +70,7 @@ var speechUtteranceChunker = function (utt, settings, callback) { //placing the speak invocation inside a callback fixes ordering and onend issues. setTimeout(function () { speechSynthesis.speak(newUtt); + talkingAnimation(true); }, 0); }; @@ -221,6 +223,7 @@ class SystemTtsProvider { //some code to execute when done resolve(silence); console.log('System TTS done'); + talkingAnimation(false); }); }); }