FormaLau commited on
Commit
2822e78
·
1 Parent(s): c32dbb8

Improve simulator film camera recording

Browse files
Files changed (1) hide show
  1. app/record-sim.mjs +3 -13
app/record-sim.mjs CHANGED
@@ -4,7 +4,7 @@ const out='video-recordings'; fs.mkdirSync(out,{recursive:true});
4
  const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
5
  const context=await browser.newContext({viewport:{width:1440,height:900},recordVideo:{dir:out,size:{width:1440,height:900}}});
6
  const page=await context.newPage();
7
- await page.goto('http://127.0.0.1:5173/?boot=1');
8
  await page.waitForFunction(()=>window.__store?.getState().bootDone);
9
  await page.evaluate(()=>window.__gameApi.startEntrance());
10
  await page.waitForFunction(()=>window.rl&&!window.rl.inputLocked);
@@ -13,19 +13,9 @@ await page.evaluate(()=>{
13
  const r=new MediaRecorder(window.__audioCaptureStream,{mimeType:'audio/webm;codecs=opus'});
14
  window.__simAudioChunks=[]; r.ondataavailable=e=>e.data.size&&window.__simAudioChunks.push(e.data); r.start(250); window.__simAudioRecorder=r;
15
  });
16
- const script={actions:[
17
- {robot:'reachy-mini',action:'say',text:'hello microduck',parallel:true,parallelGroup:'happy'},
18
- {robot:'reachy-mini',action:'emotion',value:'joy',parallel:true,parallelGroup:'happy'},
19
- {robot:'microduck',action:'emotion',value:'joy',parallel:true,parallelGroup:'happy'},
20
- {robot:'reachy-mini',action:'say',text:"I'm legless, but I still have rhythm!",parallel:true,parallelGroup:'sad'},
21
- {robot:'reachy-mini',action:'emotion',value:'sadness',parallel:true,parallelGroup:'sad'},
22
- {robot:'microduck',action:'emotion',value:'sadness',parallel:true,parallelGroup:'sad'},
23
- {robot:'reachy-mini',action:'say',text:"My builders skipped the legs, but nailed the attitude!",parallel:true,parallelGroup:'anger'},
24
- {robot:'reachy-mini',action:'emotion',value:'anger',parallel:true,parallelGroup:'anger'},
25
- {robot:'microduck',action:'emotion',value:'anger',parallel:true,parallelGroup:'anger',delay:1.2}
26
- ]};
27
  await page.evaluate(s=>{window.rl.chaseCam=false;window.__gameApi.script.load(s);window.__gameApi.script.run();},script);
28
- await page.evaluate(async()=>{const start=performance.now();await new Promise(resolve=>{const f=now=>{const t=(now-start)/1000;const a=Math.min(1,t/42)*Math.PI*2;window.rl.camera.position.set(Math.cos(a)*1.9,0.9+0.15*Math.sin(t*.4),Math.sin(a)*1.9);window.rl.controls.target.set(0,0.2,0);window.rl.controls.update();if(t<42)requestAnimationFrame(f);else resolve();};requestAnimationFrame(f);});});
29
  await page.waitForTimeout(1500);
30
  const audioB64=await page.evaluate(()=>new Promise(resolve=>{const r=window.__simAudioRecorder;r.onstop=()=>{const b=new Blob(window.__simAudioChunks,{type:'audio/webm'});const fr=new FileReader();fr.onload=()=>resolve(fr.result.split(',')[1]);fr.readAsDataURL(b);};r.stop();}));
31
  fs.writeFileSync('sim-audio.webm',Buffer.from(audioB64,'base64'));
 
4
  const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
5
  const context=await browser.newContext({viewport:{width:1440,height:900},recordVideo:{dir:out,size:{width:1440,height:900}}});
6
  const page=await context.newPage();
7
+ await page.goto('http://127.0.0.1:5175/?boot=1');
8
  await page.waitForFunction(()=>window.__store?.getState().bootDone);
9
  await page.evaluate(()=>window.__gameApi.startEntrance());
10
  await page.waitForFunction(()=>window.rl&&!window.rl.inputLocked);
 
13
  const r=new MediaRecorder(window.__audioCaptureStream,{mimeType:'audio/webm;codecs=opus'});
14
  window.__simAudioChunks=[]; r.ondataavailable=e=>e.data.size&&window.__simAudioChunks.push(e.data); r.start(250); window.__simAudioRecorder=r;
15
  });
16
+ const script=JSON.parse(fs.readFileSync('public/scripts/reachy-microduck-conversation.json','utf8'));
 
 
 
 
 
 
 
 
 
 
17
  await page.evaluate(s=>{window.rl.chaseCam=false;window.__gameApi.script.load(s);window.__gameApi.script.run();},script);
18
+ await page.evaluate(async()=>{const start=performance.now();await new Promise(resolve=>{const f=now=>{const t=(now-start)/1000;let x=0,y=0.82,z=2.8,tx=0,ty=0.25,tz=0;if(t<13){const a=t*.42;x=Math.sin(a)*2.35;z=Math.cos(a)*2.35;tx=0;ty=.24;}else if(t<28){const a=(t-13)*.5;x=1.55+Math.sin(a)*.35;z=2.05+Math.cos(a)*.25;y=.68;tx=0;ty=.2;}else{const a=(t-28)*.75;x=Math.sin(a)*2.45;z=Math.cos(a)*2.45;y=.88+Math.sin(t*.5)*.08;tx=0;ty=.23;}window.rl.camera.position.set(x,y,z);window.rl.controls.target.set(tx,ty,tz);window.rl.controls.update();if(t<55)requestAnimationFrame(f);else resolve();};requestAnimationFrame(f);});});
19
  await page.waitForTimeout(1500);
20
  const audioB64=await page.evaluate(()=>new Promise(resolve=>{const r=window.__simAudioRecorder;r.onstop=()=>{const b=new Blob(window.__simAudioChunks,{type:'audio/webm'});const fr=new FileReader();fr.onload=()=>resolve(fr.result.split(',')[1]);fr.readAsDataURL(b);};r.stop();}));
21
  fs.writeFileSync('sim-audio.webm',Buffer.from(audioB64,'base64'));