From a15c3c5911fa2f68bf5e11737cd90fcd5edb32e6 Mon Sep 17 00:00:00 2001 From: "shenxiaojie.316" Date: Wed, 12 Mar 2025 21:51:46 +0800 Subject: [PATCH 1/4] fix(coze/api): fix speech bug --- .../api/fix-speech_2025-03-12-13-51.json | 11 ++++++ .../src/pages/chat-x/use-ws-api.ts | 35 +++++++++++-------- packages/coze-js/README.md | 10 +++--- packages/coze-js/README.zh-CN.md | 10 +++--- packages/coze-js/src/ws-tools/speech/index.ts | 6 ++-- 5 files changed, 47 insertions(+), 25 deletions(-) create mode 100644 common/changes/@coze/api/fix-speech_2025-03-12-13-51.json diff --git a/common/changes/@coze/api/fix-speech_2025-03-12-13-51.json b/common/changes/@coze/api/fix-speech_2025-03-12-13-51.json new file mode 100644 index 00000000..bdb265ee --- /dev/null +++ b/common/changes/@coze/api/fix-speech_2025-03-12-13-51.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "@coze/api", + "comment": "fix speech bug", + "type": "patch" + } + ], + "packageName": "@coze/api", + "email": "shenxiaojie.316@bytedance.com" +} diff --git a/examples/coze-js-web/src/pages/chat-x/use-ws-api.ts b/examples/coze-js-web/src/pages/chat-x/use-ws-api.ts index 4aca5123..7c455fc4 100644 --- a/examples/coze-js-web/src/pages/chat-x/use-ws-api.ts +++ b/examples/coze-js-web/src/pages/chat-x/use-ws-api.ts @@ -306,34 +306,39 @@ const useWsAPI = ( return; } - const client = new WsSpeechClient({ - token: config.getPat(), - baseWsURL: config.getBaseWsUrl(), - allowPersonalAccessTokenInBrowser: true, - }); + if (!speechClientRef.current) { + const client = new WsSpeechClient({ + token: config.getPat(), + baseWsURL: config.getBaseWsUrl(), + allowPersonalAccessTokenInBrowser: true, + }); - client.on('data', data => { - console.log('[speech] ws data', data); - }); + client.on('data', data => { + console.log('[speech] ws data', data); + }); - client.on(WebsocketsEventType.ERROR, data => { - console.error('[speech] ws error', data); - }); + client.on(WebsocketsEventType.ERROR, data => { + console.error('[speech] ws error', data); + }); + client.on('completed', () => { + console.log('[speech] speech completed'); + }); + speechClientRef.current = client; + } try { - await client.connect(); + await speechClientRef.current?.connect(); console.log('[speech] ws connect success'); } catch (error) { console.error('[speech] ws connect error', error); return; } - client.appendAndComplete(message); - speechClientRef.current = client; + speechClientRef.current?.appendAndComplete(message); }, []); const stopSpeech = () => { - speechClientRef.current?.interrupt(); + speechClientRef.current?.disconnect(); }; const getIsSpeech = () => speechClientRef.current?.isPlaying(); diff --git a/packages/coze-js/README.md b/packages/coze-js/README.md index 84320aa5..12aa30c2 100644 --- a/packages/coze-js/README.md +++ b/packages/coze-js/README.md @@ -215,13 +215,11 @@ try { } // Send message and play -client.appendAndComplete(message); +client.appendAndComplete('Hello, Coze!'); // Interrupt client.interrupt(); -// Disconnect, destroy instance -client.disconnect(); // Pause speech playback client.pause(); @@ -235,8 +233,12 @@ client.togglePlay(); // Check if speech is playing client.isPlaying(); +// Disconnect, destroy instance +client.disconnect(); + // Send text fragment -client.append(message); +client.append('Hello,'); +client.append(' Coze!'); // End sending text client.complete(); diff --git a/packages/coze-js/README.zh-CN.md b/packages/coze-js/README.zh-CN.md index aee9a1a5..b4407093 100644 --- a/packages/coze-js/README.zh-CN.md +++ b/packages/coze-js/README.zh-CN.md @@ -214,13 +214,11 @@ try { } // 发送消息并播放 -client.appendAndComplete(message); +client.appendAndComplete('你好,Coze!'); // 打断 client.interrupt(); -// 断开连接,销毁实例 -client.disconnect(); // 暂停语音播放 client.pause(); @@ -234,8 +232,12 @@ client.togglePlay(); // 语音是否播放中 client.isPlaying(); +// 断开连接,销毁实例 +client.disconnect(); + // 发送文本片段 -client.append(message); +client.append('你好,'); +client.append(' Coze!'); // 结束发送文本 client.complete(); ``` diff --git a/packages/coze-js/src/ws-tools/speech/index.ts b/packages/coze-js/src/ws-tools/speech/index.ts index cccde9c2..04f09563 100644 --- a/packages/coze-js/src/ws-tools/speech/index.ts +++ b/packages/coze-js/src/ws-tools/speech/index.ts @@ -135,8 +135,10 @@ class WsSpeechClient { } async disconnect() { - await this.interrupt(); - this.listeners.clear(); + if (this.playbackTimeout) { + clearTimeout(this.playbackTimeout); + } + await this.wavStreamPlayer.interrupt(); this.closeWs(); } From 946325a224d3b305bcac5004d1bdedf65c5949d1 Mon Sep 17 00:00:00 2001 From: "shenxiaojie.316" Date: Wed, 12 Mar 2025 21:52:40 +0800 Subject: [PATCH 2/4] chore: Publish fix/speech --- packages/coze-js/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/coze-js/package.json b/packages/coze-js/package.json index f7370e4c..c0af331d 100644 --- a/packages/coze-js/package.json +++ b/packages/coze-js/package.json @@ -1,6 +1,6 @@ { "name": "@coze/api", - "version": "1.1.0-beta.2", + "version": "1.1.0-beta.3", "description": "Official Coze Node.js SDK for seamless AI integration into your applications | 扣子官方 Node.js SDK,助您轻松集成 AI 能力到应用中", "keywords": [ "coze", From 646d86adcca7726dcf809b65c4bcfae05aed478c Mon Sep 17 00:00:00 2001 From: "shenxiaojie.316" Date: Fri, 14 Mar 2025 11:48:12 +0800 Subject: [PATCH 3/4] fix(coze/api): fix speech bug --- .../api/fix-speech_2025-03-14-03-48.json | 11 ++++++ packages/coze-js/src/ws-tools/speech/index.ts | 36 +++++++++---------- 2 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 common/changes/@coze/api/fix-speech_2025-03-14-03-48.json diff --git a/common/changes/@coze/api/fix-speech_2025-03-14-03-48.json b/common/changes/@coze/api/fix-speech_2025-03-14-03-48.json new file mode 100644 index 00000000..bdb265ee --- /dev/null +++ b/common/changes/@coze/api/fix-speech_2025-03-14-03-48.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "@coze/api", + "comment": "fix speech bug", + "type": "patch" + } + ], + "packageName": "@coze/api", + "email": "shenxiaojie.316@bytedance.com" +} diff --git a/packages/coze-js/src/ws-tools/speech/index.ts b/packages/coze-js/src/ws-tools/speech/index.ts index 04f09563..dadcc490 100644 --- a/packages/coze-js/src/ws-tools/speech/index.ts +++ b/packages/coze-js/src/ws-tools/speech/index.ts @@ -88,6 +88,22 @@ class WsSpeechClient { data.event_type === WebsocketsEventType.SPEECH_AUDIO_COMPLETED ) { console.debug('[speech] totalDuration', this.totalDuration); + + if (this.playbackStartTime) { + // 剩余时间 = 总时间 - 已播放时间 - 已暂停时间 + const now = new Date().getTime(); + const remaining = + this.totalDuration - + (now - this.playbackStartTime) / 1000 - + this.elapsedBeforePause; + + this.playbackTimeout = setTimeout(() => { + this.emit('completed', undefined); + this.playbackStartTime = null; + this.elapsedBeforePause = 0; + }, remaining * 1000); + } + this.closeWs(); } }; @@ -259,26 +275,6 @@ class WsSpeechClient { this.playbackStartTime = Date.now(); this.elapsedBeforePause = 0; } - - // Clear existing timeout if any - if (this.playbackTimeout) { - clearTimeout(this.playbackTimeout); - } - - // Calculate remaining time - const elapsed = - this.elapsedBeforePause + - (this.playbackPauseTime - ? 0 - : (Date.now() - (this.playbackStartTime || Date.now())) / 1000); - const remaining = this.totalDuration - elapsed; - - // Set new timeout - this.playbackTimeout = setTimeout(() => { - this.emit('completed', undefined); - this.playbackStartTime = null; - this.elapsedBeforePause = 0; - }, remaining * 1000); } catch (error) { console.warn('[speech] wavStreamPlayer error', error); } From 7c8b5a3ffa96fc1e1e85d7f2f6f4b9a47dcbdece Mon Sep 17 00:00:00 2001 From: "shenxiaojie.316" Date: Fri, 14 Mar 2025 11:49:02 +0800 Subject: [PATCH 4/4] chore: Publish fix/speech --- .../@coze/api/fix-speech_2025-03-14-04-06.json | 11 +++++++++++ .../@coze/api/fix-speech_2025-03-14-04-11.json | 11 +++++++++++ packages/coze-js/README.md | 2 +- packages/coze-js/README.zh-CN.md | 4 ++-- packages/coze-js/package.json | 2 +- packages/coze-js/test/ws-tools/speech.spec.ts | 2 +- 6 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 common/changes/@coze/api/fix-speech_2025-03-14-04-06.json create mode 100644 common/changes/@coze/api/fix-speech_2025-03-14-04-11.json diff --git a/common/changes/@coze/api/fix-speech_2025-03-14-04-06.json b/common/changes/@coze/api/fix-speech_2025-03-14-04-06.json new file mode 100644 index 00000000..c68df0a4 --- /dev/null +++ b/common/changes/@coze/api/fix-speech_2025-03-14-04-06.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "@coze/api", + "comment": "Publish fix/speech", + "type": "patch" + } + ], + "packageName": "@coze/api", + "email": "shenxiaojie.316@bytedance.com" +} diff --git a/common/changes/@coze/api/fix-speech_2025-03-14-04-11.json b/common/changes/@coze/api/fix-speech_2025-03-14-04-11.json new file mode 100644 index 00000000..c68df0a4 --- /dev/null +++ b/common/changes/@coze/api/fix-speech_2025-03-14-04-11.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "@coze/api", + "comment": "Publish fix/speech", + "type": "patch" + } + ], + "packageName": "@coze/api", + "email": "shenxiaojie.316@bytedance.com" +} diff --git a/packages/coze-js/README.md b/packages/coze-js/README.md index 12aa30c2..cfb26a19 100644 --- a/packages/coze-js/README.md +++ b/packages/coze-js/README.md @@ -200,7 +200,7 @@ client.on(WebsocketsEventType.ERROR, data => { console.error('[speech] ws error', data); }); -// Listen for playback completed event +// Listen for playback completed event, if manually called disconnect, this event will not be triggered client.on('completed', () => { console.log('[speech] playback completed'); }); diff --git a/packages/coze-js/README.zh-CN.md b/packages/coze-js/README.zh-CN.md index b4407093..6bff6f78 100644 --- a/packages/coze-js/README.zh-CN.md +++ b/packages/coze-js/README.zh-CN.md @@ -199,7 +199,7 @@ client.on(WebsocketsEventType.ERROR, data => { console.error('[speech] ws error', data); }); -// 监听播放完成事件 +// 监听播放完成事件,如果手动调用disconnect,则不会触发此事件 client.on('completed', () => { console.log('[speech] playback completed'); }); @@ -232,7 +232,7 @@ client.togglePlay(); // 语音是否播放中 client.isPlaying(); -// 断开连接,销毁实例 +// 断开连接,销毁 websocket client.disconnect(); // 发送文本片段 diff --git a/packages/coze-js/package.json b/packages/coze-js/package.json index c0af331d..7705c6a1 100644 --- a/packages/coze-js/package.json +++ b/packages/coze-js/package.json @@ -1,6 +1,6 @@ { "name": "@coze/api", - "version": "1.1.0-beta.3", + "version": "1.1.0-beta.4", "description": "Official Coze Node.js SDK for seamless AI integration into your applications | 扣子官方 Node.js SDK,助您轻松集成 AI 能力到应用中", "keywords": [ "coze", diff --git a/packages/coze-js/test/ws-tools/speech.spec.ts b/packages/coze-js/test/ws-tools/speech.spec.ts index 1704b778..be3982ac 100644 --- a/packages/coze-js/test/ws-tools/speech.spec.ts +++ b/packages/coze-js/test/ws-tools/speech.spec.ts @@ -93,7 +93,7 @@ describe('WsSpeechClient', () => { }, undefined as unknown as MessageEvent, ); - + await new Promise(resolve => setTimeout(resolve, 50)); client.ws?.onmessage?.( { event_type: WebsocketsEventType.SPEECH_AUDIO_COMPLETED,