sanjaystarc commited on
Commit
33aa94a
·
verified ·
1 Parent(s): ce1ade9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +30 -14
app.py CHANGED
@@ -28,15 +28,34 @@ async def home():
28
 
29
  async function start() {
30
 
31
- // IMPORTANT: HuggingFace requires absolute WebSocket domain
32
  const wsUrl = "wss://sanjaystarc-voice-agent.hf.space/ws";
33
  console.log("Connecting WebSocket:", wsUrl);
34
 
35
  ws = new WebSocket(wsUrl);
36
 
37
- ws.onopen = () => {
 
 
 
38
  console.log("WebSocket connected.");
39
  document.getElementById("status").innerText = "Connected. Listening…";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  };
41
 
42
  ws.onerror = (e) => {
@@ -51,21 +70,10 @@ async def home():
51
 
52
  ws.onmessage = (event) => {
53
  console.log("Audio reply received.");
 
54
  const audio = new Audio("data:audio/wav;base64," + event.data);
55
  audio.play();
56
  };
57
-
58
- // Microphone access
59
- const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
60
-
61
- rec = new MediaRecorder(stream, { mimeType: "audio/webm" });
62
-
63
- rec.ondataavailable = async (e) => {
64
- ws.send(await e.data.arrayBuffer()); // send raw audio to backend
65
- };
66
-
67
- rec.start(300); // send chunks every 300 ms
68
- document.getElementById("status").innerText = "Listening…";
69
  }
70
 
71
  function stop() {
@@ -79,16 +87,23 @@ async def home():
79
  </html>
80
  """)
81
 
 
 
 
 
82
  @app.websocket("/ws")
83
  async def websocket_endpoint(ws: WebSocket):
84
  await ws.accept()
85
 
86
  while True:
87
  try:
 
88
  audio_bytes = await ws.receive_bytes()
89
 
 
90
  reply_audio = await agent.handle_audio(audio_bytes)
91
 
 
92
  if reply_audio:
93
  b64 = base64.b64encode(reply_audio).decode()
94
  await ws.send_text(b64)
@@ -97,5 +112,6 @@ async def websocket_endpoint(ws: WebSocket):
97
  print("WebSocket error:", e)
98
  break
99
 
 
100
  if __name__ == "__main__":
101
  uvicorn.run(app, host="0.0.0.0", port=7860)
 
28
 
29
  async function start() {
30
 
31
+ // HuggingFace Spaces require absolute WebSocket domain
32
  const wsUrl = "wss://sanjaystarc-voice-agent.hf.space/ws";
33
  console.log("Connecting WebSocket:", wsUrl);
34
 
35
  ws = new WebSocket(wsUrl);
36
 
37
+ // ---------------------------------------
38
+ // WAIT FOR WEBSOCKET TO OPEN
39
+ // ---------------------------------------
40
+ ws.onopen = async () => {
41
  console.log("WebSocket connected.");
42
  document.getElementById("status").innerText = "Connected. Listening…";
43
+
44
+ // NOW start microphone recording
45
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
46
+ rec = new MediaRecorder(stream, { mimeType: "audio/webm" });
47
+
48
+ rec.ondataavailable = async (e) => {
49
+
50
+ // Only send audio if WS is open
51
+ if (ws.readyState === WebSocket.OPEN) {
52
+ ws.send(await e.data.arrayBuffer());
53
+ } else {
54
+ console.warn("Skipping audio chunk (WebSocket not open)");
55
+ }
56
+ };
57
+
58
+ rec.start(300); // send chunks every 300 ms
59
  };
60
 
61
  ws.onerror = (e) => {
 
70
 
71
  ws.onmessage = (event) => {
72
  console.log("Audio reply received.");
73
+
74
  const audio = new Audio("data:audio/wav;base64," + event.data);
75
  audio.play();
76
  };
 
 
 
 
 
 
 
 
 
 
 
 
77
  }
78
 
79
  function stop() {
 
87
  </html>
88
  """)
89
 
90
+
91
+ # -------------------------------------------------------
92
+ # BACKEND: WEBSOCKET AUDIO ENDPOINT
93
+ # -------------------------------------------------------
94
  @app.websocket("/ws")
95
  async def websocket_endpoint(ws: WebSocket):
96
  await ws.accept()
97
 
98
  while True:
99
  try:
100
+ # receive binary audio
101
  audio_bytes = await ws.receive_bytes()
102
 
103
+ # send audio to Gemini voice agent
104
  reply_audio = await agent.handle_audio(audio_bytes)
105
 
106
+ # if Gemini returned audio, send it to browser
107
  if reply_audio:
108
  b64 = base64.b64encode(reply_audio).decode()
109
  await ws.send_text(b64)
 
112
  print("WebSocket error:", e)
113
  break
114
 
115
+
116
  if __name__ == "__main__":
117
  uvicorn.run(app, host="0.0.0.0", port=7860)