SamiKoen commited on
Commit
2353dd5
·
1 Parent(s): a8a8fae

Echo loop fix: echo cancellation + noise suppression aktif, asistan konusurken mic mute

Browse files
Files changed (2) hide show
  1. app.py +1 -1
  2. static/index.html +13 -3
app.py CHANGED
@@ -134,7 +134,7 @@ async def realtime_relay(client_ws: WebSocket):
134
  "input_audio_transcription": {"model": "whisper-1"},
135
  "turn_detection": {
136
  "type": "server_vad",
137
- "threshold": 0.3,
138
  "prefix_padding_ms": 300,
139
  "silence_duration_ms": 700,
140
  },
 
134
  "input_audio_transcription": {"model": "whisper-1"},
135
  "turn_detection": {
136
  "type": "server_vad",
137
+ "threshold": 0.5,
138
  "prefix_padding_ms": 300,
139
  "silence_duration_ms": 700,
140
  },
static/index.html CHANGED
@@ -192,9 +192,9 @@ async function connect() {
192
  mediaStream = await navigator.mediaDevices.getUserMedia({
193
  audio: {
194
  channelCount: 1,
195
- echoCancellation: false,
196
- noiseSuppression: false,
197
- autoGainControl: false
198
  }
199
  });
200
  const track = mediaStream.getAudioTracks()[0];
@@ -307,6 +307,8 @@ function handleEvent(evt) {
307
 
308
  case 'response.created':
309
  console.log('[response] olusturuldu');
 
 
310
  break;
311
  case 'response.done':
312
  console.log('[response] tamamlandi', evt.response?.status, evt.response?.status_details);
@@ -314,6 +316,8 @@ function handleEvent(evt) {
314
  const errMsg = evt.response?.status_details?.error?.message || JSON.stringify(evt.response?.status_details);
315
  addMsg('tool', '⚠️ Response failed: ' + errMsg);
316
  }
 
 
317
  break;
318
 
319
  case 'error':
@@ -323,6 +327,12 @@ function handleEvent(evt) {
323
  }
324
  }
325
 
 
 
 
 
 
 
326
  let _streaming = {};
327
  function appendDelta(role, delta) {
328
  if (!delta) return;
 
192
  mediaStream = await navigator.mediaDevices.getUserMedia({
193
  audio: {
194
  channelCount: 1,
195
+ echoCancellation: true,
196
+ noiseSuppression: true,
197
+ autoGainControl: true
198
  }
199
  });
200
  const track = mediaStream.getAudioTracks()[0];
 
307
 
308
  case 'response.created':
309
  console.log('[response] olusturuldu');
310
+ // Asistan konusmaya baslarken mikrofonu sustur (echo loop'u onle)
311
+ muteMic(true);
312
  break;
313
  case 'response.done':
314
  console.log('[response] tamamlandi', evt.response?.status, evt.response?.status_details);
 
316
  const errMsg = evt.response?.status_details?.error?.message || JSON.stringify(evt.response?.status_details);
317
  addMsg('tool', '⚠️ Response failed: ' + errMsg);
318
  }
319
+ // Asistan bitince mikrofonu ac
320
+ muteMic(false);
321
  break;
322
 
323
  case 'error':
 
327
  }
328
  }
329
 
330
+ function muteMic(mute) {
331
+ if (!mediaStream) return;
332
+ mediaStream.getAudioTracks().forEach(t => t.enabled = !mute);
333
+ console.log('[mic]', mute ? 'muted (assistant konusuyor)' : 'unmuted');
334
+ }
335
+
336
  let _streaming = {};
337
  function appendDelta(role, delta) {
338
  if (!delta) return;