|
@@ -525,6 +525,60 @@
|
|
console.log(`Audio monitoring and playing stopped for message ID ${id}`);
|
|
console.log(`Audio monitoring and playing stopped for message ID ${id}`);
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+ const chatStartHandler = async (e) => {
|
|
|
|
+ const { id } = e.detail;
|
|
|
|
+
|
|
|
|
+ chatStreaming = true;
|
|
|
|
+
|
|
|
|
+ if (currentMessageId !== id) {
|
|
|
|
+ console.log(`Received chat start event for message ID ${id}`);
|
|
|
|
+
|
|
|
|
+ currentMessageId = id;
|
|
|
|
+ if (audioAbortController) {
|
|
|
|
+ audioAbortController.abort();
|
|
|
|
+ }
|
|
|
|
+ audioAbortController = new AbortController();
|
|
|
|
+
|
|
|
|
+ assistantSpeaking = true;
|
|
|
|
+ // Start monitoring and playing audio for the message ID
|
|
|
|
+ monitorAndPlayAudio(id, audioAbortController.signal);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const chatEventHandler = async (e) => {
|
|
|
|
+ const { id, content } = e.detail;
|
|
|
|
+ // "id" here is message id
|
|
|
|
+ // if "id" is not the same as "currentMessageId" then do not process
|
|
|
|
+ // "content" here is a sentence from the assistant,
|
|
|
|
+ // there will be many sentences for the same "id"
|
|
|
|
+
|
|
|
|
+ if (currentMessageId === id) {
|
|
|
|
+ console.log(`Received chat event for message ID ${id}: ${content}`);
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ if (messages[id] === undefined) {
|
|
|
|
+ messages[id] = [content];
|
|
|
|
+ } else {
|
|
|
|
+ messages[id].push(content);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ console.log(content);
|
|
|
|
+
|
|
|
|
+ fetchAudio(content);
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.error('Failed to fetch or play audio:', error);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const chatFinishHandler = async (e) => {
|
|
|
|
+ const { id, content } = e.detail;
|
|
|
|
+ // "content" here is the entire message from the assistant
|
|
|
|
+ finishedMessages[id] = true;
|
|
|
|
+
|
|
|
|
+ chatStreaming = false;
|
|
|
|
+ };
|
|
|
|
+
|
|
onMount(async () => {
|
|
onMount(async () => {
|
|
const setWakeLock = async () => {
|
|
const setWakeLock = async () => {
|
|
try {
|
|
try {
|
|
@@ -558,60 +612,6 @@
|
|
|
|
|
|
startRecording();
|
|
startRecording();
|
|
|
|
|
|
- const chatStartHandler = async (e) => {
|
|
|
|
- const { id } = e.detail;
|
|
|
|
-
|
|
|
|
- chatStreaming = true;
|
|
|
|
-
|
|
|
|
- if (currentMessageId !== id) {
|
|
|
|
- console.log(`Received chat start event for message ID ${id}`);
|
|
|
|
-
|
|
|
|
- currentMessageId = id;
|
|
|
|
- if (audioAbortController) {
|
|
|
|
- audioAbortController.abort();
|
|
|
|
- }
|
|
|
|
- audioAbortController = new AbortController();
|
|
|
|
-
|
|
|
|
- assistantSpeaking = true;
|
|
|
|
- // Start monitoring and playing audio for the message ID
|
|
|
|
- monitorAndPlayAudio(id, audioAbortController.signal);
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- const chatEventHandler = async (e) => {
|
|
|
|
- const { id, content } = e.detail;
|
|
|
|
- // "id" here is message id
|
|
|
|
- // if "id" is not the same as "currentMessageId" then do not process
|
|
|
|
- // "content" here is a sentence from the assistant,
|
|
|
|
- // there will be many sentences for the same "id"
|
|
|
|
-
|
|
|
|
- if (currentMessageId === id) {
|
|
|
|
- console.log(`Received chat event for message ID ${id}: ${content}`);
|
|
|
|
-
|
|
|
|
- try {
|
|
|
|
- if (messages[id] === undefined) {
|
|
|
|
- messages[id] = [content];
|
|
|
|
- } else {
|
|
|
|
- messages[id].push(content);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- console.log(content);
|
|
|
|
-
|
|
|
|
- fetchAudio(content);
|
|
|
|
- } catch (error) {
|
|
|
|
- console.error('Failed to fetch or play audio:', error);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- const chatFinishHandler = async (e) => {
|
|
|
|
- const { id, content } = e.detail;
|
|
|
|
- // "content" here is the entire message from the assistant
|
|
|
|
- finishedMessages[id] = true;
|
|
|
|
-
|
|
|
|
- chatStreaming = false;
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
eventTarget.addEventListener('chat:start', chatStartHandler);
|
|
eventTarget.addEventListener('chat:start', chatStartHandler);
|
|
eventTarget.addEventListener('chat', chatEventHandler);
|
|
eventTarget.addEventListener('chat', chatEventHandler);
|
|
eventTarget.addEventListener('chat:finish', chatFinishHandler);
|
|
eventTarget.addEventListener('chat:finish', chatFinishHandler);
|
|
@@ -632,7 +632,15 @@
|
|
});
|
|
});
|
|
|
|
|
|
onDestroy(async () => {
|
|
onDestroy(async () => {
|
|
|
|
+ eventTarget.removeEventListener('chat:start', chatStartHandler);
|
|
|
|
+ eventTarget.removeEventListener('chat', chatEventHandler);
|
|
|
|
+ eventTarget.removeEventListener('chat:finish', chatFinishHandler);
|
|
|
|
+
|
|
|
|
+ audioAbortController.abort();
|
|
|
|
+ await tick();
|
|
|
|
+
|
|
await stopAllAudio();
|
|
await stopAllAudio();
|
|
|
|
+
|
|
await stopRecordingCallback(false);
|
|
await stopRecordingCallback(false);
|
|
await stopCamera();
|
|
await stopCamera();
|
|
});
|
|
});
|