mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-12 12:25:20 +00:00
refac/enh: openai tts additional params support
This commit is contained in:
parent
a1fc99c66f
commit
5d5b42d3f5
4 changed files with 65 additions and 9 deletions
|
|
@ -3361,6 +3361,19 @@ AUDIO_TTS_OPENAI_API_KEY = PersistentConfig(
|
||||||
os.getenv("AUDIO_TTS_OPENAI_API_KEY", OPENAI_API_KEY),
|
os.getenv("AUDIO_TTS_OPENAI_API_KEY", OPENAI_API_KEY),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
audio_tts_openai_params = os.getenv("AUDIO_TTS_OPENAI_PARAMS", "")
|
||||||
|
try:
|
||||||
|
audio_tts_openai_params = json.loads(audio_tts_openai_params)
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
audio_tts_openai_params = {}
|
||||||
|
|
||||||
|
AUDIO_TTS_OPENAI_PARAMS = PersistentConfig(
|
||||||
|
"AUDIO_TTS_OPENAI_PARAMS",
|
||||||
|
"audio.tts.openai.params",
|
||||||
|
audio_tts_openai_params,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
AUDIO_TTS_API_KEY = PersistentConfig(
|
AUDIO_TTS_API_KEY = PersistentConfig(
|
||||||
"AUDIO_TTS_API_KEY",
|
"AUDIO_TTS_API_KEY",
|
||||||
"audio.tts.api_key",
|
"audio.tts.api_key",
|
||||||
|
|
|
||||||
|
|
@ -175,13 +175,14 @@ from open_webui.config import (
|
||||||
AUDIO_STT_AZURE_LOCALES,
|
AUDIO_STT_AZURE_LOCALES,
|
||||||
AUDIO_STT_AZURE_BASE_URL,
|
AUDIO_STT_AZURE_BASE_URL,
|
||||||
AUDIO_STT_AZURE_MAX_SPEAKERS,
|
AUDIO_STT_AZURE_MAX_SPEAKERS,
|
||||||
AUDIO_TTS_API_KEY,
|
|
||||||
AUDIO_TTS_ENGINE,
|
AUDIO_TTS_ENGINE,
|
||||||
AUDIO_TTS_MODEL,
|
AUDIO_TTS_MODEL,
|
||||||
|
AUDIO_TTS_VOICE,
|
||||||
AUDIO_TTS_OPENAI_API_BASE_URL,
|
AUDIO_TTS_OPENAI_API_BASE_URL,
|
||||||
AUDIO_TTS_OPENAI_API_KEY,
|
AUDIO_TTS_OPENAI_API_KEY,
|
||||||
|
AUDIO_TTS_OPENAI_PARAMS,
|
||||||
|
AUDIO_TTS_API_KEY,
|
||||||
AUDIO_TTS_SPLIT_ON,
|
AUDIO_TTS_SPLIT_ON,
|
||||||
AUDIO_TTS_VOICE,
|
|
||||||
AUDIO_TTS_AZURE_SPEECH_REGION,
|
AUDIO_TTS_AZURE_SPEECH_REGION,
|
||||||
AUDIO_TTS_AZURE_SPEECH_BASE_URL,
|
AUDIO_TTS_AZURE_SPEECH_BASE_URL,
|
||||||
AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT,
|
AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT,
|
||||||
|
|
@ -1096,11 +1097,15 @@ app.state.config.AUDIO_STT_AZURE_LOCALES = AUDIO_STT_AZURE_LOCALES
|
||||||
app.state.config.AUDIO_STT_AZURE_BASE_URL = AUDIO_STT_AZURE_BASE_URL
|
app.state.config.AUDIO_STT_AZURE_BASE_URL = AUDIO_STT_AZURE_BASE_URL
|
||||||
app.state.config.AUDIO_STT_AZURE_MAX_SPEAKERS = AUDIO_STT_AZURE_MAX_SPEAKERS
|
app.state.config.AUDIO_STT_AZURE_MAX_SPEAKERS = AUDIO_STT_AZURE_MAX_SPEAKERS
|
||||||
|
|
||||||
app.state.config.TTS_OPENAI_API_BASE_URL = AUDIO_TTS_OPENAI_API_BASE_URL
|
|
||||||
app.state.config.TTS_OPENAI_API_KEY = AUDIO_TTS_OPENAI_API_KEY
|
|
||||||
app.state.config.TTS_ENGINE = AUDIO_TTS_ENGINE
|
app.state.config.TTS_ENGINE = AUDIO_TTS_ENGINE
|
||||||
|
|
||||||
app.state.config.TTS_MODEL = AUDIO_TTS_MODEL
|
app.state.config.TTS_MODEL = AUDIO_TTS_MODEL
|
||||||
app.state.config.TTS_VOICE = AUDIO_TTS_VOICE
|
app.state.config.TTS_VOICE = AUDIO_TTS_VOICE
|
||||||
|
|
||||||
|
app.state.config.TTS_OPENAI_API_BASE_URL = AUDIO_TTS_OPENAI_API_BASE_URL
|
||||||
|
app.state.config.TTS_OPENAI_API_KEY = AUDIO_TTS_OPENAI_API_KEY
|
||||||
|
app.state.config.TTS_OPENAI_PARAMS = AUDIO_TTS_OPENAI_PARAMS
|
||||||
|
|
||||||
app.state.config.TTS_API_KEY = AUDIO_TTS_API_KEY
|
app.state.config.TTS_API_KEY = AUDIO_TTS_API_KEY
|
||||||
app.state.config.TTS_SPLIT_ON = AUDIO_TTS_SPLIT_ON
|
app.state.config.TTS_SPLIT_ON = AUDIO_TTS_SPLIT_ON
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,6 +154,7 @@ def set_faster_whisper_model(model: str, auto_update: bool = False):
|
||||||
class TTSConfigForm(BaseModel):
|
class TTSConfigForm(BaseModel):
|
||||||
OPENAI_API_BASE_URL: str
|
OPENAI_API_BASE_URL: str
|
||||||
OPENAI_API_KEY: str
|
OPENAI_API_KEY: str
|
||||||
|
OPENAI_PARAMS: Optional[dict] = None
|
||||||
API_KEY: str
|
API_KEY: str
|
||||||
ENGINE: str
|
ENGINE: str
|
||||||
MODEL: str
|
MODEL: str
|
||||||
|
|
@ -190,6 +191,7 @@ async def get_audio_config(request: Request, user=Depends(get_admin_user)):
|
||||||
"tts": {
|
"tts": {
|
||||||
"OPENAI_API_BASE_URL": request.app.state.config.TTS_OPENAI_API_BASE_URL,
|
"OPENAI_API_BASE_URL": request.app.state.config.TTS_OPENAI_API_BASE_URL,
|
||||||
"OPENAI_API_KEY": request.app.state.config.TTS_OPENAI_API_KEY,
|
"OPENAI_API_KEY": request.app.state.config.TTS_OPENAI_API_KEY,
|
||||||
|
"OPENAI_PARAMS": request.app.state.config.TTS_OPENAI_PARAMS,
|
||||||
"API_KEY": request.app.state.config.TTS_API_KEY,
|
"API_KEY": request.app.state.config.TTS_API_KEY,
|
||||||
"ENGINE": request.app.state.config.TTS_ENGINE,
|
"ENGINE": request.app.state.config.TTS_ENGINE,
|
||||||
"MODEL": request.app.state.config.TTS_MODEL,
|
"MODEL": request.app.state.config.TTS_MODEL,
|
||||||
|
|
@ -222,6 +224,7 @@ async def update_audio_config(
|
||||||
):
|
):
|
||||||
request.app.state.config.TTS_OPENAI_API_BASE_URL = form_data.tts.OPENAI_API_BASE_URL
|
request.app.state.config.TTS_OPENAI_API_BASE_URL = form_data.tts.OPENAI_API_BASE_URL
|
||||||
request.app.state.config.TTS_OPENAI_API_KEY = form_data.tts.OPENAI_API_KEY
|
request.app.state.config.TTS_OPENAI_API_KEY = form_data.tts.OPENAI_API_KEY
|
||||||
|
request.app.state.config.TTS_OPENAI_PARAMS = form_data.tts.OPENAI_PARAMS
|
||||||
request.app.state.config.TTS_API_KEY = form_data.tts.API_KEY
|
request.app.state.config.TTS_API_KEY = form_data.tts.API_KEY
|
||||||
request.app.state.config.TTS_ENGINE = form_data.tts.ENGINE
|
request.app.state.config.TTS_ENGINE = form_data.tts.ENGINE
|
||||||
request.app.state.config.TTS_MODEL = form_data.tts.MODEL
|
request.app.state.config.TTS_MODEL = form_data.tts.MODEL
|
||||||
|
|
@ -262,12 +265,13 @@ async def update_audio_config(
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"tts": {
|
"tts": {
|
||||||
"OPENAI_API_BASE_URL": request.app.state.config.TTS_OPENAI_API_BASE_URL,
|
|
||||||
"OPENAI_API_KEY": request.app.state.config.TTS_OPENAI_API_KEY,
|
|
||||||
"API_KEY": request.app.state.config.TTS_API_KEY,
|
|
||||||
"ENGINE": request.app.state.config.TTS_ENGINE,
|
"ENGINE": request.app.state.config.TTS_ENGINE,
|
||||||
"MODEL": request.app.state.config.TTS_MODEL,
|
"MODEL": request.app.state.config.TTS_MODEL,
|
||||||
"VOICE": request.app.state.config.TTS_VOICE,
|
"VOICE": request.app.state.config.TTS_VOICE,
|
||||||
|
"OPENAI_API_BASE_URL": request.app.state.config.TTS_OPENAI_API_BASE_URL,
|
||||||
|
"OPENAI_API_KEY": request.app.state.config.TTS_OPENAI_API_KEY,
|
||||||
|
"OPENAI_PARAMS": request.app.state.config.TTS_OPENAI_PARAMS,
|
||||||
|
"API_KEY": request.app.state.config.TTS_API_KEY,
|
||||||
"SPLIT_ON": request.app.state.config.TTS_SPLIT_ON,
|
"SPLIT_ON": request.app.state.config.TTS_SPLIT_ON,
|
||||||
"AZURE_SPEECH_REGION": request.app.state.config.TTS_AZURE_SPEECH_REGION,
|
"AZURE_SPEECH_REGION": request.app.state.config.TTS_AZURE_SPEECH_REGION,
|
||||||
"AZURE_SPEECH_BASE_URL": request.app.state.config.TTS_AZURE_SPEECH_BASE_URL,
|
"AZURE_SPEECH_BASE_URL": request.app.state.config.TTS_AZURE_SPEECH_BASE_URL,
|
||||||
|
|
@ -337,6 +341,11 @@ async def speech(request: Request, user=Depends(get_verified_user)):
|
||||||
async with aiohttp.ClientSession(
|
async with aiohttp.ClientSession(
|
||||||
timeout=timeout, trust_env=True
|
timeout=timeout, trust_env=True
|
||||||
) as session:
|
) as session:
|
||||||
|
payload = {
|
||||||
|
**payload,
|
||||||
|
**(request.app.state.config.TTS_OPENAI_PARAMS or {}),
|
||||||
|
}
|
||||||
|
|
||||||
r = await session.post(
|
r = await session.post(
|
||||||
url=f"{request.app.state.config.TTS_OPENAI_API_BASE_URL}/audio/speech",
|
url=f"{request.app.state.config.TTS_OPENAI_API_BASE_URL}/audio/speech",
|
||||||
json=payload,
|
json=payload,
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
import type { Writable } from 'svelte/store';
|
import type { Writable } from 'svelte/store';
|
||||||
import type { i18n as i18nType } from 'i18next';
|
import type { i18n as i18nType } from 'i18next';
|
||||||
|
import Textarea from '$lib/components/common/Textarea.svelte';
|
||||||
|
|
||||||
const i18n = getContext<Writable<i18nType>>('i18n');
|
const i18n = getContext<Writable<i18nType>>('i18n');
|
||||||
|
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
let TTS_ENGINE = '';
|
let TTS_ENGINE = '';
|
||||||
let TTS_MODEL = '';
|
let TTS_MODEL = '';
|
||||||
let TTS_VOICE = '';
|
let TTS_VOICE = '';
|
||||||
|
let TTS_OPENAI_PARAMS = '';
|
||||||
let TTS_SPLIT_ON: TTS_RESPONSE_SPLIT = TTS_RESPONSE_SPLIT.PUNCTUATION;
|
let TTS_SPLIT_ON: TTS_RESPONSE_SPLIT = TTS_RESPONSE_SPLIT.PUNCTUATION;
|
||||||
let TTS_AZURE_SPEECH_REGION = '';
|
let TTS_AZURE_SPEECH_REGION = '';
|
||||||
let TTS_AZURE_SPEECH_BASE_URL = '';
|
let TTS_AZURE_SPEECH_BASE_URL = '';
|
||||||
|
|
@ -98,18 +100,28 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateConfigHandler = async () => {
|
const updateConfigHandler = async () => {
|
||||||
|
let openaiParams = {};
|
||||||
|
try {
|
||||||
|
openaiParams = TTS_OPENAI_PARAMS ? JSON.parse(TTS_OPENAI_PARAMS) : {};
|
||||||
|
TTS_OPENAI_PARAMS = JSON.stringify(openaiParams, null, 2);
|
||||||
|
} catch (e) {
|
||||||
|
toast.error($i18n.t('Invalid JSON format for Parameters'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const res = await updateAudioConfig(localStorage.token, {
|
const res = await updateAudioConfig(localStorage.token, {
|
||||||
tts: {
|
tts: {
|
||||||
OPENAI_API_BASE_URL: TTS_OPENAI_API_BASE_URL,
|
OPENAI_API_BASE_URL: TTS_OPENAI_API_BASE_URL,
|
||||||
OPENAI_API_KEY: TTS_OPENAI_API_KEY,
|
OPENAI_API_KEY: TTS_OPENAI_API_KEY,
|
||||||
|
OPENAI_PARAMS: openaiParams,
|
||||||
API_KEY: TTS_API_KEY,
|
API_KEY: TTS_API_KEY,
|
||||||
ENGINE: TTS_ENGINE,
|
ENGINE: TTS_ENGINE,
|
||||||
MODEL: TTS_MODEL,
|
MODEL: TTS_MODEL,
|
||||||
VOICE: TTS_VOICE,
|
VOICE: TTS_VOICE,
|
||||||
SPLIT_ON: TTS_SPLIT_ON,
|
|
||||||
AZURE_SPEECH_REGION: TTS_AZURE_SPEECH_REGION,
|
AZURE_SPEECH_REGION: TTS_AZURE_SPEECH_REGION,
|
||||||
AZURE_SPEECH_BASE_URL: TTS_AZURE_SPEECH_BASE_URL,
|
AZURE_SPEECH_BASE_URL: TTS_AZURE_SPEECH_BASE_URL,
|
||||||
AZURE_SPEECH_OUTPUT_FORMAT: TTS_AZURE_SPEECH_OUTPUT_FORMAT
|
AZURE_SPEECH_OUTPUT_FORMAT: TTS_AZURE_SPEECH_OUTPUT_FORMAT,
|
||||||
|
SPLIT_ON: TTS_SPLIT_ON
|
||||||
},
|
},
|
||||||
stt: {
|
stt: {
|
||||||
OPENAI_API_BASE_URL: STT_OPENAI_API_BASE_URL,
|
OPENAI_API_BASE_URL: STT_OPENAI_API_BASE_URL,
|
||||||
|
|
@ -146,6 +158,7 @@
|
||||||
console.log(res);
|
console.log(res);
|
||||||
TTS_OPENAI_API_BASE_URL = res.tts.OPENAI_API_BASE_URL;
|
TTS_OPENAI_API_BASE_URL = res.tts.OPENAI_API_BASE_URL;
|
||||||
TTS_OPENAI_API_KEY = res.tts.OPENAI_API_KEY;
|
TTS_OPENAI_API_KEY = res.tts.OPENAI_API_KEY;
|
||||||
|
TTS_OPENAI_PARAMS = JSON.stringify(res?.tts?.OPENAI_PARAMS ?? '', null, 2);
|
||||||
TTS_API_KEY = res.tts.API_KEY;
|
TTS_API_KEY = res.tts.API_KEY;
|
||||||
|
|
||||||
TTS_ENGINE = res.tts.ENGINE;
|
TTS_ENGINE = res.tts.ENGINE;
|
||||||
|
|
@ -612,6 +625,22 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
|
||||||
|
<div class="w-full">
|
||||||
|
<div class=" mb-1.5 text-xs font-medium">{$i18n.t('Additional Parameters')}</div>
|
||||||
|
<div class="flex w-full">
|
||||||
|
<div class="flex-1">
|
||||||
|
<Textarea
|
||||||
|
className="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
|
||||||
|
bind:value={TTS_OPENAI_PARAMS}
|
||||||
|
placeholder={$i18n.t('Enter additional parameters')}
|
||||||
|
minSize={100}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{:else if TTS_ENGINE === 'elevenlabs'}
|
{:else if TTS_ENGINE === 'elevenlabs'}
|
||||||
<div class=" flex gap-2">
|
<div class=" flex gap-2">
|
||||||
<div class="w-full">
|
<div class="w-full">
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue