diff --git a/static/app.js b/static/app.js index 43a0ac4..360ca79 100644 --- a/static/app.js +++ b/static/app.js @@ -562,6 +562,66 @@ const ALL_FLAGS = uniqueFlagOptions([ENGLISH_FLAGS, EUROPE_FLAGS, ASIA_FLAGS, LA ['EG','EGY - Egyptian'], ['MA','MAR - Moroccan'], ['ZA','ZAF - South African'], ['NG','NGA - Nigerian'], ['KE','KEN - Kenyan'], ['GH','GHA - Ghanaian'], ]]); +// ── Preview sample texts per language ──────────────────────────────────── +const VL_SAMPLE_TEXTS = { + EN: 'Hello, how are you today? Please read this sample clearly for a fair voice benchmark.', + DE: 'Hallo, wie geht es Ihnen heute? Bitte lesen Sie diesen Text deutlich vor — für einen fairen Stimmvergleich.', + FR: 'Bonjour, comment allez-vous aujourd\'hui ? Veuillez lire ce texte clairement pour un test vocal équitable.', + ES: '¡Hola! ¿Cómo estás hoy? Por favor, lee este texto con claridad para una evaluación justa de la voz.', + PT: 'Olá, como vai você hoje? Por favor, leia este texto claramente para uma avaliação justa da voz.', + IT: 'Ciao, come stai oggi? Per favore leggi questo testo in modo chiaro per una valutazione equa della voce.', + NL: 'Hallo, hoe gaat het vandaag? Lees dit voorbeeld alstublieft duidelijk voor een eerlijke stembeoordeling.', + PL: 'Cześć, jak się dziś masz? Przeczytaj proszę ten tekst wyraźnie, aby dokonać rzetelnej oceny głosu.', + SV: 'Hej, hur mår du idag? Vänligen läs detta exempel tydligt för en rättvis röstbedömning.', + DA: 'Hej, hvordan har du det i dag? Læs venligst dette eksempel tydeligt for en retfærdig stemmevurdering.', + NB: 'Hei, hvordan har du det i dag? Vennligst les dette eksempelet tydelig for en rettferdig stemmevurdering.', + FI: 'Hei, kuinka voit tänään? Lue tämä esimerkki selkeästi reilua ääniarviointia varten.', + HU: 'Szia, hogy vagy ma? Kérlek, olvasd fel ezt a szöveget érthetően az igazságos hangértékelés érdekében.', + CS: 'Dobrý den, jak se máte? Přečtěte prosím tento text zřetelně pro spravedlivé hodnocení hlasu.', + RO: 'Bună ziua, cum vă simțiți astăzi? Vă rugăm citiți acest text clar pentru o evaluare corectă a vocii.', + UK: 'Привіт, як ви сьогодні? Будь ласка, прочитайте цей текст чітко для справедливого тестування голосу.', + RU: 'Здравствуйте, как вы сегодня? Пожалуйста, прочитайте этот текст чётко для справедливого тестирования голоса.', + TR: 'Merhaba, bugün nasılsınız? Adil bir ses değerlendirmesi için lütfen bu örneği açıkça okuyun.', + AR: 'مرحباً، كيف حالك اليوم؟ يرجى قراءة هذا النص بوضوح لإجراء اختبار صوت عادل.', + HI: 'नमस्ते, आप आज कैसे हैं? कृपया इस नमूने को स्पष्ट रूप से पढ़ें ताकि एक उचित आवाज़ मूल्यांकन हो सके।', + ZH: '你好,你今天怎么样?请清晰地朗读这段示例,以便进行公正的语音评测。', + JA: 'こんにちは、今日はいかがですか?公平な音声評価のために、このサンプルをはっきりと読んでください。', + KO: '안녕하세요, 오늘 어떠세요? 공정한 음성 벤치마크를 위해 이 샘플을 명확하게 읽어주세요.', +}; + +const _VL_LANG_FLAG = Object.assign({ DA:'DK', NB:'NO', FI:'FI', HU:'HU', CS:'CZ', RO:'RO', UK:'UA' }, LANG_FLAG_DEFAULT); + +function setPreviewLang(lang) { + const ta = $('vl-preview-sample'); + const hidden = $('benchmark-sample-text'); + if (!ta) return; + const text = VL_SAMPLE_TEXTS[lang] || VL_SAMPLE_TEXTS.EN; + ta.value = text; + ta.dispatchEvent(new Event('input')); + if (hidden) { hidden.value = text; hidden.dispatchEvent(new Event('input')); } + try { localStorage.setItem(BENCHMARK_SAMPLE_STORAGE_KEY, text); } catch {} + const btn = $('vl-preview-lang-btn'); + if (btn) { + const cc = (_VL_LANG_FLAG[lang] || 'gb').toLowerCase(); + btn.innerHTML = ``; + btn.title = (LANGUAGE_LABELS[lang] || lang) + ' — click to change'; + btn.dataset.lang = lang; + } +} + +function openPreviewLangPicker(anchor) { + const items = Object.keys(VL_SAMPLE_TEXTS).map(l => [l, LANGUAGE_LABELS[l] ? `${LANGUAGE_LABELS[l]} (${l})` : l]); + createSearchablePicker(anchor, items, setPreviewLang, { + placeholder: 'Sample language…', + renderItem: (l) => { + const cc = (_VL_LANG_FLAG[l] || 'gb').toLowerCase(); + return `` + + `${escHtml(l)}` + + `${escHtml(LANGUAGE_LABELS[l] || l)}`; + }, + }); +} + // ── Searchable picker dropdown ──────────────────────────────────────────── function createSearchablePicker(anchor, items, onSelect, { placeholder = 'Search…', renderItem } = {}) { document.querySelector('.insp-picker')?.remove(); @@ -5815,6 +5875,19 @@ initBenchmarkSampleControls(); }); })(); +// Sync flag button to current preview text language (best-match) +(function syncPreviewLangBtn() { + const ta = $('vl-preview-sample'); + const btn = $('vl-preview-lang-btn'); + if (!ta || !btn) return; + const cur = ta.value.trim(); + const matched = Object.keys(VL_SAMPLE_TEXTS).find(l => VL_SAMPLE_TEXTS[l] === cur) || 'EN'; + const cc = (_VL_LANG_FLAG[matched] || 'gb').toLowerCase(); + btn.innerHTML = ``; + btn.title = (LANGUAGE_LABELS[matched] || matched) + ' — click to change sample language'; + btn.dataset.lang = matched; +})(); + // Synth mode segmented control (preview text vs. reference transcript) (function initSynthMode() { const seg = $('vl-synth-mode-seg'); diff --git a/static/sections/s-voices.html b/static/sections/s-voices.html index ca173fb..68b1592 100644 --- a/static/sections/s-voices.html +++ b/static/sections/s-voices.html @@ -17,14 +17,6 @@
-
- - - - - -
-
@@ -37,10 +29,19 @@ title="Synthesize this voice’s saved reference transcript — good for quality check vs. original recording">Reference transcript
+
- +
+ + +
@@ -59,7 +60,14 @@
- +
+ + + + + +
+