Improve simulator film camera recording
Browse files- 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:
|
| 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=
|
| 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.
|
| 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'));
|