Skip to content

Commit 25241e4

Browse files
authored
fix: emit audio_start event when audio begins (#236)
* fix: emit audio_start event when audio begins * chore: add changeset for audio_start fix
1 parent 2911733 commit 25241e4

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

.changeset/wise-cats-tell.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@openai/agents-realtime': patch
3+
---
4+
5+
Fix missing `audio_start` event; now emitted on first audio chunk per turn

packages/agents-realtime/src/realtimeSession.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ export class RealtimeSession<
182182
#history: RealtimeItem[] = [];
183183
#shouldIncludeAudioData: boolean;
184184
#interruptedByGuardrail: Record<string, boolean> = {};
185+
#audioStarted = false;
185186

186187
constructor(
187188
public readonly initialAgent:
@@ -531,9 +532,14 @@ export class RealtimeSession<
531532
}
532533
});
533534
this.#transport.on('audio', (event) => {
535+
if (!this.#audioStarted) {
536+
this.#audioStarted = true;
537+
this.emit('audio_start', this.#context, this.#currentAgent);
538+
}
534539
this.emit('audio', event);
535540
});
536541
this.#transport.on('turn_started', () => {
542+
this.#audioStarted = false;
537543
this.emit('agent_start', this.#context, this.#currentAgent);
538544
this.#currentAgent.emit('agent_start', this.#context, this.#currentAgent);
539545
});
@@ -548,6 +554,9 @@ export class RealtimeSession<
548554
});
549555

550556
this.#transport.on('audio_done', () => {
557+
if (this.#audioStarted) {
558+
this.#audioStarted = false;
559+
}
551560
this.emit('audio_stopped', this.#context, this.#currentAgent);
552561
});
553562

@@ -648,6 +657,9 @@ export class RealtimeSession<
648657
});
649658

650659
this.#transport.on('audio_interrupted', () => {
660+
if (this.#audioStarted) {
661+
this.#audioStarted = false;
662+
}
651663
this.emit('audio_interrupted', this.#context, this.#currentAgent);
652664
});
653665

packages/agents-realtime/test/realtimeSession.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,4 +275,29 @@ describe('RealtimeSession', () => {
275275
transport.emit('audio_interrupted');
276276
expect(audioEvents).toBe(1);
277277
});
278+
279+
it('emits audio_start when audio begins', () => {
280+
let startEvents = 0;
281+
session.on('audio_start', () => startEvents++);
282+
transport.emit('turn_started', {} as any);
283+
transport.emit('audio', {
284+
type: 'audio',
285+
data: new ArrayBuffer(1),
286+
responseId: 'r',
287+
} as any);
288+
transport.emit('audio', {
289+
type: 'audio',
290+
data: new ArrayBuffer(1),
291+
responseId: 'r',
292+
} as any);
293+
expect(startEvents).toBe(1);
294+
transport.emit('audio_done');
295+
transport.emit('turn_started', {} as any);
296+
transport.emit('audio', {
297+
type: 'audio',
298+
data: new ArrayBuffer(1),
299+
responseId: 'r2',
300+
} as any);
301+
expect(startEvents).toBe(2);
302+
});
278303
});

0 commit comments

Comments
 (0)