This commit is contained in:
Timothy Jaeryang Baek
2026-07-01 02:26:47 -05:00
parent 8fe480250f
commit 989c6c13f5
3 changed files with 59 additions and 15 deletions
+3
View File
@@ -1532,6 +1532,8 @@ AUDIO_STT_OPENAI_API_BASE_URL = os.getenv('AUDIO_STT_OPENAI_API_BASE_URL', OPENA
AUDIO_STT_OPENAI_API_KEY = os.getenv('AUDIO_STT_OPENAI_API_KEY', OPENAI_API_KEY)
AUDIO_STT_OPENAI_API_REQUEST_FORMAT = os.getenv('AUDIO_STT_OPENAI_API_REQUEST_FORMAT', 'multipart')
AUDIO_STT_ENGINE = os.getenv('AUDIO_STT_ENGINE', '')
AUDIO_STT_MODEL = os.getenv('AUDIO_STT_MODEL', '')
@@ -2966,6 +2968,7 @@ DEFAULT_CONFIG = {
'audio.stt.deepgram.api_key': DEEPGRAM_API_KEY,
'audio.stt.openai.api_base_url': AUDIO_STT_OPENAI_API_BASE_URL,
'audio.stt.openai.api_key': AUDIO_STT_OPENAI_API_KEY,
'audio.stt.openai.api_request_format': AUDIO_STT_OPENAI_API_REQUEST_FORMAT,
'audio.stt.engine': AUDIO_STT_ENGINE,
'audio.stt.model': AUDIO_STT_MODEL,
'audio.stt.supported_content_types': AUDIO_STT_SUPPORTED_CONTENT_TYPES,
+38 -15
View File
@@ -94,6 +94,7 @@ TTS_CONFIG_KEYS = {
STT_CONFIG_KEYS = {
'OPENAI_API_BASE_URL': 'audio.stt.openai.api_base_url',
'OPENAI_API_KEY': 'audio.stt.openai.api_key',
'OPENAI_API_REQUEST_FORMAT': 'audio.stt.openai.api_request_format',
'ENGINE': 'audio.stt.engine',
'MODEL': 'audio.stt.model',
'SUPPORTED_CONTENT_TYPES': 'audio.stt.supported_content_types',
@@ -252,6 +253,7 @@ class TTSConfigForm(BaseModel):
class STTConfigForm(BaseModel):
OPENAI_API_BASE_URL: str
OPENAI_API_KEY: str
OPENAI_API_REQUEST_FORMAT: str = 'multipart'
ENGINE: str
MODEL: str
SUPPORTED_CONTENT_TYPES: list[str] = []
@@ -644,28 +646,49 @@ async def _transcribe_openai(request, file_path, filename, languages, file_dir,
r = None
try:
session = await get_session()
api_key = await Config.get('audio.stt.openai.api_key')
api_base_url = await Config.get('audio.stt.openai.api_base_url')
request_format = (
await Config.get('audio.stt.openai.api_request_format') or 'multipart'
).lower()
headers = {'Authorization': f'Bearer {api_key}'}
if user and ENABLE_FORWARD_USER_INFO_HEADERS:
headers = include_user_info_headers(headers, user)
for language in languages:
payload = {'model': await Config.get('audio.stt.model')}
if language:
payload['language'] = language
api_key = await Config.get('audio.stt.openai.api_key')
api_base_url = await Config.get('audio.stt.openai.api_base_url')
headers = {'Authorization': f'Bearer {api_key}'}
if user and ENABLE_FORWARD_USER_INFO_HEADERS:
headers = include_user_info_headers(headers, user)
if request_format == 'json':
ext = os.path.splitext(filename)[1].lower().lstrip('.') or 'wav'
async with aiofiles.open(file_path, 'rb') as f:
payload['input_audio'] = {
'data': base64.b64encode(await f.read()).decode('utf-8'),
'format': 'ogg' if ext == 'oga' else ext,
}
form_data = aiohttp.FormData()
for key, value in payload.items():
form_data.add_field(key, str(value))
form_data.add_field('file', open(file_path, 'rb'), filename=filename)
r = await session.post(
url=f'{api_base_url}/audio/transcriptions',
headers={**headers, 'Content-Type': 'application/json'},
json=payload,
ssl=AIOHTTP_CLIENT_SESSION_SSL,
)
else:
form_data = aiohttp.FormData()
for key, value in payload.items():
form_data.add_field(key, str(value))
r = await session.post(
url=f'{api_base_url}/audio/transcriptions',
headers=headers,
data=form_data,
ssl=AIOHTTP_CLIENT_SESSION_SSL,
)
with open(file_path, 'rb') as audio_file:
form_data.add_field('file', audio_file, filename=filename)
r = await session.post(
url=f'{api_base_url}/audio/transcriptions',
headers=headers,
data=form_data,
ssl=AIOHTTP_CLIENT_SESSION_SSL,
)
if r.status == 200:
break
@@ -43,6 +43,7 @@
let STT_OPENAI_API_BASE_URL = '';
let STT_OPENAI_API_KEY = '';
let STT_OPENAI_API_REQUEST_FORMAT = 'multipart';
let STT_ENGINE = '';
let STT_MODEL = '';
let STT_SUPPORTED_CONTENT_TYPES = '';
@@ -150,6 +151,7 @@
stt: {
OPENAI_API_BASE_URL: STT_OPENAI_API_BASE_URL,
OPENAI_API_KEY: STT_OPENAI_API_KEY,
OPENAI_API_REQUEST_FORMAT: STT_OPENAI_API_REQUEST_FORMAT,
ENGINE: STT_ENGINE,
MODEL: STT_MODEL,
SUPPORTED_CONTENT_TYPES: STT_SUPPORTED_CONTENT_TYPES.split(','),
@@ -202,6 +204,7 @@
STT_OPENAI_API_BASE_URL = res.stt.OPENAI_API_BASE_URL;
STT_OPENAI_API_KEY = res.stt.OPENAI_API_KEY;
STT_OPENAI_API_REQUEST_FORMAT = res.stt.OPENAI_API_REQUEST_FORMAT || 'multipart';
STT_ENGINE = res.stt.ENGINE;
STT_MODEL = res.stt.MODEL;
@@ -288,6 +291,21 @@
<hr class="border-gray-100/30 dark:border-gray-850/30 my-2" />
<div class="mb-2 py-0.5 flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Request Format')}</div>
<div class="flex items-center relative">
<select
class="cursor-pointer w-fit pr-8 rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-right"
bind:value={STT_OPENAI_API_REQUEST_FORMAT}
>
<option value="multipart">{$i18n.t('Multipart Upload')}</option>
<option value="json">{$i18n.t('JSON Base64')}</option>
</select>
</div>
</div>
<hr class="border-gray-100/30 dark:border-gray-850/30 my-2" />
<div>
<div class=" mb-1.5 text-xs font-medium">{$i18n.t('STT Model')}</div>
<div class="flex w-full">