Skip to content

Commit 6674aef

Browse files
committed
fix: emit audio_start event when audio begins
1 parent edf4c6b commit 6674aef

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

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
@@ -267,4 +267,29 @@ describe('RealtimeSession', () => {
267267
transport.emit('audio_interrupted');
268268
expect(audioEvents).toBe(1);
269269
});
270+
271+
it('emits audio_start when audio begins', () => {
272+
let startEvents = 0;
273+
session.on('audio_start', () => startEvents++);
274+
transport.emit('turn_started', {} as any);
275+
transport.emit('audio', {
276+
type: 'audio',
277+
data: new ArrayBuffer(1),
278+
responseId: 'r',
279+
} as any);
280+
transport.emit('audio', {
281+
type: 'audio',
282+
data: new ArrayBuffer(1),
283+
responseId: 'r',
284+
} as any);
285+
expect(startEvents).toBe(1);
286+
transport.emit('audio_done');
287+
transport.emit('turn_started', {} as any);
288+
transport.emit('audio', {
289+
type: 'audio',
290+
data: new ArrayBuffer(1),
291+
responseId: 'r2',
292+
} as any);
293+
expect(startEvents).toBe(2);
294+
});
270295
});

0 commit comments

Comments
 (0)