speaker-verification
audio
nemotron
tyger
experimental
tyger-speaker-predictor / code /static /expressions.js
ChristophSchuhmann's picture
Publish audited Robby source and completed Nemotron speaker-prediction experiments
b21cfae verified
Raw History Blame Contribute Delete
2.23 kB
import {profiles,pose,mix} from './emotions.js';
import {createRobbyRig,geometry,KEYPOINT_IDS} from './rig.js';
const $=id=>document.getElementById(id),source=await fetch('/static/robby.svg').then(r=>r.text());
$('lab-avatar').innerHTML=source;const rig=createRobbyRig($('lab-avatar').querySelector('svg'));let seed=42;
for(const id of ['a','b'])for(const p of [{slug:'neutral',label:'Neutral'},...profiles]){const o=document.createElement('option');o.value=p.slug;o.textContent=p.label;$(id).append(o);}
$('a').value='amusement';$('b').value='teasing';$('seed').onclick=()=>seed++;
$('points').onchange=()=>rig.showKeypoints($('points').checked);
for(const profile of profiles){
const holder=document.createElement('div');holder.innerHTML=source;const svg=holder.querySelector('svg'),r=createRobbyRig(svg);
for(let i=0;i<3;i++)r.update({pose:pose(profile.slug,1,0)},1000,0);
const card=document.createElement('button');card.className='emotion-card';card.dataset.emotion=profile.slug;
const img=document.createElement('img');img.src='data:image/svg+xml;charset=utf-8,'+encodeURIComponent(new XMLSerializer().serializeToString(svg));img.alt=profile.label;
const label=document.createElement('span');label.textContent=profile.id+'. '+profile.label;
const family=document.createElement('small');family.textContent=profile.family;
card.append(img,label,family);card.onclick=()=>{$('a').value=profile.slug;$('blend').value=0;window.scrollTo({top:80,behavior:'smooth'});};$('cards').append(card);
}
let last=0;
function frame(t){const blend=Number($('blend').value),strength=Number($('intensity').value),variation=Number($('variation').value);
const target=mix(pose($('a').value,strength,variation,seed),pose($('b').value,strength,variation,seed+5),blend);
rig.update({pose:target},last?t-last:16.7,matchMedia('(prefers-reduced-motion: reduce)').matches?0:t);last=t;
$('blend-value').textContent=Math.round(blend*100)+'%';$('label').textContent=`${Math.round((1-blend)*100)}% ${$('a').value.replaceAll('_',' ')} · ${Math.round(blend*100)}% ${$('b').value.replaceAll('_',' ')} · seed ${seed}`;requestAnimationFrame(frame);}
requestAnimationFrame(frame);window.robotGallery={rig,geometry,KEYPOINT_IDS,profiles,pose,mix};