diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b62e79..e9a7296 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi ## [Unreleased] +### Changed +- **Searchable model dropdown** for the Active Language Model and Active OCR Model pickers (Engines page): the long native model list is now the same type-to-search dropdown used for voices, with model-specific wording and no avatars. + ### Changed - **Character images: period-safe, uninjured, less uniform.** Costume and appearance text sent to the image model is now rewritten to period garments (Uniform, Weste, Hut, Sporen, Jacke, Schal … became livery tabard, jerkin, felt cap, doublet …) because the extracted sheets contained such words for ~45 characters and the images came out in wartime/cowboy dress; injury clauses (blood, wounds, bandages, burns, limping, torn clothes) are removed clause by clause from appearance, costume and the story-moment text instead of dropping whole sentences; characters with armour or weapons get an individual garment cut and colour scheme (stable per name, colours named in the sheet win) instead of one shared list of gambeson/brigandine/plate. Saved prompts are cleaned the same way at render time. Adult figures are described as eight head-heights tall with a small head, to counter the short, stubby turnaround figures. The stored sheets are unchanged. - **The turnaround now shows the same person as the profile picture.** Front, side and rear views are drawn one by one by the edit model from the identity portrait (the old text-only triptych invented a new face). Book setting reworded to Dark Eye high-fantasy medieval (was "early Renaissance 1420-1500", which produced musketeer/wartime looks), shields/cloaks no longer added to everyone, soot/dirt removed like injuries, and prop tiles are object-only (they used to show a person). Existing image pairs are unchanged until regenerated. diff --git a/VERSION b/VERSION index 2404d95..4b06b5b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.34.0 \ No newline at end of file +1.34.1 \ No newline at end of file diff --git a/static/dist/main.min.js b/static/dist/main.min.js index f45c360..685e47c 100644 --- a/static/dist/main.min.js +++ b/static/dist/main.min.js @@ -2,18 +2,18 @@ ${_avatarHtml(id,26)} ${_esc(name)} ${meta?`${_esc(meta)}`:_flagSpan(v)} - `}function _esc(s){return String(s).replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function upgrade(selectId){const sel=document.getElementById(selectId);if(!sel||sel.dataset.vpUpgraded)return;sel.dataset.vpUpgraded="1",sel.style.display="none";const root=document.createElement("div");root.className="vp-root",root.dataset.vpFor=selectId,sel.parentNode.insertBefore(root,sel);const trigger=document.createElement("div");trigger.className="vp-trigger",trigger.tabIndex=0,trigger.innerHTML='\u2014 select after fetch \u2014',root.appendChild(trigger);const drop=document.createElement("div");drop.className="vp-drop",drop.hidden=!0,drop.innerHTML='
',root.appendChild(drop);const searchInp=drop.querySelector(".vp-search"),list=drop.querySelector(".vp-list");function _renderList(filter){const opts=Array.from(sel.options).filter(o=>o.value),q=(filter||"").toLowerCase(),filtered=q?opts.filter(o=>o.value.toLowerCase().includes(q)||o.textContent.toLowerCase().includes(q)):opts;if(!filtered.length){list.innerHTML='
No voices found
';return}list.innerHTML=filtered.map(o=>_buildItem(o.value,o.textContent)).join(""),list.querySelectorAll(".vp-item").forEach(el=>{el.classList.toggle("selected",el.dataset.value===sel.value)})}function _open(){drop.hidden=!1,drop.style.display="",trigger.classList.add("open"),searchInp.value="",_renderList(""),searchInp.focus(),requestAnimationFrame(()=>{const sel2=list.querySelector(".vp-item.selected");sel2&&sel2.scrollIntoView({block:"nearest"})})}function _close(){drop.hidden=!0,drop.style.display="none",trigger.classList.remove("open"),searchInp.blur()}function _select(value){sel.value=value,sel.dispatchEvent(new Event("change",{bubbles:!0})),_syncTrigger(),_close(),trigger.focus()}function _syncTrigger(){const v=sel.value,content=trigger.querySelector(".vp-trigger-content");if(!v)content.innerHTML='\u2014 select after fetch \u2014';else{const label=v,meta=_voiceMetaLabel(v);content.innerHTML=`${_avatarHtml(v,24)}${_esc(label)}${meta?`${_esc(meta)}`:""}`}}trigger.addEventListener("click",()=>drop.hidden?_open():_close()),trigger.addEventListener("keydown",e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),_open())}),searchInp.addEventListener("input",()=>_renderList(searchInp.value)),searchInp.addEventListener("keydown",e=>{var _a;e.key==="Escape"&&(e.stopPropagation(),_close(),trigger.focus()),e.key==="ArrowDown"&&(e.preventDefault(),(_a=list.querySelector(".vp-item"))==null||_a.focus())}),list.addEventListener("pointerdown",e=>{const item=e.target.closest(".vp-item");item&&(e.preventDefault(),_select(item.dataset.value))}),list.addEventListener("click",e=>{const item=e.target.closest(".vp-item");item&&_select(item.dataset.value)}),list.addEventListener("keydown",e=>{var _a;const item=e.target.closest(".vp-item");item&&((e.key==="Enter"||e.key===" ")&&(e.preventDefault(),_select(item.dataset.value)),e.key==="ArrowDown"&&(e.preventDefault(),(item.nextElementSibling||item).focus()),e.key==="ArrowUp"&&(e.preventDefault(),(_a=item.previousElementSibling||item)!=null&&_a.focus()||searchInp.focus()),e.key==="Escape"&&(_close(),trigger.focus()))}),document.addEventListener("click",e=>{root.contains(e.target)||_close()},!0),sel.addEventListener("change",()=>{_syncTrigger(),_close()}),new MutationObserver(()=>{_syncTrigger()}).observe(sel,{childList:!0,attributes:!0,subtree:!0}),_pickers[selectId]={root,trigger,drop,searchInp,list,sel,renderList:_renderList,syncTrigger:_syncTrigger}}function populate(selectId,voices){const p=_pickers[selectId];if(!p)return;const{sel,renderList,syncTrigger}=p,prev=sel.value;sel.innerHTML='',voices.forEach(id=>{const opt=document.createElement("option");opt.value=id,opt.textContent=_voiceOptionLabel(id),sel.appendChild(opt)}),prev&&voices.includes(prev)&&(sel.value=prev),renderList(""),syncTrigger()}function getValue(selectId){var _a;return((_a=document.getElementById(selectId))==null?void 0:_a.value)||""}function setValue(selectId,value){var _a;const sel=document.getElementById(selectId);sel&&(sel.value=value,(_a=_pickers[selectId])==null||_a.syncTrigger())}function attachTextPicker(input){if(!input||input.dataset.vpTextAttached)return;input.dataset.vpTextAttached="1";const btn=document.createElement("button");btn.type="button",btn.className="vp-text-browse",btn.title="Browse voices",btn.innerHTML='',input.insertAdjacentElement("afterend",btn);const drop=document.createElement("div");drop.className="vp-drop vp-drop-floating",drop.hidden=!0,drop.innerHTML='
',document.body.appendChild(drop);const searchInp=drop.querySelector(".vp-search"),list=drop.querySelector(".vp-list");function _voices2(){return(window._voices||[]).filter(v=>v.enabled!==!1)}function _renderList(filter){const q=(filter||"").toLowerCase(),filtered=q?_voices2().filter(v=>v.id.toLowerCase().includes(q)):_voices2();if(!filtered.length){list.innerHTML='
No voices found
';return}list.innerHTML=filtered.map(v=>_buildItem(v.id,v.id)).join(""),list.querySelectorAll(".vp-item").forEach(el=>el.classList.toggle("selected",el.dataset.value===input.value))}function _position(){const r=input.getBoundingClientRect();drop.style.left=r.left+"px",drop.style.top=r.bottom+4+"px",drop.style.width=Math.max(240,r.width+32)+"px"}function _open(){_position(),drop.hidden=!1,searchInp.value="",_renderList(""),searchInp.focus()}function _close(){drop.hidden=!0}function _select(value){input.value=value,input.dispatchEvent(new Event("input",{bubbles:!0})),input.dispatchEvent(new Event("change",{bubbles:!0})),_close()}btn.addEventListener("click",e=>{e.stopPropagation(),drop.hidden?_open():_close()}),searchInp.addEventListener("input",()=>_renderList(searchInp.value)),searchInp.addEventListener("keydown",e=>{e.key==="Escape"&&(e.stopPropagation(),_close())}),list.addEventListener("click",e=>{const item=e.target.closest(".vp-item");item&&_select(item.dataset.value)}),document.addEventListener("click",e=>{!drop.contains(e.target)&&e.target!==btn&&_close()},!0),window.addEventListener("resize",()=>{drop.hidden||_position()})}window.VoicePicker={upgrade,populate,getValue,setValue,attachTextPicker}})(),function(){"use strict";const pickers={};function esc(value){return String(value==null?"":value).replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function norm(value){if(typeof value=="string")return{id:value,label:value,meta:null,raw:value};const id=(value==null?void 0:value.id)||(value==null?void 0:value.voice)||(value==null?void 0:value.name)||(value==null?void 0:value.voice_id)||"",hasExplicitMeta=Object.prototype.hasOwnProperty.call(value||{},"meta"),looksLikeVoice=!!(value!=null&&value.display_name||value!=null&&value.duration||value!=null&&value.benchmark||value!=null&&value.has_picture||value!=null&&value.transcript);return{id,label:(value==null?void 0:value.label)||(value==null?void 0:value.display_name)||(value==null?void 0:value.name)||(value==null?void 0:value.voice)||id,meta:hasExplicitMeta?value.meta:looksLikeVoice?value:null,raw:value}}function libraryVoice(id){return(window._voices||[]).find(v=>v&&v.id===id)||null}function metaFor(item){return(item==null?void 0:item.meta)||libraryVoice(item==null?void 0:item.id)||(item==null?void 0:item.raw)||null}function langColor(lang,id){const str=String(lang||id||"").toLowerCase();if(str.startsWith("de"))return"#3b82f6";if(str.startsWith("en"))return"#10b981";if(str.startsWith("fr"))return"#8b5cf6";if(str.startsWith("es"))return"#f59e0b";if(str.startsWith("it"))return"#ef4444";if(str.startsWith("zh"))return"#ec4899";if(str.startsWith("ja"))return"#f97316";const palette=["#3b82f6","#10b981","#8b5cf6","#f59e0b","#ef4444","#ec4899","#06b6d4","#84cc16"];let h=0;for(let i=0;i>>0;return palette[h%palette.length]}function avatarHtml(item,size){var _a;const id=(item==null?void 0:item.id)||"",meta=metaFor(item),s=`${size}px`,r=`${Math.round(size/2)}px`;if(meta!=null&&meta.has_picture)return``;const icon=window.voiceAvatarIcon?window.voiceAvatarIcon(meta==null?void 0:meta.avatar,size):null;if(icon)return icon.replace(/vp-avatar/g,"bvp-avatar");const color=langColor((meta==null?void 0:meta.lang)||(meta==null?void 0:meta.language),id),init=((_a=((item==null?void 0:item.label)||id||"?").trim()[0])==null?void 0:_a.toUpperCase())||"?";return`${esc(init)}`}function numeric(value){const n=Number(value);return Number.isFinite(n)?n:null}function statsFor(item){var _a,_b,_c,_d,_e,_f;const meta=metaFor(item)||{},b=meta.benchmark||(item==null?void 0:item.benchmark)||{},parts=[],duration=numeric((_a=meta.duration)!=null?_a:item==null?void 0:item.duration),speed=numeric((_c=(_b=b.speed)!=null?_b:b.avg_speed)!=null?_c:meta.speed),rtf=numeric((_e=(_d=b.rtf)!=null?_d:b.avg_rtf)!=null?_e:meta.rtf),elapsed=numeric((_f=b.elapsed_sec)!=null?_f:b.avg_elapsed_sec);return duration!=null&&duration>0&&parts.push(`${duration.toFixed(1)}s`),speed!=null&&speed>0?parts.push(`${speed.toFixed(2)}x`):rtf!=null&&rtf>0&&parts.push(`RTF ${rtf.toFixed(2)}`),!parts.length&&elapsed!=null&&elapsed>0&&parts.push(`${elapsed.toFixed(1)}s TTS`),!parts.length&&b.ok===!1&&parts.push("benchmark failed"),parts.join(" \xB7 ")}function searchText(item){const meta=metaFor(item)||{};return[item==null?void 0:item.id,item==null?void 0:item.label,meta.display_name,meta.name,meta.lang,meta.language,Array.isArray(meta.tags)?meta.tags.join(" "):meta.tags,statsFor(item)].filter(Boolean).join(" ").toLowerCase()}function optionLabel(item){const stats=statsFor(item);return`${item.label||item.id}${stats?` (${stats})`:""}`}function renderTrigger(picker){const value=picker.select.value,item=picker.items.find(v=>v.id===value),content=picker.trigger.querySelector(".bvp-trigger-content");if(!item){content.innerHTML=`${esc(picker.placeholder)}`;return}const stats=statsFor(item);content.innerHTML=`${avatarHtml(item,24)}${esc(item.label||item.id)}${stats?`${esc(stats)}`:""}`}function renderList(picker,filter){const q=String(filter||"").trim().toLowerCase(),items=q?picker.items.filter(item=>searchText(item).includes(q)):picker.items;if(!items.length){picker.list.innerHTML=`
${esc(q?"No voices found":picker.empty)}
`;return}picker.list.innerHTML=items.map(item=>{const meta=metaFor(item)||{},stats=statsFor(item),sub=[meta.lang||meta.language,meta.file_type].filter(Boolean).join(" \xB7 ");return``}).join("")}function close(picker){picker&&(picker.drop.hidden=!0,picker.drop.style.display="none",picker.trigger.classList.remove("open"))}function closeAll(except){Object.values(pickers).forEach(p=>{p!==except&&close(p)})}function open(picker){closeAll(picker),picker.drop.hidden=!1,picker.drop.style.display="",picker.trigger.classList.add("open"),picker.search.value="",renderList(picker,""),picker.search.focus(),requestAnimationFrame(()=>{var _a;return(_a=picker.list.querySelector(".bvp-item.selected"))==null?void 0:_a.scrollIntoView({block:"nearest"})})}function setValue(picker,value,dispatch){picker.select.value=value||"",renderTrigger(picker),renderList(picker,picker.search.value),close(picker),dispatch!==!1&&picker.select.dispatchEvent(new Event("change",{bubbles:!0})),picker.trigger.focus()}function upgrade(selectId,options){var _a;const select=document.getElementById(selectId);if(!select)return null;if(pickers[selectId])return pickers[selectId];const picker={select,items:[],placeholder:(options==null?void 0:options.placeholder)||((_a=Array.from(select.options).find(o=>!o.value))==null?void 0:_a.textContent)||"\u2014 select after fetch \u2014",empty:(options==null?void 0:options.empty)||"No voices"};select.dataset.bvpUpgraded="1",select.style.display="none";const root=document.createElement("div");return root.className="bvp-root",root.dataset.bvpFor=selectId,select.parentNode.insertBefore(root,select),root.innerHTML=``}).join("")}function close(picker){picker&&(picker.drop.hidden=!0,picker.drop.style.display="none",picker.trigger.classList.remove("open"))}function closeAll(except){Object.values(pickers).forEach(p=>{p!==except&&close(p)})}function open(picker){closeAll(picker),picker.drop.hidden=!1,picker.drop.style.display="",picker.trigger.classList.add("open"),picker.search.value="",renderList(picker,""),picker.search.focus(),requestAnimationFrame(()=>{var _a;return(_a=picker.list.querySelector(".bvp-item.selected"))==null?void 0:_a.scrollIntoView({block:"nearest"})})}function setValue(picker,value,dispatch){picker.select.value=value||"",renderTrigger(picker),renderList(picker,picker.search.value),close(picker),dispatch!==!1&&picker.select.dispatchEvent(new Event("change",{bubbles:!0})),picker.trigger.focus()}function upgrade(selectId,options){var _a;const select=document.getElementById(selectId);if(!select)return null;if(pickers[selectId])return pickers[selectId];const picker={select,items:[],placeholder:(options==null?void 0:options.placeholder)||((_a=Array.from(select.options).find(o=>!o.value))==null?void 0:_a.textContent)||"\u2014 select after fetch \u2014",empty:(options==null?void 0:options.empty)||"No voices",noun:(options==null?void 0:options.noun)||"voices",plain:!!(options!=null&&options.plain)};select.dataset.bvpUpgraded="1",select.style.display="none";const root=document.createElement("div");return root.className="bvp-root",root.dataset.bvpFor=selectId,select.parentNode.insertBefore(root,select),root.innerHTML=` `,Object.assign(picker,{root,trigger:root.querySelector(".bvp-trigger"),drop:root.querySelector(".bvp-drop"),search:root.querySelector(".bvp-search"),list:root.querySelector(".bvp-list")}),picker.trigger.addEventListener("click",e=>{e.preventDefault(),picker.drop.hidden?open(picker):close(picker)}),picker.trigger.addEventListener("keydown",e=>{var _a2;(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),open(picker)),e.key==="ArrowDown"&&(e.preventDefault(),open(picker),(_a2=picker.list.querySelector(".bvp-item"))==null||_a2.focus())}),picker.search.addEventListener("input",()=>renderList(picker,picker.search.value)),picker.search.addEventListener("keydown",e=>{var _a2;e.key==="Escape"&&(e.preventDefault(),close(picker),picker.trigger.focus()),e.key==="ArrowDown"&&(e.preventDefault(),(_a2=picker.list.querySelector(".bvp-item"))==null||_a2.focus())}),picker.list.addEventListener("click",e=>{const item=e.target.closest(".bvp-item");item&&setValue(picker,item.dataset.value,!0)}),picker.list.addEventListener("keydown",e=>{const item=e.target.closest(".bvp-item");item&&((e.key==="Enter"||e.key===" ")&&(e.preventDefault(),setValue(picker,item.dataset.value,!0)),e.key==="ArrowDown"&&(e.preventDefault(),(item.nextElementSibling||item).focus()),e.key==="ArrowUp"&&(e.preventDefault(),(item.previousElementSibling||picker.search).focus()),e.key==="Escape"&&(e.preventDefault(),close(picker),picker.trigger.focus()))}),select.addEventListener("change",()=>{renderTrigger(picker),close(picker)}),document.addEventListener("click",e=>{root.contains(e.target)||close(picker)},!0),pickers[selectId]=picker,syncFromSelect(selectId),picker}function populate(selectId,values,options){var _a;const picker=upgrade(selectId,options||{});if(!picker)return;picker.placeholder=(options==null?void 0:options.placeholder)||picker.placeholder,picker.empty=(options==null?void 0:options.empty)||picker.empty;const previous=picker.select.value;picker.items=(values||[]).map(norm).filter(item=>item.id),picker.select.innerHTML=``+picker.items.map(item=>``).join(""),previous&&picker.items.some(item=>item.id===previous)&&(picker.select.value=previous),renderTrigger(picker),renderList(picker,((_a=picker.search)==null?void 0:_a.value)||"")}function syncFromSelect(selectId){const picker=pickers[selectId];picker&&(picker.items=Array.from(picker.select.options).filter(o=>o.value).map(o=>({id:o.value,label:o.textContent||o.value,meta:libraryVoice(o.value)||{}})),renderTrigger(picker),renderList(picker,""))}function getValue(selectId){var _a;return((_a=document.getElementById(selectId))==null?void 0:_a.value)||""}function set(selectId,value){const picker=pickers[selectId]||upgrade(selectId);picker&&setValue(picker,value,!0)}window.BenchmarkVoicePicker={upgrade,populate,syncFromSelect,getValue,set}}(),function(root){let _selectedVoiceWrap=null;function selectVoice2(wrap){var _a;const inspector=document.getElementById("voices-inspector");if(!inspector)return;function restoreToRow(targetWrap){(targetWrap._extracted||[]).forEach(({el,target})=>{el&&target&&target.appendChild(el)}),targetWrap._extracted=[],inspector.querySelectorAll(".vr-main-row,.vr-optimizer").forEach(el=>targetWrap.appendChild(el))}if(_selectedVoiceWrap&&_selectedVoiceWrap!==wrap&&(_selectedVoiceWrap.classList.remove("vr-selected"),restoreToRow(_selectedVoiceWrap)),_selectedVoiceWrap===wrap){restoreToRow(wrap),wrap.classList.remove("vr-selected"),_selectedVoiceWrap=null,inspector.innerHTML='

Pick a voice on the left
to edit it here

',typeof window.onMobileInspectorClose=="function"&&window.onMobileInspectorClose();return}_selectedVoiceWrap=wrap,wrap.classList.add("vr-selected"),typeof window.onMobileInspectorOpen=="function"&&window.onMobileInspectorOpen();const voiceId=wrap.dataset.id||"",color=wrap.dataset.color||"#9575CD",isClone=wrap.dataset.hasRef==="true",dbfs=wrap.dataset.dbfs||"-",hasPicture=wrap.dataset.hasPicture==="true",v=(_voices||[]).find(vv=>vv.id===voiceId)||{},langCode=v.lang||wrap.dataset.lang||"",flagCc=v.flag||wrap.dataset.flagCc||langCode,rating=v.rating||0,curGender=v.gender||"N",nameParts=voiceId.split("_"),dispName=v.name&&String(v.name).trim()?String(v.name).trim():nameParts.length>1?nameParts[nameParts.length-1]:voiceId,initial=(dispName[0]||voiceId[0]||"?").toUpperCase(),picSrcInsp=hasPicture?`/api/voice/picture/${encodeURIComponent(voiceId)}`:null,inspFlagCc=flagCc||langCode,inspFlagIcon=inspFlagCc?``:null,silHtml=``,inspIconHtml=window.voiceAvatarIcon?window.voiceAvatarIcon(v.avatar,48):null,avatarHtml=picSrcInsp?``:inspIconHtml||silHtml,avatarBgStyle=picSrcInsp||inspIconHtml?"":`style="background:${color}"`,flagIconHtml=inspFlagIcon||"",makeStars=n=>[1,2,3,4,5].map(i=>``).join(""),inspBenchText=typeof fmtBenchmark=="function"?fmtBenchmark(v):"-",inspBenchTitle=typeof benchmarkTitle=="function"?benchmarkTitle(v):"",inspBenchCls=typeof benchmarkClass=="function"?benchmarkClass(v):"",LANGS=["EN","DE","IT","ES","FR","PT","NL","PL","ZH","JA","KO","AR","RU","TR","HI","SV","DA","FI","NB","HU","CS","RO","UK"],_gM={F:"\u2640",M:"\u2642",N:"\u26A5","":"?"},_gL={F:"Female",M:"Male",N:"Diverse","":"\u2014"},_gC={F:"g-f",M:"g-m",N:"g-n","":"g-n"},genderLabelHtml=`${_gM[curGender]||"?"} ${_gL[curGender]||"\u2014"}`;inspector.innerHTML=` + `,Object.assign(picker,{root,trigger:root.querySelector(".bvp-trigger"),drop:root.querySelector(".bvp-drop"),search:root.querySelector(".bvp-search"),list:root.querySelector(".bvp-list")}),picker.trigger.addEventListener("click",e=>{e.preventDefault(),picker.drop.hidden?open(picker):close(picker)}),picker.trigger.addEventListener("keydown",e=>{var _a2;(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),open(picker)),e.key==="ArrowDown"&&(e.preventDefault(),open(picker),(_a2=picker.list.querySelector(".bvp-item"))==null||_a2.focus())}),picker.search.addEventListener("input",()=>renderList(picker,picker.search.value)),picker.search.addEventListener("keydown",e=>{var _a2;e.key==="Escape"&&(e.preventDefault(),close(picker),picker.trigger.focus()),e.key==="ArrowDown"&&(e.preventDefault(),(_a2=picker.list.querySelector(".bvp-item"))==null||_a2.focus())}),picker.list.addEventListener("click",e=>{const item=e.target.closest(".bvp-item");item&&setValue(picker,item.dataset.value,!0)}),picker.list.addEventListener("keydown",e=>{const item=e.target.closest(".bvp-item");item&&((e.key==="Enter"||e.key===" ")&&(e.preventDefault(),setValue(picker,item.dataset.value,!0)),e.key==="ArrowDown"&&(e.preventDefault(),(item.nextElementSibling||item).focus()),e.key==="ArrowUp"&&(e.preventDefault(),(item.previousElementSibling||picker.search).focus()),e.key==="Escape"&&(e.preventDefault(),close(picker),picker.trigger.focus()))}),select.addEventListener("change",()=>{renderTrigger(picker),close(picker)}),document.addEventListener("click",e=>{root.contains(e.target)||close(picker)},!0),pickers[selectId]=picker,syncFromSelect(selectId),picker}function populate(selectId,values,options){var _a;const picker=upgrade(selectId,options||{});if(!picker)return;picker.placeholder=(options==null?void 0:options.placeholder)||picker.placeholder,picker.empty=(options==null?void 0:options.empty)||picker.empty;const previous=picker.select.value;picker.items=(values||[]).map(norm).filter(item=>item.id),picker.select.innerHTML=``+picker.items.map(item=>``).join(""),previous&&picker.items.some(item=>item.id===previous)&&(picker.select.value=previous),renderTrigger(picker),renderList(picker,((_a=picker.search)==null?void 0:_a.value)||"")}function syncFromSelect(selectId){const picker=pickers[selectId];if(!picker)return;const blank=Array.from(picker.select.options).find(o=>!o.value);blank&&blank.textContent&&(picker.placeholder=blank.textContent),picker.items=Array.from(picker.select.options).filter(o=>o.value).map(o=>({id:o.value,label:o.textContent||o.value,meta:libraryVoice(o.value)||{}})),renderTrigger(picker),renderList(picker,"")}function getValue(selectId){var _a;return((_a=document.getElementById(selectId))==null?void 0:_a.value)||""}function set(selectId,value){const picker=pickers[selectId]||upgrade(selectId);picker&&setValue(picker,value,!0)}window.BenchmarkVoicePicker={upgrade,populate,syncFromSelect,getValue,set}}(),function(root){let _selectedVoiceWrap=null;function selectVoice2(wrap){var _a;const inspector=document.getElementById("voices-inspector");if(!inspector)return;function restoreToRow(targetWrap){(targetWrap._extracted||[]).forEach(({el,target})=>{el&&target&&target.appendChild(el)}),targetWrap._extracted=[],inspector.querySelectorAll(".vr-main-row,.vr-optimizer").forEach(el=>targetWrap.appendChild(el))}if(_selectedVoiceWrap&&_selectedVoiceWrap!==wrap&&(_selectedVoiceWrap.classList.remove("vr-selected"),restoreToRow(_selectedVoiceWrap)),_selectedVoiceWrap===wrap){restoreToRow(wrap),wrap.classList.remove("vr-selected"),_selectedVoiceWrap=null,inspector.innerHTML='

Pick a voice on the left
to edit it here

',typeof window.onMobileInspectorClose=="function"&&window.onMobileInspectorClose();return}_selectedVoiceWrap=wrap,wrap.classList.add("vr-selected"),typeof window.onMobileInspectorOpen=="function"&&window.onMobileInspectorOpen();const voiceId=wrap.dataset.id||"",color=wrap.dataset.color||"#9575CD",isClone=wrap.dataset.hasRef==="true",dbfs=wrap.dataset.dbfs||"-",hasPicture=wrap.dataset.hasPicture==="true",v=(_voices||[]).find(vv=>vv.id===voiceId)||{},langCode=v.lang||wrap.dataset.lang||"",flagCc=v.flag||wrap.dataset.flagCc||langCode,rating=v.rating||0,curGender=v.gender||"N",nameParts=voiceId.split("_"),dispName=v.name&&String(v.name).trim()?String(v.name).trim():nameParts.length>1?nameParts[nameParts.length-1]:voiceId,initial=(dispName[0]||voiceId[0]||"?").toUpperCase(),picSrcInsp=hasPicture?`/api/voice/picture/${encodeURIComponent(voiceId)}`:null,inspFlagCc=flagCc||langCode,inspFlagIcon=inspFlagCc?``:null,silHtml=``,inspIconHtml=window.voiceAvatarIcon?window.voiceAvatarIcon(v.avatar,48):null,avatarHtml=picSrcInsp?``:inspIconHtml||silHtml,avatarBgStyle=picSrcInsp||inspIconHtml?"":`style="background:${color}"`,flagIconHtml=inspFlagIcon||"",makeStars=n=>[1,2,3,4,5].map(i=>``).join(""),inspBenchText=typeof fmtBenchmark=="function"?fmtBenchmark(v):"-",inspBenchTitle=typeof benchmarkTitle=="function"?benchmarkTitle(v):"",inspBenchCls=typeof benchmarkClass=="function"?benchmarkClass(v):"",LANGS=["EN","DE","IT","ES","FR","PT","NL","PL","ZH","JA","KO","AR","RU","TR","HI","SV","DA","FI","NB","HU","CS","RO","UK"],_gM={F:"\u2640",M:"\u2642",N:"\u26A5","":"?"},_gL={F:"Female",M:"Male",N:"Diverse","":"\u2014"},_gC={F:"g-f",M:"g-m",N:"g-n","":"g-n"},genderLabelHtml=`${_gM[curGender]||"?"} ${_gL[curGender]||"\u2014"}`;inspector.innerHTML=`
${avatarHtml}
diff --git a/static/index.html b/static/index.html index ab44f2c..53b9f0f 100644 --- a/static/index.html +++ b/static/index.html @@ -10,7 +10,7 @@ - + @@ -27,12 +27,12 @@ - - - - - - + + + + + + diff --git a/static/js/ai-backends.js b/static/js/ai-backends.js index 498d512..70aa626 100644 --- a/static/js/ai-backends.js +++ b/static/js/ai-backends.js @@ -299,8 +299,19 @@ }); }); + // Model lists are long, so the model stays the source of truth; the picker re-reads it whenever its options change. + function upgradeModelSelect(id) { + const sel = document.getElementById(id); + const picker = window.BenchmarkVoicePicker; + if (!sel || !picker) return; + picker.upgrade(id, { noun: 'models', plain: true, empty: 'No models', placeholder: '— fetch models —' }); + new MutationObserver(() => picker.syncFromSelect(id)).observe(sel, { childList: true }); + } + // ── Active Language Model (global picker) ─────────────────────────────── (function initActiveLlmPanel() { + upgradeModelSelect('llm-active-model'); const urlInp = $('llm-active-url'); const modelSel = $('llm-active-model'); const refreshBtn = $('llm-active-refresh'); @@ -443,6 +454,7 @@ // proxies to whatever URL it's given rather than assuming it's the LLM one. (function initActiveOcrPanel() { const urlInp = $('ocr-active-url'); + upgradeModelSelect('ocr-active-model'); const modelSel = $('ocr-active-model'); const refreshBtn = $('ocr-active-refresh'); const statusEl = $('ocr-active-status'); diff --git a/static/js/benchmark-voice-picker.js b/static/js/benchmark-voice-picker.js index 7f5fb5c..15590b2 100644 --- a/static/js/benchmark-voice-picker.js +++ b/static/js/benchmark-voice-picker.js @@ -113,14 +113,14 @@ return; } const stats = statsFor(item); - content.innerHTML = `${avatarHtml(item, 24)}${esc(item.label || item.id)}${stats ? `${esc(stats)}` : ''}`; + content.innerHTML = `${picker.plain ? '' : avatarHtml(item, 24)}${esc(item.label || item.id)}${stats ? `${esc(stats)}` : ''}`; } function renderList(picker, filter) { const q = String(filter || '').trim().toLowerCase(); const items = q ? picker.items.filter(item => searchText(item).includes(q)) : picker.items; if (!items.length) { - picker.list.innerHTML = `
${esc(q ? 'No voices found' : picker.empty)}
`; + picker.list.innerHTML = `
${esc(q ? `No ${picker.noun} found` : picker.empty)}
`; return; } picker.list.innerHTML = items.map(item => { @@ -128,7 +128,7 @@ const stats = statsFor(item); const sub = [meta.lang || meta.language, meta.file_type].filter(Boolean).join(' · '); return ``; @@ -175,6 +175,8 @@ items: [], placeholder: options?.placeholder || Array.from(select.options).find(o => !o.value)?.textContent || '— select after fetch —', empty: options?.empty || 'No voices', + noun: options?.noun || 'voices', + plain: !!options?.plain, }; select.dataset.bvpUpgraded = '1'; select.style.display = 'none'; @@ -189,7 +191,7 @@ `; @@ -250,6 +252,8 @@ function syncFromSelect(selectId) { const picker = pickers[selectId]; if (!picker) return; + const blank = Array.from(picker.select.options).find(o => !o.value); + if (blank && blank.textContent) picker.placeholder = blank.textContent; picker.items = Array.from(picker.select.options).filter(o => o.value).map(o => ({ id: o.value, label: o.textContent || o.value, meta: libraryVoice(o.value) || {} })); renderTrigger(picker); renderList(picker, '');