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)