Cristobal commited on
Commit
9ee2075
·
1 Parent(s): 4ccfdce

grabadora de voz con microfono

Browse files
Files changed (1) hide show
  1. app.py +63 -4
app.py CHANGED
@@ -198,6 +198,24 @@ async def ep_voz(request: Request):
198
  except Exception as e:
199
  return JSONResponse({"error": str(e)[:100]}, status_code=500)
200
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
  @app.get("/audio")
202
  def ep_audio():
203
  if os.path.exists("voz.mp3"):
@@ -329,11 +347,21 @@ audio,video{width:100%;margin-top:10px;border-radius:8px}
329
 
330
  <div class="fase">
331
  <div class="fase-t">4. Voz</div>
332
- <div class="row">
333
- <select id="genero"><option value="masculina">Voz masculina</option><option value="femenina">Voz femenina</option></select>
334
- <select id="pais"><option value="">Acento neutro</option><option value="españa">Espana</option><option value="mexico">Mexico</option><option value="argentina">Argentina</option><option value="colombia">Colombia</option></select>
 
 
 
 
 
 
 
 
 
 
 
335
  </div>
336
- <button class="btn2" onclick="genVoz()">Generar y Pre-escuchar Voz</button>
337
  <div class="msg" id="msgVoz"></div>
338
  <audio id="player" controls style="display:none"></audio>
339
  </div>
@@ -418,5 +446,36 @@ async function genVideo(){
418
  }
419
  function descargar(){var a=document.createElement("a");a.href="/video?t="+Date.now();a.download="video_fenix.mp4";a.click();}
420
  async function subirYt(){var m=document.getElementById("msgPub");m.textContent="Conecta tu canal de YouTube para activar la subida automatica";m.style.color="#ffb700";}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
421
  </script>
422
  </body></html>"""
 
198
  except Exception as e:
199
  return JSONResponse({"error": str(e)[:100]}, status_code=500)
200
 
201
+
202
+ @app.post("/subir-voz-grabada")
203
+ async def ep_voz_grabada(file: UploadFile = File(...)):
204
+ try:
205
+ import subprocess
206
+ contenido = await file.read()
207
+ with open("voz_grabada_raw","wb") as f:
208
+ f.write(contenido)
209
+ # Convertir a mp3 con ffmpeg (el navegador graba en webm/ogg)
210
+ subprocess.run(["ffmpeg","-y","-i","voz_grabada_raw","-acodec","libmp3lame","voz.mp3"], capture_output=True)
211
+ import os as _os
212
+ if _os.path.exists("voz.mp3") and _os.path.getsize("voz.mp3") > 1000:
213
+ ESTADO["voz_lista"] = True
214
+ return {"ok": True}
215
+ return JSONResponse({"error":"No se pudo procesar el audio"}, status_code=500)
216
+ except Exception as e:
217
+ return JSONResponse({"error": str(e)[:120]}, status_code=500)
218
+
219
  @app.get("/audio")
220
  def ep_audio():
221
  if os.path.exists("voz.mp3"):
 
347
 
348
  <div class="fase">
349
  <div class="fase-t">4. Voz</div>
350
+ <select id="tipoVoz" onchange="cambioVoz()">
351
+ <option value="ia">Voz IA (automatica)</option>
352
+ <option value="grabada">Mi voz grabada (con microfono)</option>
353
+ </select>
354
+ <div id="vozIA">
355
+ <div class="row">
356
+ <select id="genero"><option value="masculina">Voz masculina</option><option value="femenina">Voz femenina</option></select>
357
+ <select id="pais"><option value="">Acento neutro</option><option value="españa">Espana</option><option value="mexico">Mexico</option><option value="argentina">Argentina</option><option value="colombia">Colombia</option></select>
358
+ </div>
359
+ <button class="btn2" onclick="genVoz()">Generar y Pre-escuchar Voz</button>
360
+ </div>
361
+ <div id="vozGrabada" style="display:none">
362
+ <p style="color:#aaa;font-size:.85rem;margin-bottom:8px">Lee el guion de arriba en voz alta y grabate:</p>
363
+ <button class="btn2" id="btnRec" onclick="toggleRec()">Empezar a grabar</button>
364
  </div>
 
365
  <div class="msg" id="msgVoz"></div>
366
  <audio id="player" controls style="display:none"></audio>
367
  </div>
 
446
  }
447
  function descargar(){var a=document.createElement("a");a.href="/video?t="+Date.now();a.download="video_fenix.mp4";a.click();}
448
  async function subirYt(){var m=document.getElementById("msgPub");m.textContent="Conecta tu canal de YouTube para activar la subida automatica";m.style.color="#ffb700";}
449
+
450
+ function cambioVoz(){
451
+ var t=document.getElementById("tipoVoz").value;
452
+ document.getElementById("vozIA").style.display=t==="ia"?"block":"none";
453
+ document.getElementById("vozGrabada").style.display=t==="grabada"?"block":"none";
454
+ }
455
+ var mediaRec=null, chunks=[], grabando=false;
456
+ async function toggleRec(){
457
+ var btn=document.getElementById("btnRec"); var m=document.getElementById("msgVoz");
458
+ if(!grabando){
459
+ try{
460
+ var stream=await navigator.mediaDevices.getUserMedia({audio:true});
461
+ mediaRec=new MediaRecorder(stream); chunks=[];
462
+ mediaRec.ondataavailable=e=>chunks.push(e.data);
463
+ mediaRec.onstop=async()=>{
464
+ var blob=new Blob(chunks,{type:"audio/webm"});
465
+ m.textContent="Subiendo tu voz...";m.style.color="#ffb700";
466
+ var fd=new FormData(); fd.append("file",blob,"voz.webm");
467
+ var r=await fetch("/subir-voz-grabada",{method:"POST",body:fd}); var d=await r.json();
468
+ if(d.ok){var p=document.getElementById("player");p.src="/audio?t="+Date.now();p.style.display="block";m.textContent="✅ Tu voz lista, escuchala:";m.style.color="#00c853";}
469
+ else{m.textContent="❌ "+(d.error||"Error");m.style.color="#ff5252";}
470
+ };
471
+ mediaRec.start(); grabando=true;
472
+ btn.textContent="⏹ Detener grabacion"; btn.style.background="#ff4444";
473
+ m.textContent="Grabando... lee el guion";m.style.color="#ff4444";
474
+ }catch(e){m.textContent="❌ No se pudo acceder al microfono";m.style.color="#ff5252";}
475
+ }else{
476
+ mediaRec.stop(); grabando=false;
477
+ btn.textContent="Empezar a grabar"; btn.style.background="";
478
+ }
479
+ }
480
  </script>
481
  </body></html>"""