Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions common/changes/@coze/api/fix-speech_2025-03-12-13-51.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "@coze/api",
"comment": "fix speech bug",
"type": "patch"
}
],
"packageName": "@coze/api",
"email": "[email protected]"
}
11 changes: 11 additions & 0 deletions common/changes/@coze/api/fix-speech_2025-03-14-03-48.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "@coze/api",
"comment": "fix speech bug",
"type": "patch"
}
],
"packageName": "@coze/api",
"email": "[email protected]"
}
11 changes: 11 additions & 0 deletions common/changes/@coze/api/fix-speech_2025-03-14-04-06.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "@coze/api",
"comment": "Publish fix/speech",
"type": "patch"
}
],
"packageName": "@coze/api",
"email": "[email protected]"
}
11 changes: 11 additions & 0 deletions common/changes/@coze/api/fix-speech_2025-03-14-04-11.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "@coze/api",
"comment": "Publish fix/speech",
"type": "patch"
}
],
"packageName": "@coze/api",
"email": "[email protected]"
}
35 changes: 20 additions & 15 deletions examples/coze-js-web/src/pages/chat-x/use-ws-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
12 changes: 7 additions & 5 deletions packages/coze-js/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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');
});
Expand All @@ -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();
Expand All @@ -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();

Expand Down
12 changes: 7 additions & 5 deletions packages/coze-js/README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ client.on(WebsocketsEventType.ERROR, data => {
console.error('[speech] ws error', data);
});

// 监听播放完成事件
// 监听播放完成事件,如果手动调用disconnect,则不会触发此事件
client.on('completed', () => {
console.log('[speech] playback completed');
});
Expand All @@ -214,13 +214,11 @@ try {
}

// 发送消息并播放
client.appendAndComplete(message);
client.appendAndComplete('你好,Coze!');

// 打断
client.interrupt();

// 断开连接,销毁实例
client.disconnect();

// 暂停语音播放
client.pause();
Expand All @@ -234,8 +232,12 @@ client.togglePlay();
// 语音是否播放中
client.isPlaying();

// 断开连接,销毁 websocket
client.disconnect();

// 发送文本片段
client.append(message);
client.append('你好,');
client.append(' Coze!');
// 结束发送文本
client.complete();
```
Expand Down
2 changes: 1 addition & 1 deletion packages/coze-js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@coze/api",
"version": "1.1.0-beta.2",
"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",
Expand Down
42 changes: 20 additions & 22 deletions packages/coze-js/src/ws-tools/speech/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,22 @@
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();
}
};
Expand Down Expand Up @@ -135,8 +151,10 @@
}

async disconnect() {
await this.interrupt();
this.listeners.clear();
if (this.playbackTimeout) {
clearTimeout(this.playbackTimeout);
}

Check warning on line 156 in packages/coze-js/src/ws-tools/speech/index.ts

View check run for this annotation

Codecov / codecov/patch

packages/coze-js/src/ws-tools/speech/index.ts#L155-L156

Added lines #L155 - L156 were not covered by tests
await this.wavStreamPlayer.interrupt();
this.closeWs();
}

Expand Down Expand Up @@ -257,26 +275,6 @@
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);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/coze-js/test/ws-tools/speech.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down