Spaces:
Running
Running
SamiKoen commited on
Commit ·
2353dd5
1
Parent(s): a8a8fae
Echo loop fix: echo cancellation + noise suppression aktif, asistan konusurken mic mute
Browse files- app.py +1 -1
- 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.
|
| 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:
|
| 196 |
-
noiseSuppression:
|
| 197 |
-
autoGainControl:
|
| 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;
|