// ─── Config ──────────────────────────────────────────────────────────────── let TTS_CONFIG = null; async function loadTtsConfig() { try { const r = await fetch('/tts/config'); TTS_CONFIG = await r.json(); } catch (e) { TTS_CONFIG = { default_backend: 'xtts', default_language: 'ko', backends: { xtts: { languages: ['ko', 'en'] } }, }; } populateTtsBackends(); } const ttsBackendSel = document.getElementById('tts-backend'); const ttsLanguageSel = document.getElementById('tts-language'); const ttsVoiceSel = document.getElementById('tts-voice-select'); function populateTtsBackends() { if (!TTS_CONFIG) return; ttsBackendSel.innerHTML = ''; for (const name of Object.keys(TTS_CONFIG.backends)) { const opt = document.createElement('option'); opt.value = name; opt.textContent = name; if (name === TTS_CONFIG.default_backend) opt.selected = true; ttsBackendSel.appendChild(opt); } if (!ttsBackendSel.value && ttsBackendSel.options.length) { ttsBackendSel.selectedIndex = 0; } populateTtsLanguages(); } function populateTtsLanguages() { if (!TTS_CONFIG) return; const backend = TTS_CONFIG.backends[ttsBackendSel.value]; const languages = backend?.languages || []; ttsLanguageSel.innerHTML = ''; for (const lang of languages) { const opt = document.createElement('option'); opt.value = lang; opt.textContent = lang; if (lang === TTS_CONFIG.default_language) opt.selected = true; ttsLanguageSel.appendChild(opt); } if (!ttsLanguageSel.value && languages.length) ttsLanguageSel.value = languages[0]; } ttsBackendSel.addEventListener('change', populateTtsLanguages); // ─── Voices ──────────────────────────────────────────────────────────────── const ttsVoiceList = document.getElementById('tts-voice-list'); async function loadTtsVoices() { let voices = []; try { const r = await fetch('/tts/voices'); voices = await r.json(); } catch (e) { ttsVoiceList.innerHTML = `
| 시각 | 백엔드 | 언어 | 보이스 | 길이 | 미리보기 | ' + ' |
|---|---|---|---|---|---|---|
| ${esc(fmtTimestamp(rec.id))} | ${esc(rec.backend || '-')} | ${esc(rec.language || '-')} | ${esc(rec.voice || '-')} | ${dur} | ${esc(rec.text_preview || '')} |