diff --git a/server/node/server.cjs b/server/node/server.cjs index 00c9de80..abf88d98 100644 --- a/server/node/server.cjs +++ b/server/node/server.cjs @@ -3,12 +3,11 @@ const app = express(); const path = require('path'); const htmlparser = require('node-html-parser'); const { existsSync, mkdirSync, readFileSync, writeFileSync } = require('fs'); -const bodyParser = require('body-parser'); const fs = require('fs/promises') const crypto = require('crypto') app.use(express.static(path.join(process.cwd(), 'dist'), {index: false})); -app.use(bodyParser.raw({ limit: 100000000 })); -app.use(bodyParser.json()) +app.use(express.json({ limit: '50mb' })); +app.use(express.raw({ type: 'application/octet-stream', limit: '50mb' })); const {pipeline} = require('stream/promises') let password = '' @@ -90,6 +89,55 @@ const reverseProxyFunc = async (req, res, next) => { } } +const reverseProxyFunc_get = async (req, res, next) => { + const urlParam = req.headers['risu-url'] ? decodeURIComponent(req.headers['risu-url']) : req.query.url; + + if (!urlParam) { + res.status(400).send({ + error:'URL has no param' + }); + return; + } + const header = req.headers['risu-header'] ? JSON.parse(decodeURIComponent(req.headers['risu-header'])) : req.headers; + if(!header['x-forwarded-for']){ + header['x-forwarded-for'] = req.ip + } + let originalResponse; + try { + // make request to original server + originalResponse = await fetch(urlParam, { + method: 'GET', + headers: header + }); + // get response body as stream + const originalBody = originalResponse.body; + // get response headers + const head = new Headers(originalResponse.headers); + head.delete('content-security-policy'); + head.delete('content-security-policy-report-only'); + head.delete('clear-site-data'); + head.delete('Cache-Control'); + head.delete('Content-Encoding'); + const headObj = {}; + for (let [k, v] of head) { + headObj[k] = v; + } + // send response headers to client + res.header(headObj); + // send response status to client + res.status(originalResponse.status); + // send response body to client + await pipeline(originalResponse.body, res); + } + catch (err) { + next(err); + return; + } +} + +app.get('/proxy', reverseProxyFunc_get); +app.get('/proxy2', reverseProxyFunc_get); + app.post('/proxy', reverseProxyFunc); app.post('/proxy2', reverseProxyFunc); @@ -248,4 +296,4 @@ app.post('/api/write', async (req, res, next) => { app.listen(6001, () => { console.log("Server is listening on http://localhost:6001/"); -}); +}); \ No newline at end of file diff --git a/src/lib/Setting/Pages/LanguageSettings.svelte b/src/lib/Setting/Pages/LanguageSettings.svelte index 23cdfe32..3ffafe78 100644 --- a/src/lib/Setting/Pages/LanguageSettings.svelte +++ b/src/lib/Setting/Pages/LanguageSettings.svelte @@ -117,6 +117,21 @@ {/if} + {#if $DataBase.translatorType === 'google'} + Translator Input Language + + Auto + English + Chinese + Japanese + Korean + French + Spanish + German + Russian + + {/if} +
diff --git a/src/lib/Setting/Pages/OtherBotSettings.svelte b/src/lib/Setting/Pages/OtherBotSettings.svelte index 2efd6801..94b665e5 100644 --- a/src/lib/Setting/Pages/OtherBotSettings.svelte +++ b/src/lib/Setting/Pages/OtherBotSettings.svelte @@ -13,6 +13,7 @@ import Button from "src/lib/UI/GUI/Button.svelte"; import { getCharImage } from "src/ts/characters"; import Arcodion from "src/lib/UI/Arcodion.svelte"; + import CheckInput from "src/lib/UI/GUI/CheckInput.svelte"; $:{ $DataBase.NAIImgConfig ??= { width: 512, @@ -299,6 +300,9 @@ {#if submenu === 1 || submenu === -1} + Auto Speech + + ElevenLabs API key diff --git a/src/lib/SideBars/CharConfig.svelte b/src/lib/SideBars/CharConfig.svelte index 2da312a0..a35b1b5f 100644 --- a/src/lib/SideBars/CharConfig.svelte +++ b/src/lib/SideBars/CharConfig.svelte @@ -112,6 +112,13 @@ if (!(currentChar.data as character).gptSoVitsConfig.use_prompt) { (currentChar.data as character).gptSoVitsConfig.prompt = undefined } + if((currentChar.data as character).gptSoVitsConfig.use_auto_path){ + (currentChar.data as character).gptSoVitsConfig.ref_audio_path = undefined; + + (currentChar.data as character).gptSoVitsConfig.use_prompt = false; + (currentChar.data as character).gptSoVitsConfig.prompt = undefined; + + } } }) @@ -160,7 +167,9 @@ $: if (currentChar.data.ttsMode === 'gptsovits' && (currentChar.data as character).gptSoVitsConfig === undefined) { (currentChar.data as character).gptSoVitsConfig = { url: '', - ref_audio_path: 'C:/Users/user/Downloads/GPT-SoVITS-v2-240821', + use_auto_path: false, + ref_audio_path: '', + use_long_audio: false, ref_audio_data: { fileName: '', assetId: '' @@ -835,15 +844,24 @@ URL - Reference Audio Path (e.g. C:/Users/user/Downloads/GPT-SoVITS-v2-240821) - + Use Auto Path + + + {#if !currentChar.data.gptSoVitsConfig.use_auto_path} + Reference Audio Path (e.g. C:/Users/user/Downloads/GPT-SoVITS-v2-240821) + + {/if} + + Use Long Audio + Reference Audio Data (3~10s audio file) Text Language - Auto - Auto (Cantonese) + Multi-language Mixed + Multi-language Mixed (Cantonese) English - Chinese - Japanese - Cantonese - Korean - All Chinese - All Japanese - All Cantonese - All Korean + Chinese-English Mixed + Japanese-English Mixed + Cantonese-English Mixed + Korean-English Mixed + Chinese + Japanese + Cantonese + Korean - Use Reference Audio Script - + {#if !currentChar.data.gptSoVitsConfig.use_long_audio} + Use Reference Audio Script + + {/if} - {#if currentChar.data.gptSoVitsConfig.use_prompt} + {#if currentChar.data.gptSoVitsConfig.use_prompt && !currentChar.data.gptSoVitsConfig.use_long_audio} Reference Audio Script {/if} Reference Audio Language - Auto - Auto (Cantonese) + Multi-language Mixed + Multi-language Mixed (Cantonese) English - Chinese - Japanese - Cantonese - Korean - English And Chinese - English And Japanese - English And Cantonese - English And Korean + Chinese-English Mixed + Japanese-English Mixed + Cantonese-English Mixed + Korean-English Mixed + Chinese + Japanese + Cantonese + Korean Top P diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts index 483da9a8..86312035 100644 --- a/src/ts/process/index.ts +++ b/src/ts/process/index.ts @@ -1181,7 +1181,9 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n db.characters[selectedChar].chats[selectedChat] = currentChat setDatabase(db) } - await sayTTS(currentChar, result) + if(db.ttsAutoSpeech){ + await sayTTS(currentChar, result) + } } else{ const msgs = (req.type === 'success') ? [['char',req.result]] as const @@ -1240,7 +1242,9 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n mrerolls.push(result) } db.characters[selectedChar].reloadKeys += 1 - await sayTTS(currentChar, result) + if(db.ttsAutoSpeech){ + await sayTTS(currentChar, result) + } setDatabase(db) } diff --git a/src/ts/process/tts.ts b/src/ts/process/tts.ts index 6ecbb755..57a4dbfe 100644 --- a/src/ts/process/tts.ts +++ b/src/ts/process/tts.ts @@ -235,12 +235,12 @@ export async function sayTTS(character:character,text:string) { const audioContext = new AudioContext(); const audio: Uint8Array = await loadAsset(character.gptSoVitsConfig.ref_audio_data.assetId); - const base64Audio = btoa(new Uint8Array(audio).reduce((data, byte) => data + String.fromCharCode(byte), '')); + const base64Audio = btoa(new Uint8Array(audio).reduce((data, byte) => data + String.fromCharCode(byte), '')); const body = { text: text, text_lang: character.gptSoVitsConfig.text_lang, - ref_audio_path: character.gptSoVitsConfig.ref_audio_path + '/public/audio/' + character.gptSoVitsConfig.ref_audio_data.fileName, + ref_audio_path: undefined, ref_audio_name: character.gptSoVitsConfig.ref_audio_data.fileName, ref_audio_data: base64Audio, prompt_text: undefined, @@ -250,18 +250,41 @@ export async function sayTTS(character:character,text:string) { speed_factor: character.gptSoVitsConfig.speed, top_k: character.gptSoVitsConfig.top_k, text_split_method: character.gptSoVitsConfig.text_split_method, - parallel_infer: false, + parallel_infer: true, + // media_type: character.gptSoVitsConfig.ref_audio_data.fileName.split('.')[1], + ref_free: character.gptSoVitsConfig.use_long_audio || !character.gptSoVitsConfig.use_prompt, } if (character.gptSoVitsConfig.use_prompt){ body.prompt_text = character.gptSoVitsConfig.prompt } + + if (character.gptSoVitsConfig.use_auto_path){ + console.log('auto') + const path = await globalFetch(`${character.gptSoVitsConfig.url}/get_path`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json' + }, + rawResponse: false, + + }) + console.log(path) + if(path.ok){ + body.ref_audio_path = path.data.message + '/public/audio/' + character.gptSoVitsConfig.ref_audio_data.fileName + } + else{ + throw new Error('Failed to Auto get path') + } + } else { + body.ref_audio_path = character.gptSoVitsConfig.ref_audio_path + '/public/audio/' + character.gptSoVitsConfig.ref_audio_data.fileName + } console.log(body) const response = await globalFetch(`${character.gptSoVitsConfig.url}/tts`, { method: 'POST', headers: { - "Content-Type": "application/json", + 'Content-Type': 'application/json' }, body: body, rawResponse: true, diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index af44f990..67f85949 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -430,7 +430,8 @@ export function setDatabase(data:Database){ } data.hideApiKey ??= true data.unformatQuotes ??= false - + data.ttsAutoSpeech ??= false + data.translatorInputLanguage ??= 'auto' changeLanguage(data.language) DataBase.set(data) } @@ -510,6 +511,7 @@ export interface Database{ NAII2I:boolean NAIREF:boolean NAIImgConfig:NAIImgConfig + ttsAutoSpeech?:boolean runpodKey:string promptPreprocess:boolean bias: [string, number][] @@ -614,6 +616,7 @@ export interface Database{ emotionProcesser:'submodel'|'embedding', showMenuChatList?:boolean, translatorType:'google'|'deepl'|'none'|'llm'|'deeplX', + translatorInputLanguage?:string NAIadventure?:boolean, NAIappendName?:boolean, deeplOptions:{ @@ -809,7 +812,9 @@ export interface character{ } gptSoVitsConfig?:{ url?:string + use_auto_path?:boolean ref_audio_path?:string + use_long_audio?:boolean ref_audio_data?: { fileName:string assetId:string diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts index f7f447ec..90d7f321 100644 --- a/src/ts/translator/translator.ts +++ b/src/ts/translator/translator.ts @@ -165,7 +165,7 @@ async function translateMain(text:string, arg:{from:string, to:string, host:stri } - const url = `https://${arg.host}/translate_a/single?client=gtx&dt=t&sl=auto&tl=${arg.to}&q=` + encodeURIComponent(text) + const url = `https://${arg.host}/translate_a/single?client=gtx&dt=t&sl=${db.translatorInputLanguage}&tl=${arg.to}&q=` + encodeURIComponent(text)