vsip-sdk
v0.1.0
Published
Official JavaScript/TypeScript SDK for the VSIP Voice Events API — real-time turn detection, identity-gated barge-in, and speaker verification for voice agents.
Maintainers
Readme
vsip-sdk
JavaScript / TypeScript SDK for the VSIP Voice Events API — real-time turn detection, identity-gated barge-in, and speaker verification. Runs in the browser and Node 18+.
npm install vsip-sdkBrowser quickstart
import { VSIPClient, VoiceSession, type Turn } from "vsip-sdk";
const client = new VSIPClient({
apiKey: "vsip_...", // browser: sent as ?token= (proxy in prod)
url: "wss://api.vsip.io/v1/stream",
});
const session = new VoiceSession(client, {
onTurn: async (turn: Turn) => {
if (!turn.shouldRespond) return; // verified: not your enrolled user
const text = await myStt(turn.audio); // Int16Array PCM
const reply = await myLlm(text);
await session.speakGate(); // don't talk over a turn
client.agentSpeaking();
await myTtsPlay(reply); // stop this in onBargeIn
client.agentIdle();
},
onBargeIn: () => myTtsStop(),
});
await client.connect();
session.start();
// Feed 16kHz mono Int16 PCM frames from the Web Audio API:
scriptProcessor.onaudioprocess = (e) => {
const f32 = e.inputBuffer.getChannelData(0);
const i16 = new Int16Array(f32.length);
for (let i = 0; i < f32.length; i++) i16[i] = Math.max(-1, Math.min(1, f32[i])) * 0x7fff;
session.sendAudio(i16);
};What VoiceSession handles for you
Same field-learned patterns as the Python SDK: onset-lookback turn slicing
(1.0s / 1.5s for barge-ins), pre-lock fast path + post-lock
speaker_verification gating (turns held until the verdict, so an impostor
is never answered), speakGate(), queued turn dispatch, and a capped idle
buffer. Gate your agent on turn.shouldRespond.
VSIPClient alone gives you the typed event stream (client.on(handler)),
control commands (agentSpeaking/agentIdle, setBargeInMode, toggleLock,
reset), and transparent reconnect + resume.
Node usage
Node 22 has a global WebSocket. On Node 18–20, pass one:
import WebSocket from "ws";
const client = new VSIPClient({ apiKey, url, webSocketImpl: WebSocket as never });Types & compatibility
Fully typed (discriminated VSIPEvent union). Unknown event types and fields
parse without error, so this SDK survives additive protocol growth.
