Spaces:
Sleeping
Sleeping
Cristobal commited on
Commit ·
9ee2075
1
Parent(s): 4ccfdce
grabadora de voz con microfono
Browse files
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 |
-
<
|
| 333 |
-
<
|
| 334 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>"""
|