From 00c8c41baf9991a93a6ee42b6747e20c6167446f Mon Sep 17 00:00:00 2001 From: Roman Lut <11955117+RomanLut@users.noreply.github.com> Date: Fri, 6 Jun 2025 01:01:43 +0200 Subject: [PATCH 1/2] stop instruction --- firmware-arduino/src/Audio.cpp | 10 ++++++++++ firmware-arduino/src/Audio.h | 2 ++ firmware-arduino/src/main.cpp | 10 +++++++++- server-deno/main.ts | 5 +++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/firmware-arduino/src/Audio.cpp b/firmware-arduino/src/Audio.cpp index 12d64be8..f6f4524b 100644 --- a/firmware-arduino/src/Audio.cpp +++ b/firmware-arduino/src/Audio.cpp @@ -71,6 +71,8 @@ StreamCopy pitchCopier(volumePitch, queue); AudioInfo info(SAMPLE_RATE, CHANNELS, BITS_PER_SAMPLE); volatile bool i2sOutputFlushScheduled = false; +volatile bool talkInterruptScheduled = false; + unsigned long getSpeakingDuration() { if (deviceState == SPEAKING && speakingStartTime > 0) { return millis() - speakingStartTime; @@ -239,6 +241,14 @@ void micTask(void *parameter) { // Use smaller chunk size to avoid blocking too long micToWsCopier.copyBytes(MIC_COPY_SIZE); + if ( talkInterruptScheduled == true ) { + talkInterruptScheduled = false; + const char* msg = "{\"type\": \"instruction\", \"msg\": \"INTERRUPT\", \"audio_end_ms\": 1000}"; + xSemaphoreTake(wsMutex, portMAX_DELAY); + webSocket.sendTXT(msg, strlen(msg)); + xSemaphoreGive(wsMutex); + } + // Yield more frequently vTaskDelay(1); } else { diff --git a/firmware-arduino/src/Audio.h b/firmware-arduino/src/Audio.h index f6d0c2fa..e3e53ec5 100644 --- a/firmware-arduino/src/Audio.h +++ b/firmware-arduino/src/Audio.h @@ -43,6 +43,8 @@ extern I2SStream i2sInput; extern StreamCopy micToWsCopier; extern volatile bool i2sInputFlushScheduled; +extern volatile bool talkInterruptScheduled; + // WEBSOCKET void webSocketEvent(WStype_t type, uint8_t *payload, size_t length); void websocketSetup(String server_domain, int port, String path); diff --git a/firmware-arduino/src/main.cpp b/firmware-arduino/src/main.cpp index f33c0243..35d9f378 100644 --- a/firmware-arduino/src/main.cpp +++ b/firmware-arduino/src/main.cpp @@ -100,6 +100,14 @@ static void onButtonDoubleClickCb(void *button_handle, void *usr_data) enterSleep(); } +static void onButtonSingleClickCb(void *button_handle, void *usr_data) +{ + Serial.println("Button single click"); + scheduleListeningRestart = true; + scheduledTime = millis(); + talkInterruptScheduled = true; +} + void getAuthTokenFromNVS() { preferences.begin("auth", false); @@ -197,7 +205,7 @@ void setup() Button *btn = new Button(BUTTON_PIN, false); btn->attachLongPressUpEventCb(&onButtonLongPressUpEventCb, NULL); btn->attachDoubleClickEventCb(&onButtonDoubleClickCb, NULL); - btn->detachSingleClickEvent(); + btn->attachSingleClickEventCb(&onButtonSingleClickCb, NULL); #endif // Pin audio tasks to Core 1 (application core) diff --git a/server-deno/main.ts b/server-deno/main.ts index 47eac4b5..d59a9b74 100644 --- a/server-deno/main.ts +++ b/server-deno/main.ts @@ -333,6 +333,11 @@ wss.on("connection", async (ws: WSWebSocket, payload: IPayload) => { console.log("interrupt detected", message); const audioEndMs = message.audio_end_ms; + client.realtime.send("response.cancel", { + type: "response.cancel", + event_id: RealtimeUtils.generateId("evt_") + }); + client.realtime.send("conversation.item.truncate", { event_id: RealtimeUtils.generateId("evt_"), // Generate unique ID type: "conversation.item.truncate", From 281823b2a939ecd8e8b826a2ca3ed9eeef2721a8 Mon Sep 17 00:00:00 2001 From: Roman Lut <11955117+RomanLut@users.noreply.github.com> Date: Fri, 6 Jun 2025 18:06:46 +0200 Subject: [PATCH 2/2] disabled switching listening mode on client side --- firmware-arduino/src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware-arduino/src/main.cpp b/firmware-arduino/src/main.cpp index 35d9f378..316efdcc 100644 --- a/firmware-arduino/src/main.cpp +++ b/firmware-arduino/src/main.cpp @@ -103,8 +103,8 @@ static void onButtonDoubleClickCb(void *button_handle, void *usr_data) static void onButtonSingleClickCb(void *button_handle, void *usr_data) { Serial.println("Button single click"); - scheduleListeningRestart = true; - scheduledTime = millis(); +// scheduleListeningRestart = true; +// scheduledTime = millis(); talkInterruptScheduled = true; }