dvgateway-adapters 1.3.9 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/realtime/gemini-live.d.ts +196 -0
- package/dist/realtime/gemini-live.d.ts.map +1 -0
- package/dist/realtime/gemini-live.js +461 -0
- package/dist/realtime/gemini-live.js.map +1 -0
- package/dist/realtime/index.d.ts +2 -0
- package/dist/realtime/index.d.ts.map +1 -1
- package/dist/realtime/index.js +1 -0
- package/dist/realtime/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Gemini Live API — Speech-to-Speech Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements a direct speech-to-speech pipeline using Google's Gemini Live API
|
|
5
|
+
* (BidiGenerateContent). This adapter is a drop-in alternative to
|
|
6
|
+
* OpenAIRealtimeAdapter — same RealtimeSpeechAdapter interface, same callbacks,
|
|
7
|
+
* same pipelineType="s2s" dashboard integration.
|
|
8
|
+
*
|
|
9
|
+
* Architecture:
|
|
10
|
+
*
|
|
11
|
+
* DVGateway audio in (16kHz PCM)
|
|
12
|
+
* ↓ (Gemini Live native input rate — no resampling needed)
|
|
13
|
+
* Gemini Live API (WebSocket)
|
|
14
|
+
* ↓ gemini-live-2.5-flash-preview processes speech end-to-end
|
|
15
|
+
* DVGateway audio out (24kHz → 16kHz downsample)
|
|
16
|
+
* ↓
|
|
17
|
+
* TTS injector → call audio
|
|
18
|
+
*
|
|
19
|
+
* Supported endpoints (choose via `endpoint` option):
|
|
20
|
+
* - "ai-studio" (default): AI Studio global endpoint
|
|
21
|
+
* wss://generativelanguage.googleapis.com/ws/.../BidiGenerateContent?key=KEY
|
|
22
|
+
* - "vertex": Vertex AI regional endpoint
|
|
23
|
+
* wss://{LOCATION}-aiplatform.googleapis.com/ws/.../BidiGenerateContent
|
|
24
|
+
* (requires Bearer access token via `accessToken` option)
|
|
25
|
+
*
|
|
26
|
+
* Audio format:
|
|
27
|
+
* Input: PCM16 16kHz mono, base64-encoded, MIME "audio/pcm;rate=16000"
|
|
28
|
+
* Output: PCM16 24kHz mono, base64-encoded (downsampled to 16kHz for DVGateway)
|
|
29
|
+
*
|
|
30
|
+
* Key differences vs OpenAIRealtimeAdapter:
|
|
31
|
+
* - Input rate matches DVGateway natively (no upsample)
|
|
32
|
+
* - Message schema is BidiGenerateContent proto-JSON, not OpenAI events
|
|
33
|
+
* - Server-side VAD signals are implicit — we infer speech activity from
|
|
34
|
+
* `interrupted` / `turnComplete` server messages (best-effort). For precise
|
|
35
|
+
* VAD, set `turnDetection.mode = "none"` and call `sendActivityStart()` /
|
|
36
|
+
* `sendActivityEnd()` manually.
|
|
37
|
+
*
|
|
38
|
+
* API Reference:
|
|
39
|
+
* https://ai.google.dev/gemini-api/docs/live-api
|
|
40
|
+
* https://ai.google.dev/api/live
|
|
41
|
+
*/
|
|
42
|
+
import type { AudioChunk, TranscriptResult } from 'dvgateway-sdk';
|
|
43
|
+
import type { RealtimeSpeechAdapter, RealtimeSpeechActivityEvent, RealtimeToolCall } from './openai-realtime.js';
|
|
44
|
+
/**
|
|
45
|
+
* Prebuilt voice names supported by Gemini Live (half-cascade models).
|
|
46
|
+
* Native-audio models support more voices (Google Cloud TTS full catalog),
|
|
47
|
+
* but these 8 are the portable defaults available on both paths.
|
|
48
|
+
* Reference: https://ai.google.dev/gemini-api/docs/live-api/capabilities
|
|
49
|
+
*/
|
|
50
|
+
export type GeminiLiveVoice = 'Puck' | 'Charon' | 'Kore' | 'Fenrir' | 'Aoede' | 'Leda' | 'Orus' | 'Zephyr';
|
|
51
|
+
/** Gemini Live API model identifiers (as of 2026-04). */
|
|
52
|
+
export type GeminiLiveModel = 'gemini-live-2.5-flash-preview' | 'gemini-2.5-flash-native-audio' | 'gemini-2.0-flash-live-001';
|
|
53
|
+
export type GeminiLiveEndpoint = 'ai-studio' | 'vertex';
|
|
54
|
+
export type GeminiLiveTurnDetectionMode = 'server_vad' | 'none';
|
|
55
|
+
export interface GeminiLiveTurnDetectionOptions {
|
|
56
|
+
/**
|
|
57
|
+
* Turn detection strategy.
|
|
58
|
+
* - "server_vad" (default): Gemini's server-side VAD auto-detects speech
|
|
59
|
+
* boundaries and barge-in. No manual activityStart/End required.
|
|
60
|
+
* - "none": client is responsible — set automaticActivityDetection.disabled
|
|
61
|
+
* and call sendActivityStart() / sendActivityEnd() yourself.
|
|
62
|
+
*/
|
|
63
|
+
mode?: GeminiLiveTurnDetectionMode;
|
|
64
|
+
/** VAD start-of-speech sensitivity (LOW/MEDIUM/HIGH). Default: MEDIUM. */
|
|
65
|
+
startSensitivity?: 'LOW' | 'MEDIUM' | 'HIGH';
|
|
66
|
+
/** VAD end-of-speech sensitivity (LOW/MEDIUM/HIGH). Default: MEDIUM. */
|
|
67
|
+
endSensitivity?: 'LOW' | 'MEDIUM' | 'HIGH';
|
|
68
|
+
/** Prefix padding in ms applied before detected speech start. Default: 200. */
|
|
69
|
+
prefixPaddingMs?: number;
|
|
70
|
+
/** Silence duration in ms before turn is considered ended. Default: 800. */
|
|
71
|
+
silenceDurationMs?: number;
|
|
72
|
+
}
|
|
73
|
+
/** Function/tool declaration for Gemini Live (same schema as Gemini Generative API). */
|
|
74
|
+
export interface GeminiLiveTool {
|
|
75
|
+
name: string;
|
|
76
|
+
description?: string;
|
|
77
|
+
/** JSON Schema describing the function parameters. */
|
|
78
|
+
parameters?: Record<string, unknown>;
|
|
79
|
+
}
|
|
80
|
+
export interface GeminiLiveAdapterOptions {
|
|
81
|
+
/** API key for AI Studio endpoint (required if endpoint="ai-studio"). */
|
|
82
|
+
apiKey?: string;
|
|
83
|
+
/** Bearer access token for Vertex endpoint (required if endpoint="vertex"). */
|
|
84
|
+
accessToken?: string;
|
|
85
|
+
/** Vertex AI project ID (required if endpoint="vertex"). */
|
|
86
|
+
project?: string;
|
|
87
|
+
/** Vertex AI location, e.g. "asia-northeast1" (required if endpoint="vertex"). */
|
|
88
|
+
location?: string;
|
|
89
|
+
/**
|
|
90
|
+
* Which Gemini Live endpoint to use.
|
|
91
|
+
* - "ai-studio" (default): global AI Studio, API key auth.
|
|
92
|
+
* - "vertex": regional Vertex AI, Bearer token auth, project/location required.
|
|
93
|
+
*/
|
|
94
|
+
endpoint?: GeminiLiveEndpoint;
|
|
95
|
+
/**
|
|
96
|
+
* Model (default: "gemini-live-2.5-flash-preview").
|
|
97
|
+
* For Vertex AI this will be normalized to the full resource path internally.
|
|
98
|
+
*/
|
|
99
|
+
model?: GeminiLiveModel;
|
|
100
|
+
/** Voice for the AI response (default: "Puck"). */
|
|
101
|
+
voice?: GeminiLiveVoice;
|
|
102
|
+
/**
|
|
103
|
+
* System instructions. Equivalent to OpenAI's `instructions` field.
|
|
104
|
+
* Default: generic voice assistant prompt.
|
|
105
|
+
*/
|
|
106
|
+
instructions?: string;
|
|
107
|
+
/** Turn detection configuration — see GeminiLiveTurnDetectionOptions. */
|
|
108
|
+
turnDetection?: GeminiLiveTurnDetectionOptions;
|
|
109
|
+
/**
|
|
110
|
+
* Enable input (user) audio transcription (default: true).
|
|
111
|
+
* Emits TranscriptResult events with speaker="customer".
|
|
112
|
+
*/
|
|
113
|
+
inputTranscription?: boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Enable output (assistant) audio transcription (default: true).
|
|
116
|
+
* Emits TranscriptResult events with speaker="agent".
|
|
117
|
+
*/
|
|
118
|
+
outputTranscription?: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* BCP-47 language hint for transcription (default: empty — auto-detect).
|
|
121
|
+
* E.g. "ko-KR", "en-US". Gemini is strong on multilingual inference but
|
|
122
|
+
* a hint improves accuracy for short utterances.
|
|
123
|
+
*/
|
|
124
|
+
language?: string;
|
|
125
|
+
/** Response temperature (default: 0.8). Gemini accepts 0.0–2.0. */
|
|
126
|
+
temperature?: number;
|
|
127
|
+
/** Maximum response output tokens. Default: no cap. */
|
|
128
|
+
maxOutputTokens?: number;
|
|
129
|
+
/** Tools the model can call during the session. */
|
|
130
|
+
tools?: GeminiLiveTool[];
|
|
131
|
+
}
|
|
132
|
+
export declare class GeminiLiveAdapter implements RealtimeSpeechAdapter {
|
|
133
|
+
private readonly opts;
|
|
134
|
+
private readonly tools;
|
|
135
|
+
private audioOutputHandler;
|
|
136
|
+
private transcriptHandler;
|
|
137
|
+
private errorHandler;
|
|
138
|
+
private toolCallHandler;
|
|
139
|
+
private speechActivityHandler;
|
|
140
|
+
private readonly sessions;
|
|
141
|
+
/** Per-session input transcript accumulator (Gemini streams text incrementally) */
|
|
142
|
+
private readonly inputTranscriptBuf;
|
|
143
|
+
/** Per-session output transcript accumulator */
|
|
144
|
+
private readonly outputTranscriptBuf;
|
|
145
|
+
/** Per-session "caller speaking" state (for synthetic onSpeechActivity events) */
|
|
146
|
+
private readonly callerSpeaking;
|
|
147
|
+
private stopped;
|
|
148
|
+
constructor(opts: GeminiLiveAdapterOptions);
|
|
149
|
+
onAudioOutput(handler: (chunk: Buffer, linkedId: string) => void): void;
|
|
150
|
+
onTranscript(handler: (result: TranscriptResult) => void): void;
|
|
151
|
+
onError(handler: (err: Error, linkedId?: string) => void): void;
|
|
152
|
+
onToolCall(handler: (toolCall: RealtimeToolCall) => void): void;
|
|
153
|
+
/**
|
|
154
|
+
* Register a handler for speech activity events.
|
|
155
|
+
*
|
|
156
|
+
* Gemini Live does NOT emit explicit speech_started/stopped events like
|
|
157
|
+
* OpenAI Realtime. This adapter approximates speech activity from the
|
|
158
|
+
* following server signals:
|
|
159
|
+
*
|
|
160
|
+
* - `serverContent.interrupted=true` → caller started speaking while AI was
|
|
161
|
+
* responding (barge-in). Fires `{ side: "caller", speaking: true }`.
|
|
162
|
+
* - `serverContent.turnComplete=true` → turn boundary reached. Fires
|
|
163
|
+
* `{ side: "caller", speaking: false }` if the caller was marked speaking.
|
|
164
|
+
*
|
|
165
|
+
* For precise VAD, set `turnDetection.mode = "none"` and call
|
|
166
|
+
* `sendActivityStart()` / `sendActivityEnd()` manually from your own VAD
|
|
167
|
+
* logic — those methods fire this callback synchronously with the server message.
|
|
168
|
+
*/
|
|
169
|
+
onSpeechActivity(handler: (event: RealtimeSpeechActivityEvent) => void): void;
|
|
170
|
+
/**
|
|
171
|
+
* Submit a tool call result back to the model.
|
|
172
|
+
* Call this after receiving a tool call via onToolCall().
|
|
173
|
+
*/
|
|
174
|
+
submitToolResult(linkedId: string, callId: string, result: unknown): void;
|
|
175
|
+
/**
|
|
176
|
+
* Mark the start of caller speech (manual VAD mode only).
|
|
177
|
+
* Sends a `realtime_input.activity_start` message to Gemini and fires the
|
|
178
|
+
* onSpeechActivity callback. No-op if turnDetection.mode !== "none".
|
|
179
|
+
*/
|
|
180
|
+
sendActivityStart(linkedId: string): void;
|
|
181
|
+
/**
|
|
182
|
+
* Mark the end of caller speech (manual VAD mode only).
|
|
183
|
+
* Sends a `realtime_input.activity_end` message to Gemini and fires the
|
|
184
|
+
* onSpeechActivity callback. No-op if turnDetection.mode !== "none".
|
|
185
|
+
*/
|
|
186
|
+
sendActivityEnd(linkedId: string): void;
|
|
187
|
+
startSession(linkedId: string, audioIn: AsyncIterable<AudioChunk>): Promise<void>;
|
|
188
|
+
stop(linkedId?: string): Promise<void>;
|
|
189
|
+
private resolveModelPath;
|
|
190
|
+
private buildRealtimeInputConfig;
|
|
191
|
+
private connectLive;
|
|
192
|
+
private pipeAudioIn;
|
|
193
|
+
private handleServerMessage;
|
|
194
|
+
private sendMessage;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=gemini-live.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-live.d.ts","sourceRoot":"","sources":["../../src/realtime/gemini-live.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Gemini Live API — Speech-to-Speech Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements a direct speech-to-speech pipeline using Google's Gemini Live API
|
|
5
|
+
* (BidiGenerateContent). This adapter is a drop-in alternative to
|
|
6
|
+
* OpenAIRealtimeAdapter — same RealtimeSpeechAdapter interface, same callbacks,
|
|
7
|
+
* same pipelineType="s2s" dashboard integration.
|
|
8
|
+
*
|
|
9
|
+
* Architecture:
|
|
10
|
+
*
|
|
11
|
+
* DVGateway audio in (16kHz PCM)
|
|
12
|
+
* ↓ (Gemini Live native input rate — no resampling needed)
|
|
13
|
+
* Gemini Live API (WebSocket)
|
|
14
|
+
* ↓ gemini-live-2.5-flash-preview processes speech end-to-end
|
|
15
|
+
* DVGateway audio out (24kHz → 16kHz downsample)
|
|
16
|
+
* ↓
|
|
17
|
+
* TTS injector → call audio
|
|
18
|
+
*
|
|
19
|
+
* Supported endpoints (choose via `endpoint` option):
|
|
20
|
+
* - "ai-studio" (default): AI Studio global endpoint
|
|
21
|
+
* wss://generativelanguage.googleapis.com/ws/.../BidiGenerateContent?key=KEY
|
|
22
|
+
* - "vertex": Vertex AI regional endpoint
|
|
23
|
+
* wss://{LOCATION}-aiplatform.googleapis.com/ws/.../BidiGenerateContent
|
|
24
|
+
* (requires Bearer access token via `accessToken` option)
|
|
25
|
+
*
|
|
26
|
+
* Audio format:
|
|
27
|
+
* Input: PCM16 16kHz mono, base64-encoded, MIME "audio/pcm;rate=16000"
|
|
28
|
+
* Output: PCM16 24kHz mono, base64-encoded (downsampled to 16kHz for DVGateway)
|
|
29
|
+
*
|
|
30
|
+
* Key differences vs OpenAIRealtimeAdapter:
|
|
31
|
+
* - Input rate matches DVGateway natively (no upsample)
|
|
32
|
+
* - Message schema is BidiGenerateContent proto-JSON, not OpenAI events
|
|
33
|
+
* - Server-side VAD signals are implicit — we infer speech activity from
|
|
34
|
+
* `interrupted` / `turnComplete` server messages (best-effort). For precise
|
|
35
|
+
* VAD, set `turnDetection.mode = "none"` and call `sendActivityStart()` /
|
|
36
|
+
* `sendActivityEnd()` manually.
|
|
37
|
+
*
|
|
38
|
+
* API Reference:
|
|
39
|
+
* https://ai.google.dev/gemini-api/docs/live-api
|
|
40
|
+
* https://ai.google.dev/api/live
|
|
41
|
+
*/
|
|
42
|
+
import WebSocket from 'ws';
|
|
43
|
+
import { resample, float32ToSlin16, slin16ToFloat32 } from 'dvgateway-sdk';
|
|
44
|
+
// ─── Implementation ──────────────────────────────────────────────────────────
|
|
45
|
+
const AI_STUDIO_URL = 'wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent';
|
|
46
|
+
const GEMINI_OUTPUT_SAMPLE_RATE = 24000;
|
|
47
|
+
const DV_SAMPLE_RATE = 16000;
|
|
48
|
+
const INPUT_CHUNK_MS = 20;
|
|
49
|
+
const INPUT_SAMPLES_16K = Math.round(DV_SAMPLE_RATE * INPUT_CHUNK_MS / 1000); // 320 samples
|
|
50
|
+
export class GeminiLiveAdapter {
|
|
51
|
+
opts;
|
|
52
|
+
tools;
|
|
53
|
+
audioOutputHandler = null;
|
|
54
|
+
transcriptHandler = null;
|
|
55
|
+
errorHandler = null;
|
|
56
|
+
toolCallHandler = null;
|
|
57
|
+
speechActivityHandler = null;
|
|
58
|
+
sessions = new Map();
|
|
59
|
+
/** Per-session input transcript accumulator (Gemini streams text incrementally) */
|
|
60
|
+
inputTranscriptBuf = new Map();
|
|
61
|
+
/** Per-session output transcript accumulator */
|
|
62
|
+
outputTranscriptBuf = new Map();
|
|
63
|
+
/** Per-session "caller speaking" state (for synthetic onSpeechActivity events) */
|
|
64
|
+
callerSpeaking = new Map();
|
|
65
|
+
stopped = false;
|
|
66
|
+
constructor(opts) {
|
|
67
|
+
const endpoint = opts.endpoint ?? 'ai-studio';
|
|
68
|
+
if (endpoint === 'ai-studio' && !opts.apiKey) {
|
|
69
|
+
throw new Error('GeminiLiveAdapter: apiKey is required when endpoint="ai-studio"');
|
|
70
|
+
}
|
|
71
|
+
if (endpoint === 'vertex' && (!opts.accessToken || !opts.project || !opts.location)) {
|
|
72
|
+
throw new Error('GeminiLiveAdapter: accessToken, project, and location are required when endpoint="vertex"');
|
|
73
|
+
}
|
|
74
|
+
this.opts = {
|
|
75
|
+
endpoint,
|
|
76
|
+
apiKey: opts.apiKey ?? '',
|
|
77
|
+
accessToken: opts.accessToken ?? '',
|
|
78
|
+
project: opts.project ?? '',
|
|
79
|
+
location: opts.location ?? '',
|
|
80
|
+
model: opts.model ?? 'gemini-live-2.5-flash-preview',
|
|
81
|
+
voice: opts.voice ?? 'Puck',
|
|
82
|
+
instructions: opts.instructions ??
|
|
83
|
+
'You are a helpful voice assistant. Keep answers concise and conversational.',
|
|
84
|
+
turnDetection: opts.turnDetection ?? {},
|
|
85
|
+
inputTranscription: opts.inputTranscription ?? true,
|
|
86
|
+
outputTranscription: opts.outputTranscription ?? true,
|
|
87
|
+
language: opts.language ?? '',
|
|
88
|
+
temperature: opts.temperature ?? 0.8,
|
|
89
|
+
maxOutputTokens: opts.maxOutputTokens ?? null,
|
|
90
|
+
};
|
|
91
|
+
this.tools = opts.tools ?? [];
|
|
92
|
+
}
|
|
93
|
+
onAudioOutput(handler) {
|
|
94
|
+
this.audioOutputHandler = handler;
|
|
95
|
+
}
|
|
96
|
+
onTranscript(handler) {
|
|
97
|
+
this.transcriptHandler = handler;
|
|
98
|
+
}
|
|
99
|
+
onError(handler) {
|
|
100
|
+
this.errorHandler = handler;
|
|
101
|
+
}
|
|
102
|
+
onToolCall(handler) {
|
|
103
|
+
this.toolCallHandler = handler;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Register a handler for speech activity events.
|
|
107
|
+
*
|
|
108
|
+
* Gemini Live does NOT emit explicit speech_started/stopped events like
|
|
109
|
+
* OpenAI Realtime. This adapter approximates speech activity from the
|
|
110
|
+
* following server signals:
|
|
111
|
+
*
|
|
112
|
+
* - `serverContent.interrupted=true` → caller started speaking while AI was
|
|
113
|
+
* responding (barge-in). Fires `{ side: "caller", speaking: true }`.
|
|
114
|
+
* - `serverContent.turnComplete=true` → turn boundary reached. Fires
|
|
115
|
+
* `{ side: "caller", speaking: false }` if the caller was marked speaking.
|
|
116
|
+
*
|
|
117
|
+
* For precise VAD, set `turnDetection.mode = "none"` and call
|
|
118
|
+
* `sendActivityStart()` / `sendActivityEnd()` manually from your own VAD
|
|
119
|
+
* logic — those methods fire this callback synchronously with the server message.
|
|
120
|
+
*/
|
|
121
|
+
onSpeechActivity(handler) {
|
|
122
|
+
this.speechActivityHandler = handler;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Submit a tool call result back to the model.
|
|
126
|
+
* Call this after receiving a tool call via onToolCall().
|
|
127
|
+
*/
|
|
128
|
+
submitToolResult(linkedId, callId, result) {
|
|
129
|
+
const ws = this.sessions.get(linkedId);
|
|
130
|
+
if (!ws || ws.readyState !== WebSocket.OPEN)
|
|
131
|
+
return;
|
|
132
|
+
// Gemini tool_response schema: functionResponses[].response is a struct
|
|
133
|
+
const response = typeof result === 'object' && result !== null
|
|
134
|
+
? result
|
|
135
|
+
: { result };
|
|
136
|
+
this.sendMessage(ws, {
|
|
137
|
+
tool_response: {
|
|
138
|
+
function_responses: [{ id: callId, name: '', response }],
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Mark the start of caller speech (manual VAD mode only).
|
|
144
|
+
* Sends a `realtime_input.activity_start` message to Gemini and fires the
|
|
145
|
+
* onSpeechActivity callback. No-op if turnDetection.mode !== "none".
|
|
146
|
+
*/
|
|
147
|
+
sendActivityStart(linkedId) {
|
|
148
|
+
const ws = this.sessions.get(linkedId);
|
|
149
|
+
if (!ws || ws.readyState !== WebSocket.OPEN)
|
|
150
|
+
return;
|
|
151
|
+
if (this.opts.turnDetection.mode !== 'none')
|
|
152
|
+
return;
|
|
153
|
+
this.sendMessage(ws, { realtime_input: { activity_start: {} } });
|
|
154
|
+
this.callerSpeaking.set(linkedId, true);
|
|
155
|
+
this.speechActivityHandler?.({
|
|
156
|
+
linkedId,
|
|
157
|
+
side: 'caller',
|
|
158
|
+
speaking: true,
|
|
159
|
+
timestampMs: Date.now(),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Mark the end of caller speech (manual VAD mode only).
|
|
164
|
+
* Sends a `realtime_input.activity_end` message to Gemini and fires the
|
|
165
|
+
* onSpeechActivity callback. No-op if turnDetection.mode !== "none".
|
|
166
|
+
*/
|
|
167
|
+
sendActivityEnd(linkedId) {
|
|
168
|
+
const ws = this.sessions.get(linkedId);
|
|
169
|
+
if (!ws || ws.readyState !== WebSocket.OPEN)
|
|
170
|
+
return;
|
|
171
|
+
if (this.opts.turnDetection.mode !== 'none')
|
|
172
|
+
return;
|
|
173
|
+
this.sendMessage(ws, { realtime_input: { activity_end: {} } });
|
|
174
|
+
this.callerSpeaking.set(linkedId, false);
|
|
175
|
+
this.speechActivityHandler?.({
|
|
176
|
+
linkedId,
|
|
177
|
+
side: 'caller',
|
|
178
|
+
speaking: false,
|
|
179
|
+
timestampMs: Date.now(),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
async startSession(linkedId, audioIn) {
|
|
183
|
+
this.stopped = false;
|
|
184
|
+
const ws = await this.connectLive(linkedId);
|
|
185
|
+
this.sessions.set(linkedId, ws);
|
|
186
|
+
this.inputTranscriptBuf.set(linkedId, '');
|
|
187
|
+
this.outputTranscriptBuf.set(linkedId, '');
|
|
188
|
+
this.callerSpeaking.set(linkedId, false);
|
|
189
|
+
// ── Send initial setup message ──
|
|
190
|
+
const setupMsg = {
|
|
191
|
+
setup: {
|
|
192
|
+
model: this.resolveModelPath(),
|
|
193
|
+
generation_config: {
|
|
194
|
+
response_modalities: ['AUDIO'],
|
|
195
|
+
speech_config: {
|
|
196
|
+
voice_config: {
|
|
197
|
+
prebuilt_voice_config: { voice_name: this.opts.voice },
|
|
198
|
+
},
|
|
199
|
+
...(this.opts.language && { language_code: this.opts.language }),
|
|
200
|
+
},
|
|
201
|
+
temperature: this.opts.temperature,
|
|
202
|
+
...(this.opts.maxOutputTokens !== null && {
|
|
203
|
+
max_output_tokens: this.opts.maxOutputTokens,
|
|
204
|
+
}),
|
|
205
|
+
},
|
|
206
|
+
system_instruction: {
|
|
207
|
+
parts: [{ text: this.opts.instructions }],
|
|
208
|
+
},
|
|
209
|
+
realtime_input_config: this.buildRealtimeInputConfig(),
|
|
210
|
+
...(this.opts.inputTranscription && { input_audio_transcription: {} }),
|
|
211
|
+
...(this.opts.outputTranscription && { output_audio_transcription: {} }),
|
|
212
|
+
...(this.tools.length > 0 && {
|
|
213
|
+
tools: [
|
|
214
|
+
{
|
|
215
|
+
function_declarations: this.tools.map((t) => ({
|
|
216
|
+
name: t.name,
|
|
217
|
+
description: t.description,
|
|
218
|
+
...(t.parameters && { parameters: t.parameters }),
|
|
219
|
+
})),
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
}),
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
this.sendMessage(ws, setupMsg);
|
|
226
|
+
// Pipe audio in background
|
|
227
|
+
void this.pipeAudioIn(linkedId, ws, audioIn);
|
|
228
|
+
// Wait until WS closes or stop() is called
|
|
229
|
+
await new Promise((resolve) => {
|
|
230
|
+
ws.once('close', resolve);
|
|
231
|
+
const check = setInterval(() => {
|
|
232
|
+
if (this.stopped || !this.sessions.has(linkedId)) {
|
|
233
|
+
clearInterval(check);
|
|
234
|
+
resolve();
|
|
235
|
+
}
|
|
236
|
+
}, 100);
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
async stop(linkedId) {
|
|
240
|
+
if (linkedId) {
|
|
241
|
+
const ws = this.sessions.get(linkedId);
|
|
242
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
243
|
+
ws.close(1000, 'session ended');
|
|
244
|
+
}
|
|
245
|
+
this.sessions.delete(linkedId);
|
|
246
|
+
this.inputTranscriptBuf.delete(linkedId);
|
|
247
|
+
this.outputTranscriptBuf.delete(linkedId);
|
|
248
|
+
this.callerSpeaking.delete(linkedId);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
this.stopped = true;
|
|
252
|
+
for (const [id, ws] of this.sessions) {
|
|
253
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
254
|
+
ws.close(1000, 'adapter stopped');
|
|
255
|
+
}
|
|
256
|
+
this.sessions.delete(id);
|
|
257
|
+
this.inputTranscriptBuf.delete(id);
|
|
258
|
+
this.outputTranscriptBuf.delete(id);
|
|
259
|
+
this.callerSpeaking.delete(id);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// ── Private helpers ─────────────────────────────────────────────────────
|
|
264
|
+
resolveModelPath() {
|
|
265
|
+
if (this.opts.endpoint === 'vertex') {
|
|
266
|
+
return `projects/${this.opts.project}/locations/${this.opts.location}/publishers/google/models/${this.opts.model}`;
|
|
267
|
+
}
|
|
268
|
+
// AI Studio expects "models/MODEL_ID"
|
|
269
|
+
return `models/${this.opts.model}`;
|
|
270
|
+
}
|
|
271
|
+
buildRealtimeInputConfig() {
|
|
272
|
+
const td = this.opts.turnDetection;
|
|
273
|
+
if (td.mode === 'none') {
|
|
274
|
+
return {
|
|
275
|
+
automatic_activity_detection: { disabled: true },
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
const cfg = { automatic_activity_detection: { disabled: false } };
|
|
279
|
+
const vad = {};
|
|
280
|
+
if (td.startSensitivity)
|
|
281
|
+
vad.start_of_speech_sensitivity = `START_SENSITIVITY_${td.startSensitivity}`;
|
|
282
|
+
if (td.endSensitivity)
|
|
283
|
+
vad.end_of_speech_sensitivity = `END_SENSITIVITY_${td.endSensitivity}`;
|
|
284
|
+
if (td.prefixPaddingMs != null)
|
|
285
|
+
vad.prefix_padding_ms = td.prefixPaddingMs;
|
|
286
|
+
if (td.silenceDurationMs != null)
|
|
287
|
+
vad.silence_duration_ms = td.silenceDurationMs;
|
|
288
|
+
if (Object.keys(vad).length > 0) {
|
|
289
|
+
cfg.automatic_activity_detection = { disabled: false, ...vad };
|
|
290
|
+
}
|
|
291
|
+
return cfg;
|
|
292
|
+
}
|
|
293
|
+
async connectLive(linkedId) {
|
|
294
|
+
let url;
|
|
295
|
+
const headers = {};
|
|
296
|
+
if (this.opts.endpoint === 'vertex') {
|
|
297
|
+
url = `wss://${this.opts.location}-aiplatform.googleapis.com/ws/google.cloud.aiplatform.v1.LlmBidiService/BidiGenerateContent`;
|
|
298
|
+
headers['Authorization'] = `Bearer ${this.opts.accessToken}`;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
url = `${AI_STUDIO_URL}?key=${encodeURIComponent(this.opts.apiKey)}`;
|
|
302
|
+
}
|
|
303
|
+
const ws = new WebSocket(url, { headers });
|
|
304
|
+
ws.on('message', (data) => {
|
|
305
|
+
try {
|
|
306
|
+
const msg = JSON.parse(data.toString());
|
|
307
|
+
this.handleServerMessage(msg, linkedId);
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
// Ignore malformed JSON
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
ws.on('error', (err) => {
|
|
314
|
+
this.errorHandler?.(err, linkedId);
|
|
315
|
+
});
|
|
316
|
+
ws.on('close', () => {
|
|
317
|
+
this.sessions.delete(linkedId);
|
|
318
|
+
});
|
|
319
|
+
await new Promise((resolve, reject) => {
|
|
320
|
+
ws.once('open', resolve);
|
|
321
|
+
ws.once('error', reject);
|
|
322
|
+
});
|
|
323
|
+
return ws;
|
|
324
|
+
}
|
|
325
|
+
async pipeAudioIn(linkedId, ws, audioIn) {
|
|
326
|
+
for await (const chunk of audioIn) {
|
|
327
|
+
if (this.stopped || ws.readyState !== WebSocket.OPEN)
|
|
328
|
+
break;
|
|
329
|
+
// DVGateway is 16kHz; Gemini Live input is 16kHz → no resampling needed.
|
|
330
|
+
// (Keep the resample call guarded for forward compatibility if DV changes.)
|
|
331
|
+
const samples16k = chunk.sampleRate === DV_SAMPLE_RATE
|
|
332
|
+
? chunk.samples
|
|
333
|
+
: resample(chunk.samples, chunk.sampleRate, DV_SAMPLE_RATE);
|
|
334
|
+
// Split into 20ms frames and send
|
|
335
|
+
let offset = 0;
|
|
336
|
+
while (offset < samples16k.length) {
|
|
337
|
+
const end = Math.min(offset + INPUT_SAMPLES_16K, samples16k.length);
|
|
338
|
+
const frame = samples16k.subarray(offset, end);
|
|
339
|
+
offset = end;
|
|
340
|
+
const pcm16 = float32ToSlin16(frame);
|
|
341
|
+
const b64 = Buffer.from(pcm16.buffer, pcm16.byteOffset, pcm16.byteLength).toString('base64');
|
|
342
|
+
this.sendMessage(ws, {
|
|
343
|
+
realtime_input: {
|
|
344
|
+
media_chunks: [
|
|
345
|
+
{ mime_type: 'audio/pcm;rate=16000', data: b64 },
|
|
346
|
+
],
|
|
347
|
+
},
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
handleServerMessage(msg, linkedId) {
|
|
353
|
+
// ── setupComplete: ready to stream audio ──
|
|
354
|
+
if (msg.setupComplete) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
// ── serverContent: main response channel ──
|
|
358
|
+
if (msg.serverContent) {
|
|
359
|
+
const sc = msg.serverContent;
|
|
360
|
+
// Audio output (modelTurn.parts[].inlineData)
|
|
361
|
+
if (sc.modelTurn?.parts) {
|
|
362
|
+
for (const part of sc.modelTurn.parts) {
|
|
363
|
+
if (part.inlineData?.data) {
|
|
364
|
+
// Gemini outputs PCM16 at 24kHz — downsample to DVGateway's 16kHz
|
|
365
|
+
const pcm24kBuf = Buffer.from(part.inlineData.data, 'base64');
|
|
366
|
+
const samples24k = slin16ToFloat32(pcm24kBuf);
|
|
367
|
+
const samples16k = resample(samples24k, GEMINI_OUTPUT_SAMPLE_RATE, DV_SAMPLE_RATE);
|
|
368
|
+
const pcm16k = float32ToSlin16(samples16k);
|
|
369
|
+
this.audioOutputHandler?.(Buffer.from(pcm16k.buffer, pcm16k.byteOffset, pcm16k.byteLength), linkedId);
|
|
370
|
+
}
|
|
371
|
+
// Text parts are ignored in audio-only mode (still present for tool-call context)
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Interruption: caller barge-in detected by server-side VAD
|
|
375
|
+
if (sc.interrupted === true) {
|
|
376
|
+
if (!this.callerSpeaking.get(linkedId)) {
|
|
377
|
+
this.callerSpeaking.set(linkedId, true);
|
|
378
|
+
this.speechActivityHandler?.({
|
|
379
|
+
linkedId,
|
|
380
|
+
side: 'caller',
|
|
381
|
+
speaking: true,
|
|
382
|
+
timestampMs: Date.now(),
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
// Turn complete: AI finished generating → if caller was marked speaking, clear it
|
|
387
|
+
if (sc.turnComplete === true || sc.generationComplete === true) {
|
|
388
|
+
if (this.callerSpeaking.get(linkedId)) {
|
|
389
|
+
this.callerSpeaking.set(linkedId, false);
|
|
390
|
+
this.speechActivityHandler?.({
|
|
391
|
+
linkedId,
|
|
392
|
+
side: 'caller',
|
|
393
|
+
speaking: false,
|
|
394
|
+
timestampMs: Date.now(),
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
// Input transcription (caller speech → text, streamed incrementally)
|
|
399
|
+
if (sc.inputTranscription?.text != null) {
|
|
400
|
+
const prev = this.inputTranscriptBuf.get(linkedId) ?? '';
|
|
401
|
+
const next = prev + sc.inputTranscription.text;
|
|
402
|
+
this.inputTranscriptBuf.set(linkedId, next);
|
|
403
|
+
// Emit as finalized on turnComplete (below); for now just accumulate
|
|
404
|
+
}
|
|
405
|
+
// Output transcription (assistant speech → text, streamed incrementally)
|
|
406
|
+
if (sc.outputTranscription?.text != null) {
|
|
407
|
+
const prev = this.outputTranscriptBuf.get(linkedId) ?? '';
|
|
408
|
+
const next = prev + sc.outputTranscription.text;
|
|
409
|
+
this.outputTranscriptBuf.set(linkedId, next);
|
|
410
|
+
}
|
|
411
|
+
// On turn completion, flush accumulated transcripts as final results
|
|
412
|
+
if (sc.turnComplete === true) {
|
|
413
|
+
const inputText = this.inputTranscriptBuf.get(linkedId) ?? '';
|
|
414
|
+
if (inputText.trim()) {
|
|
415
|
+
this.transcriptHandler?.({
|
|
416
|
+
linkedId,
|
|
417
|
+
text: inputText,
|
|
418
|
+
isFinal: true,
|
|
419
|
+
speaker: 'customer',
|
|
420
|
+
timestampMs: Date.now(),
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
const outputText = this.outputTranscriptBuf.get(linkedId) ?? '';
|
|
424
|
+
if (outputText.trim()) {
|
|
425
|
+
this.transcriptHandler?.({
|
|
426
|
+
linkedId,
|
|
427
|
+
text: outputText,
|
|
428
|
+
isFinal: true,
|
|
429
|
+
speaker: 'agent',
|
|
430
|
+
timestampMs: Date.now(),
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
this.inputTranscriptBuf.set(linkedId, '');
|
|
434
|
+
this.outputTranscriptBuf.set(linkedId, '');
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// ── toolCall: model wants to invoke a function ──
|
|
438
|
+
if (msg.toolCall?.functionCalls) {
|
|
439
|
+
for (const fc of msg.toolCall.functionCalls) {
|
|
440
|
+
if (fc.name) {
|
|
441
|
+
this.toolCallHandler?.({
|
|
442
|
+
callId: fc.id ?? '',
|
|
443
|
+
name: fc.name,
|
|
444
|
+
args: fc.args ?? {},
|
|
445
|
+
linkedId,
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
// ── goAway: session will close soon (quota / deployment boundary) ──
|
|
451
|
+
if (msg.goAway) {
|
|
452
|
+
this.errorHandler?.(new Error(`Gemini Live goAway: session closing in ${msg.goAway.timeLeft ?? 'unknown'}`), linkedId);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
sendMessage(ws, obj) {
|
|
456
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
457
|
+
ws.send(JSON.stringify(obj));
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
//# sourceMappingURL=gemini-live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-live.js","sourceRoot":"","sources":["../../src/realtime/gemini-live.ts"],"names":[],"mappings":"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"}
|
package/dist/realtime/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { OpenAIRealtimeAdapter } from './openai-realtime.js';
|
|
2
2
|
export type { OpenAIRealtimeAdapterOptions, OpenAIRealtimeVoice, OpenAIRealtimeTurnDetectionMode, OpenAIRealtimeTurnDetectionOptions, OpenAIRealtimeTool, RealtimeToolCall, RealtimeSpeechActivityEvent, RealtimeSpeechAdapter, } from './openai-realtime.js';
|
|
3
|
+
export { GeminiLiveAdapter } from './gemini-live.js';
|
|
4
|
+
export type { GeminiLiveAdapterOptions, GeminiLiveVoice, GeminiLiveModel, GeminiLiveEndpoint, GeminiLiveTurnDetectionMode, GeminiLiveTurnDetectionOptions, GeminiLiveTool, } from './gemini-live.js';
|
|
3
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EACV,4BAA4B,EAC5B,mBAAmB,EACnB,+BAA+B,EAC/B,kCAAkC,EAClC,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EACV,4BAA4B,EAC5B,mBAAmB,EACnB,+BAA+B,EAC/B,kCAAkC,EAClC,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EACV,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,2BAA2B,EAC3B,8BAA8B,EAC9B,cAAc,GACf,MAAM,kBAAkB,CAAC"}
|
package/dist/realtime/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAY7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/package.json
CHANGED