@shvm/vani-client 0.0.2
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/README.md +196 -0
- package/dist/headless/index.d.ts +205 -0
- package/dist/headless/index.js +624 -0
- package/dist/headless/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +651 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/index.d.ts +49 -0
- package/dist/shared/index.js +30 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/ui/index.d.ts +39 -0
- package/dist/ui/index.js +559 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/voice-BwU4C7fN.d.ts +51 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants/models.ts","../src/headless/adapters/blobUrl.ts","../src/headless/machine/clientMachine.ts","../src/headless/utils/webSocketUrl.ts","../src/headless/hooks/useVoiceSession.ts"],"names":["sessionId"],"mappings":"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","file":"index.js","sourcesContent":["export const STT_MODELS = [\"@cf/openai/whisper\", \"@cf/openai/whisper-tiny-en\"] as const;\nexport type STTModelId = (typeof STT_MODELS)[number];\n\nexport const LLM_MODELS = [\n \"@cf/meta/llama-3.1-8b-instruct\",\n \"@cf/meta/llama-3-8b-instruct\",\n \"@cf/meta/llama-2-7b-chat-int8\",\n \"@cf/mistral/mistral-7b-instruct-v0.1\",\n] as const;\nexport type LLMModelId = (typeof LLM_MODELS)[number];\n\nexport const TTS_MODELS = [\"@cf/deepgram/aura-2-en\", \"@cf/deepgram/aura-1\"] as const;\nexport type TTSModelId = (typeof TTS_MODELS)[number];\n\nexport const TTS_MODEL_VOICES = {\n \"@cf/deepgram/aura-2-en\": [\"asteria\", \"luna\", \"arcas\", \"athena\", \"helios\", \"orpheus\", \"perseus\", \"angus\"],\n \"@cf/deepgram/aura-1\": [\n \"asteria\",\n \"luna\",\n \"stella\",\n \"athena\",\n \"hera\",\n \"orion\",\n \"arcas\",\n \"perseus\",\n \"angus\",\n \"orpheus\",\n \"helios\",\n \"zeus\",\n ],\n} as const satisfies Record<TTSModelId, readonly string[]>;\n\nexport type TtsVoiceForModel<T extends TTSModelId> = (typeof TTS_MODEL_VOICES)[T][number];\nexport type TtsVoiceId = (typeof TTS_MODEL_VOICES)[TTSModelId][number];\n\n","export function createBlobUrl(blob: Blob): string | undefined {\n try {\n if (typeof URL === \"undefined\") return undefined;\n if (typeof URL.createObjectURL !== \"function\") return undefined;\n return URL.createObjectURL(blob);\n } catch {\n return undefined;\n }\n}\n\n","import { assign, fromCallback, setup } from \"xstate\";\nimport { createBlobUrl } from \"../adapters/blobUrl\";\nimport type { ClientMessage, SessionStatus, VoiceStatus } from \"../../shared/types/voice\";\n\nexport const socketActor = fromCallback(() => {\n return () => { };\n});\n\nexport const audioActor = fromCallback(() => {\n return () => { };\n});\n\nexport interface DebugEvent {\n id: string;\n type: \"state_change\" | \"socket_event\" | \"audio_input\" | \"audio_output\" | \"transcript\" | \"llm_token\" | \"error\";\n timestamp: number;\n details: unknown;\n blobUrl?: string;\n}\n\nexport interface ClientContext {\n status: VoiceStatus;\n serverStatus: SessionStatus;\n transcript: ClientMessage[];\n history: DebugEvent[];\n error: string | null;\n isPlaying: boolean;\n}\n\n// --- Events ---\n\nexport type ClientEvent =\n | { type: \"CONNECT\" }\n | { type: \"DISCONNECT\" }\n | { type: \"CONNECTED\" }\n | { type: \"SET_ERROR\"; error: string }\n | { type: \"SERVER_STATE_CHANGE\"; status: SessionStatus }\n | { type: \"START_LISTENING\" }\n | { type: \"STOP_LISTENING\" }\n | { type: \"ADD_MESSAGE\"; role: ClientMessage[\"role\"]; content: string }\n | { type: \"AUDIO_PLAYBACK_START\" }\n | { type: \"AUDIO_PLAYBACK_END\" }\n | { type: \"LOG_EVENT\"; eventType: DebugEvent[\"type\"]; details: unknown; blob?: Blob }\n | { type: \"TIMEOUT\" }\n | { type: \"CANCEL\" }\n | { type: \"TOOL_CALL_START\"; toolName: string }\n | { type: \"TOOL_CALL_END\"; toolName: string };\n\n\n// --- Machine ---\n\nexport const clientMachine = setup({\n types: {\n context: {} as ClientContext,\n events: {} as ClientEvent,\n },\n actions: {\n setStatusConfig: assign({\n status: () => \"connecting\",\n }),\n setConnected: assign({\n status: () => \"idle\",\n history: ({ context }) => [\n ...context.history,\n {\n id: Math.random().toString(36).slice(2),\n type: \"socket_event\" as const,\n timestamp: Date.now(),\n details: { status: \"connected\" },\n },\n ],\n }),\n setDisconnected: assign({\n status: () => \"disconnected\",\n history: ({ context }) => [\n ...context.history,\n {\n id: Math.random().toString(36).slice(2),\n type: \"socket_event\" as const,\n timestamp: Date.now(),\n details: { status: \"disconnected\" },\n },\n ],\n }),\n setError: assign({\n status: () => \"error\",\n error: ({ event }) => (event.type === \"SET_ERROR\" ? event.error : null),\n history: ({ context, event }) => [\n ...context.history,\n {\n id: Math.random().toString(36).slice(2),\n type: \"error\" as const,\n timestamp: Date.now(),\n details: { message: event.type === \"SET_ERROR\" ? event.error : \"Unknown error\" },\n },\n ],\n }),\n updateServerStatus: assign({\n serverStatus: ({ context, event }) => (event.type === \"SERVER_STATE_CHANGE\" ? event.status : context.serverStatus),\n history: ({ context, event }) => {\n if (event.type !== \"SERVER_STATE_CHANGE\") return context.history;\n return [\n ...context.history,\n {\n id: Math.random().toString(36).slice(2),\n type: \"state_change\" as const,\n timestamp: Date.now(),\n details: { from: context.serverStatus, to: event.status, source: \"server\" },\n },\n ];\n },\n }),\n setPlaying: assign({\n isPlaying: ({ event }) => event.type === \"AUDIO_PLAYBACK_START\",\n }),\n addMessage: assign({\n transcript: ({ context, event }) => {\n if (event.type !== \"ADD_MESSAGE\") return context.transcript;\n return [\n ...context.transcript,\n {\n id: Math.random().toString(36).slice(2),\n role: event.role,\n content: event.content,\n timestamp: Date.now(),\n },\n ];\n },\n history: ({ context, event }) => {\n if (event.type !== \"ADD_MESSAGE\") return context.history;\n return [\n ...context.history,\n {\n id: Math.random().toString(36).slice(2),\n type: \"transcript\" as const,\n timestamp: Date.now(),\n details: { role: event.role, text: event.content },\n },\n ];\n },\n }),\n logEvent: assign({\n history: ({ context, event }) => {\n if (event.type !== \"LOG_EVENT\") return context.history;\n return [\n ...context.history,\n {\n id: Math.random().toString(36).slice(2),\n type: event.eventType,\n timestamp: Date.now(),\n details: event.details,\n blobUrl: event.blob ? createBlobUrl(event.blob) : undefined,\n },\n ];\n },\n }),\n addToolCallStart: assign({\n transcript: ({ context, event }) => {\n if (event.type !== \"TOOL_CALL_START\") return context.transcript;\n const newTranscript = [...context.transcript];\n if (newTranscript.length === 0 || newTranscript[newTranscript.length - 1].role !== \"assistant\") {\n newTranscript.push({\n id: Math.random().toString(36).slice(2),\n role: \"assistant\",\n content: \"\",\n timestamp: Date.now(),\n toolCalls: []\n });\n }\n\n const lastMsg = newTranscript[newTranscript.length - 1];\n lastMsg.toolCalls = lastMsg.toolCalls || [];\n lastMsg.toolCalls.push({ name: event.toolName, status: \"calling\" });\n return newTranscript;\n }\n }),\n addToolCallEnd: assign({\n transcript: ({ context, event }) => {\n if (event.type !== \"TOOL_CALL_END\") return context.transcript;\n const newTranscript = [...context.transcript];\n if (newTranscript.length > 0) {\n const lastMsg = newTranscript[newTranscript.length - 1];\n if (lastMsg.role === \"assistant\" && lastMsg.toolCalls) {\n const activeTool = lastMsg.toolCalls.slice().reverse().find((t: any) => t.name === event.toolName && t.status === 'calling');\n if (activeTool) activeTool.status = 'finished';\n }\n }\n return newTranscript;\n }\n }),\n clearError: assign({\n error: null,\n }),\n },\n guards: {\n isServerThinkingOrSpeaking: ({ context, event }) => {\n const status = event.type === \"SERVER_STATE_CHANGE\" ? event.status : context.serverStatus;\n return status === \"thinking\" || status === \"speaking\";\n },\n },\n}).createMachine({\n id: \"client\",\n initial: \"disconnected\",\n context: {\n status: \"disconnected\",\n serverStatus: \"idle\",\n transcript: [],\n history: [],\n error: null,\n isPlaying: false,\n },\n on: {\n LOG_EVENT: { actions: \"logEvent\" },\n ADD_MESSAGE: { actions: [\"addMessage\", \"clearError\"] },\n TOOL_CALL_START: { actions: \"addToolCallStart\" },\n TOOL_CALL_END: { actions: \"addToolCallEnd\" },\n SET_ERROR: { target: \".error\", actions: \"setError\" },\n DISCONNECT: { target: \".disconnected\", actions: \"setDisconnected\" },\n },\n states: {\n disconnected: {\n on: {\n CONNECT: { target: \"connecting\", actions: \"setStatusConfig\" },\n },\n },\n connecting: {\n on: {\n CONNECTED: { target: \"connected\", actions: \"setConnected\" },\n },\n },\n connected: {\n initial: \"idle\",\n states: {\n idle: {\n entry: assign({ status: \"idle\" }),\n on: {\n START_LISTENING: { target: \"#client.listening\", actions: \"clearError\" },\n AUDIO_PLAYBACK_START: { target: \"#client.speaking\", actions: \"setPlaying\" },\n SERVER_STATE_CHANGE: [\n {\n guard: \"isServerThinkingOrSpeaking\",\n target: \"processing\",\n actions: \"updateServerStatus\",\n },\n {\n actions: \"updateServerStatus\",\n },\n ],\n },\n },\n processing: {\n entry: assign({ status: \"processing\" }),\n after: {\n 20000: { target: \"idle\", actions: assign({ error: \"Server timed out. Interactions will reset.\" }) },\n },\n on: {\n CANCEL: { target: \"idle\", actions: \"clearError\" },\n START_LISTENING: { target: \"#client.listening\", actions: \"clearError\" },\n AUDIO_PLAYBACK_START: { target: \"#client.speaking\", actions: \"setPlaying\" },\n SERVER_STATE_CHANGE: [\n {\n guard: ({ event }) => event.status === \"listening\" || event.status === \"idle\",\n target: \"idle\",\n actions: \"updateServerStatus\",\n },\n {\n actions: \"updateServerStatus\",\n },\n ],\n },\n },\n },\n },\n listening: {\n entry: assign({ status: \"listening\" }),\n on: {\n STOP_LISTENING: { target: \"connected.processing\" },\n SERVER_STATE_CHANGE: { actions: \"updateServerStatus\" },\n },\n },\n speaking: {\n entry: assign({ status: \"speaking\" }),\n on: {\n AUDIO_PLAYBACK_END: {\n target: \"connected.idle\",\n actions: assign({ isPlaying: false }),\n },\n SERVER_STATE_CHANGE: { actions: \"updateServerStatus\" },\n },\n },\n error: {\n on: {\n CONNECT: { target: \"connecting\", actions: \"setStatusConfig\" },\n START_LISTENING: { target: \"listening\", actions: \"clearError\" },\n },\n },\n },\n});\n","export const DEFAULT_VOICE_SERVER_URL = \"https://shvm.in\";\n\nexport function buildVoiceWebSocketUrl({\n sessionId,\n serverUrl,\n wsPath,\n getWebSocketUrlOverride,\n}: {\n sessionId: string;\n serverUrl?: string;\n wsPath?: (sessionId: string) => string;\n getWebSocketUrlOverride?: (sessionId: string) => string;\n}) {\n if (getWebSocketUrlOverride) return getWebSocketUrlOverride(sessionId);\n\n const wsPathValue = wsPath ? wsPath(sessionId) : `/ws/${sessionId}`;\n const base = new URL(serverUrl ?? DEFAULT_VOICE_SERVER_URL);\n const protocol =\n base.protocol === \"https:\" ? \"wss:\" : base.protocol === \"http:\" ? \"ws:\" : base.protocol;\n base.protocol = protocol;\n return new URL(wsPathValue, base).toString();\n}\n\n","import { useEffect, useRef, useCallback } from 'react';\nimport { useMicVAD } from '@ricky0123/vad-react';\nimport * as ort from 'onnxruntime-web';\nimport { useActor } from '@xstate/react';\nimport { clientMachine, type ClientContext, type DebugEvent } from '../machine/clientMachine';\nimport type { ClientMessage, VoiceConfig, VoiceStatus } from '../../shared/types/voice';\nimport type { ServerToClientJson } from '../../shared/contracts/ws';\nimport { buildVoiceWebSocketUrl } from '../utils/webSocketUrl';\nexport type { VoiceStatus, ClientMessage as Message, DebugEvent, VoiceConfig };\n\n// --- Constants ---\nconst ONNX_WASM_BASE_PATH = 'https://cdn.jsdelivr.net/npm/onnxruntime-web@1.22.0/dist/';\nconst VAD_BASE_ASSET_PATH = 'https://cdn.jsdelivr.net/npm/@ricky0123/vad-web@0.0.29/dist/';\nconst VAD_MODEL_URL = 'https://cdn.jsdelivr.net/npm/@ricky0123/vad-web@0.0.29/dist/silero_vad_v5.onnx';\n\n// Set WASM paths for ONNX Runtime\nlet ortConfigured = false;\nfunction ensureOrtConfig() {\n if (ortConfigured) return;\n if (typeof window !== 'undefined') {\n ort.env.wasm.wasmPaths = ONNX_WASM_BASE_PATH;\n // Disable proxy to avoid dynamic import of worker scripts which Vite tries to optimize\n ort.env.wasm.proxy = false;\n // Avoid SIMD if it's causing issues, though usually SIMD is better\n // ort.env.wasm.simd = false; \n }\n ortConfigured = true;\n}\n\n// --- Types ---\n// Re-export types from machine if needed, or use them directly in UI\n\n\n\n\n// --- Hook ---\n\nexport interface UseVoiceSessionProps {\n onError?: (error: string) => void;\n onMessage?: (msg: { role: 'user' | 'assistant'; content: string }) => void;\n onFeedback?: (message: string) => void;\n initialTranscript?: ClientMessage[];\n config?: VoiceConfig;\n /**\n * Base server URL used to construct the websocket URL.\n * Examples:\n * - \"https://example.com\"\n * - \"wss://example.com\"\n *\n * Default: \"https://shvm.in\"\n */\n serverUrl?: string;\n /**\n * Full override for websocket URL construction. Takes precedence over `serverUrl`.\n */\n getWebSocketUrl?: (sessionId: string) => string;\n /**\n * Override session id for the websocket route (e.g. `/ws/:sessionId`).\n * If omitted, a random one is generated once per hook instance.\n */\n sessionId?: string;\n /**\n * Customizes the websocket path appended to the server base URL.\n * Default: `/ws/${sessionId}`\n */\n wsPath?: (sessionId: string) => string;\n}\n\nconst VAD_SAMPLE_RATE = 16000;\n\nfunction writeString(view: DataView, offset: number, text: string) {\n for (let i = 0; i < text.length; i += 1) {\n view.setUint8(offset + i, text.charCodeAt(i));\n }\n}\n\nfunction encodeWav(audio: Float32Array, sampleRate: number) {\n const buffer = new ArrayBuffer(44 + audio.length * 2);\n const view = new DataView(buffer);\n\n writeString(view, 0, 'RIFF');\n view.setUint32(4, 36 + audio.length * 2, true);\n writeString(view, 8, 'WAVE');\n writeString(view, 12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(view, 36, 'data');\n view.setUint32(40, audio.length * 2, true);\n\n let offset = 44;\n for (let i = 0; i < audio.length; i += 1) {\n const sample = Math.max(-1, Math.min(1, audio[i]));\n view.setInt16(offset, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n offset += 2;\n }\n\n return buffer;\n}\n\nexport function useVoiceSession(props: UseVoiceSessionProps = {}) {\n const {\n onError,\n onMessage,\n onFeedback,\n initialTranscript,\n config,\n serverUrl,\n getWebSocketUrl: getWebSocketUrlOverride,\n sessionId,\n wsPath\n } = props;\n\n // Initialize ORT config lazily\n ensureOrtConfig();\n\n // 1. Initialize Machine\n const [snapshot, send, actorRef] = useActor(clientMachine);\n const state = snapshot.context as ClientContext;\n\n // Refs for callbacks/non-state logic\n const wsRef = useRef<WebSocket | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const audioQueueRef = useRef<ArrayBuffer[]>([]);\n const isPlaybackLoopRunning = useRef(false);\n const onErrorCallbackRef = useRef(onError);\n const onMessageCallbackRef = useRef(onMessage);\n const onFeedbackCallbackRef = useRef(onFeedback);\n const configRef = useRef(config);\n const turnActiveRef = useRef(false);\n const lastVADErrorRef = useRef<string | null>(null);\n const hasSeededTranscriptRef = useRef(false);\n const sessionIdRef = useRef<string | null>(null);\n\n if (sessionIdRef.current === null) {\n sessionIdRef.current =\n sessionId ??\n (typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? // @ts-ignore\n crypto.randomUUID()\n : \"session-\" + Math.floor(Math.random() * 10000));\n }\n\n const buildWebSocketUrl = useCallback((activeSessionId: string) => {\n return buildVoiceWebSocketUrl({\n sessionId: activeSessionId,\n serverUrl,\n wsPath,\n getWebSocketUrlOverride,\n });\n }, [getWebSocketUrlOverride, serverUrl, wsPath]);\n\n // Sync refs\n useEffect(() => {\n onErrorCallbackRef.current = onError;\n onMessageCallbackRef.current = onMessage;\n onFeedbackCallbackRef.current = onFeedback;\n configRef.current = config;\n }, [onError, onMessage, onFeedback, config]);\n\n // Seed initial transcript once, if provided and machine is empty.\n useEffect(() => {\n if (hasSeededTranscriptRef.current) return;\n if (!initialTranscript || initialTranscript.length === 0) return;\n if (actorRef.getSnapshot().context.transcript.length > 0) {\n hasSeededTranscriptRef.current = true;\n return;\n }\n\n initialTranscript.forEach((msg) => {\n send({ type: 'ADD_MESSAGE', role: msg.role as any, content: msg.content });\n });\n\n hasSeededTranscriptRef.current = true;\n }, [actorRef, initialTranscript, send]);\n\n // ... (rest of hook)\n\n\n\n const initAudio = async () => {\n if (audioContextRef.current && audioContextRef.current.state !== 'closed') {\n if (audioContextRef.current.state === 'suspended') {\n await audioContextRef.current.resume();\n }\n return;\n }\n try {\n audioContextRef.current = new (window.AudioContext || (window as any).webkitAudioContext)({ sampleRate: 24000 });\n if (audioContextRef.current.state === 'suspended') {\n await audioContextRef.current.resume();\n }\n } catch (e: any) {\n console.error('[Voice] Audio init error:', e);\n const msg = 'Audio initialization failed: ' + e.message;\n console.error('[Voice] Sending SET_ERROR (Audio Init)', msg);\n send({ type: 'SET_ERROR', error: msg });\n // onError callback handled by effect\n throw e;\n }\n };\n\n const handleSpeechStart = useCallback(() => {\n const ws = wsRef.current;\n if (!ws || ws.readyState !== WebSocket.OPEN) return;\n if (turnActiveRef.current) return;\n\n // Use actorRef to get latest context synchronously in callback\n const currentContext = actorRef.getSnapshot().context;\n const status = currentContext.status;\n const error = currentContext.error;\n\n // On error, try to reset or recover.\n if (error) {\n // Optional reset logic\n }\n\n // No interruption handling. Turn-by-turn only.\n if (status === 'speaking' || status === 'processing') {\n console.log(\"[Voice] Busy, rejecting speech input (strict turn-by-turn).\");\n return;\n }\n\n if (status !== 'idle' && status !== 'listening' && status !== 'error') return;\n\n turnActiveRef.current = true;\n\n // Send start with config\n ws.send(JSON.stringify({\n type: 'start',\n config: configRef.current\n }));\n\n send({ type: 'START_LISTENING' });\n }, [actorRef, send]);\n\n const sendMessage = useCallback((text: string) => {\n const ws = wsRef.current;\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'text.message', content: text }));\n send({ type: 'ADD_MESSAGE', role: 'user', content: text });\n send({ type: 'SERVER_STATE_CHANGE', status: 'speaking' }); // Assume server will process\n }\n }, [send]);\n\n const handleSpeechEnd = useCallback(async (audio: Float32Array) => {\n const ws = wsRef.current;\n if (!turnActiveRef.current) return;\n turnActiveRef.current = false;\n\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n send({ type: 'SERVER_STATE_CHANGE', status: 'idle' });\n return;\n }\n\n // VAD sample rate is 16k\n const wavBuffer = encodeWav(audio, VAD_SAMPLE_RATE);\n const wavBlob = new Blob([wavBuffer], { type: 'audio/wav' });\n\n ws.send(wavBuffer);\n send({ type: 'LOG_EVENT', eventType: 'audio_input', details: { size: wavBuffer.byteLength }, blob: wavBlob });\n ws.send(JSON.stringify({ type: 'stop' }));\n send({ type: 'STOP_LISTENING' });\n }, [send]);\n\n\n\n const handleVADMisfire = useCallback(() => {\n if (!turnActiveRef.current) return;\n turnActiveRef.current = false;\n // Reset via server state simulation or dedicated event? \n // Logic was dispatch({ type: 'SERVER_STATE_CHANGE', status: 'idle' });\n // Keeping it consistent:\n send({ type: 'SERVER_STATE_CHANGE', status: 'idle' });\n }, [send]);\n\n const vad = useMicVAD({\n startOnLoad: false,\n onSpeechStart: handleSpeechStart,\n onSpeechEnd: handleSpeechEnd,\n onVADMisfire: handleVADMisfire,\n // @ts-expect-error\n workletURL: VAD_BASE_ASSET_PATH + 'vad.worklet.bundle.min.js',\n modelURL: VAD_MODEL_URL,\n onnxWASMBasePath: ONNX_WASM_BASE_PATH,\n baseAssetPath: VAD_BASE_ASSET_PATH,\n });\n\n useEffect(() => {\n if (!vad.errored) return;\n const message = typeof vad.errored === 'string'\n ? vad.errored\n // @ts-expect-error\n : vad.errored.message || 'VAD failed to load';\n if (lastVADErrorRef.current === message) return;\n lastVADErrorRef.current = message;\n console.error('[Voice] Sending SET_ERROR (VAD)', message);\n send({ type: 'SET_ERROR', error: message });\n }, [vad.errored, send]);\n\n useEffect(() => {\n const shouldListen = state.status === 'idle' || state.status === 'listening';\n if (shouldListen && !vad.listening && !vad.loading && !vad.errored) {\n vad.start();\n } else if (!shouldListen && vad.listening) {\n vad.pause();\n }\n }, [state.status, vad.listening, vad.loading, vad.errored, vad.start, vad.pause]);\n\n const connect = useCallback(() => {\n if (wsRef.current) wsRef.current.close();\n\n // Initialize AudioContext immediately to capture user gesture\n initAudio().catch(err => console.warn('[Voice] Early audio init failed', err));\n\n console.log('[Voice] Connect called');\n send({ type: 'CONNECT' });\n\n const sessionId = sessionIdRef.current || \"session-\" + Math.floor(Math.random() * 10000);\n const url = buildWebSocketUrl(sessionId);\n\n const ws = new WebSocket(url);\n wsRef.current = ws;\n\n ws.onopen = () => {\n send({ type: 'CONNECTED' });\n initAudio().catch(() => { });\n };\n\n ws.onmessage = async (event) => {\n if (event.data instanceof Blob) {\n const buf = await event.data.arrayBuffer();\n send({ type: 'LOG_EVENT', eventType: 'audio_output', details: { size: buf.byteLength }, blob: event.data });\n queueAudio(buf);\n return;\n }\n\n try {\n const data = JSON.parse(event.data) as ServerToClientJson;\n handleMessage(data);\n } catch (e) {\n console.error('[Voice] Parse error', e);\n }\n };\n\n ws.onclose = (e) => {\n console.log('[Voice] Closed', e.code);\n send({ type: 'DISCONNECT' }); // Use DISCONNECT event\n };\n\n ws.onerror = (e) => {\n console.error('[Voice] WS Error', e);\n send({ type: 'SET_ERROR', error: 'Connection failed: ' + (e instanceof ErrorEvent ? e.message : 'Unknown') });\n };\n }, [buildWebSocketUrl, send]);\n\n const handleMessage = (data: ServerToClientJson) => {\n // send({ type: 'LOG_EVENT', eventType: 'socket_event', details: data });\n switch (data.type) {\n case 'state':\n send({ type: 'SERVER_STATE_CHANGE', status: data.value });\n break;\n case 'transcript.final':\n send({ type: 'ADD_MESSAGE', role: 'user', content: data.text });\n onMessageCallbackRef.current?.({ role: 'user', content: data.text });\n break;\n case 'assistant.message':\n send({ type: 'ADD_MESSAGE', role: 'assistant', content: data.message.content });\n onMessageCallbackRef.current?.({ role: 'assistant', content: data.message.content });\n break;\n case 'assistant.partial':\n // Optional: Stream text token by token if needed\n break;\n case 'error':\n console.error('[Voice] Sending SET_ERROR (Server)', data.reason);\n send({ type: 'SET_ERROR', error: data.reason });\n break;\n case 'feedback':\n onFeedbackCallbackRef.current?.(data.message);\n break;\n case 'tool.call.start':\n send({ type: 'TOOL_CALL_START', toolName: data.toolName });\n break;\n case 'tool.call.end':\n send({ type: 'TOOL_CALL_END', toolName: data.toolName });\n break;\n }\n };\n\n\n const queueAudio = (buffer: ArrayBuffer) => {\n audioQueueRef.current.push(buffer);\n if (!isPlaybackLoopRunning.current) {\n playQueue();\n }\n };\n\n const playQueue = async () => {\n isPlaybackLoopRunning.current = true;\n\n while (audioQueueRef.current.length > 0) {\n send({ type: 'AUDIO_PLAYBACK_START' });\n\n const buffer = audioQueueRef.current.shift();\n if (!buffer) continue;\n\n try {\n const ctx = audioContextRef.current!;\n // Clone buffer for decoding\n const decoded = await ctx.decodeAudioData(buffer.slice(0));\n\n await new Promise<void>((resolve) => {\n const source = ctx.createBufferSource();\n source.buffer = decoded;\n source.connect(ctx.destination);\n source.onended = () => resolve();\n source.start(0);\n });\n\n } catch (e) {\n console.warn('[Voice] Decode failed, trying fallback', e);\n // Fallback\n try {\n const blob = new Blob([buffer], { type: 'audio/wav' }); // wav/mp3/etc\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n await new Promise<void>((resolve, reject) => {\n audio.onended = () => {\n URL.revokeObjectURL(url);\n resolve();\n };\n audio.onerror = reject;\n audio.play().catch(reject);\n });\n } catch (err) {\n console.error('[Voice] Playback failed completely', err);\n }\n }\n }\n\n send({ type: 'AUDIO_PLAYBACK_END' });\n isPlaybackLoopRunning.current = false;\n };\n\n const disconnect = useCallback(() => {\n if (wsRef.current) {\n wsRef.current.close();\n wsRef.current = null;\n }\n send({ type: 'DISCONNECT' });\n }, [send]);\n\n const cancel = useCallback(() => {\n const ws = wsRef.current;\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'reset' }));\n }\n send({ type: 'CANCEL' });\n }, [send]);\n\n return {\n ...state,\n vadListening: vad.listening,\n vadLoading: vad.loading,\n vadErrored: vad.errored,\n userSpeaking: vad.userSpeaking,\n connect,\n disconnect,\n sendMessage,\n cancel\n };\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { V as VoiceConfig, e as SessionStatus } from '../voice-BwU4C7fN.js';
|
|
2
|
+
export { C as ChatRole, a as ClientMessage, L as LLMModelId, b as LLM_MODELS, S as STTModelId, c as STT_MODELS, d as ServerMessage, T as TTSModelId, f as TTS_MODELS, g as TTS_MODEL_VOICES, h as TtsVoiceForModel, i as TtsVoiceId, j as VoiceStatus } from '../voice-BwU4C7fN.js';
|
|
3
|
+
|
|
4
|
+
type ClientToServerJson = {
|
|
5
|
+
type: "start";
|
|
6
|
+
config?: VoiceConfig;
|
|
7
|
+
} | {
|
|
8
|
+
type: "stop";
|
|
9
|
+
} | {
|
|
10
|
+
type: "reset";
|
|
11
|
+
} | {
|
|
12
|
+
type: "text.message";
|
|
13
|
+
content: string;
|
|
14
|
+
};
|
|
15
|
+
type LegacyClientToServerJson = {
|
|
16
|
+
type: "text";
|
|
17
|
+
value: string;
|
|
18
|
+
};
|
|
19
|
+
type AnyClientToServerJson = ClientToServerJson | LegacyClientToServerJson;
|
|
20
|
+
type ServerToClientJson = {
|
|
21
|
+
type: "state";
|
|
22
|
+
value: SessionStatus;
|
|
23
|
+
} | {
|
|
24
|
+
type: "transcript.final";
|
|
25
|
+
text: string;
|
|
26
|
+
} | {
|
|
27
|
+
type: "assistant.message";
|
|
28
|
+
message: {
|
|
29
|
+
role: "assistant";
|
|
30
|
+
content: string;
|
|
31
|
+
};
|
|
32
|
+
} | {
|
|
33
|
+
type: "assistant.partial";
|
|
34
|
+
text: string;
|
|
35
|
+
} | {
|
|
36
|
+
type: "feedback";
|
|
37
|
+
message: string;
|
|
38
|
+
} | {
|
|
39
|
+
type: "error";
|
|
40
|
+
reason: string;
|
|
41
|
+
} | {
|
|
42
|
+
type: "tool.call.start";
|
|
43
|
+
toolName: string;
|
|
44
|
+
} | {
|
|
45
|
+
type: "tool.call.end";
|
|
46
|
+
toolName: string;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { type AnyClientToServerJson, type ClientToServerJson, type LegacyClientToServerJson, type ServerToClientJson, SessionStatus, VoiceConfig };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// src/shared/constants/models.ts
|
|
2
|
+
var STT_MODELS = ["@cf/openai/whisper", "@cf/openai/whisper-tiny-en"];
|
|
3
|
+
var LLM_MODELS = [
|
|
4
|
+
"@cf/meta/llama-3.1-8b-instruct",
|
|
5
|
+
"@cf/meta/llama-3-8b-instruct",
|
|
6
|
+
"@cf/meta/llama-2-7b-chat-int8",
|
|
7
|
+
"@cf/mistral/mistral-7b-instruct-v0.1"
|
|
8
|
+
];
|
|
9
|
+
var TTS_MODELS = ["@cf/deepgram/aura-2-en", "@cf/deepgram/aura-1"];
|
|
10
|
+
var TTS_MODEL_VOICES = {
|
|
11
|
+
"@cf/deepgram/aura-2-en": ["asteria", "luna", "arcas", "athena", "helios", "orpheus", "perseus", "angus"],
|
|
12
|
+
"@cf/deepgram/aura-1": [
|
|
13
|
+
"asteria",
|
|
14
|
+
"luna",
|
|
15
|
+
"stella",
|
|
16
|
+
"athena",
|
|
17
|
+
"hera",
|
|
18
|
+
"orion",
|
|
19
|
+
"arcas",
|
|
20
|
+
"perseus",
|
|
21
|
+
"angus",
|
|
22
|
+
"orpheus",
|
|
23
|
+
"helios",
|
|
24
|
+
"zeus"
|
|
25
|
+
]
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export { LLM_MODELS, STT_MODELS, TTS_MODELS, TTS_MODEL_VOICES };
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/constants/models.ts"],"names":[],"mappings":";AAAO,IAAM,UAAA,GAAa,CAAC,oBAAA,EAAsB,4BAA4B;AAGtE,IAAM,UAAA,GAAa;AAAA,EACxB,gCAAA;AAAA,EACA,8BAAA;AAAA,EACA,+BAAA;AAAA,EACA;AACF;AAGO,IAAM,UAAA,GAAa,CAAC,wBAAA,EAA0B,qBAAqB;AAGnE,IAAM,gBAAA,GAAmB;AAAA,EAC9B,wBAAA,EAA0B,CAAC,SAAA,EAAW,MAAA,EAAQ,SAAS,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,OAAO,CAAA;AAAA,EACxG,qBAAA,EAAuB;AAAA,IACrB,SAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA;AAEJ","file":"index.js","sourcesContent":["export const STT_MODELS = [\"@cf/openai/whisper\", \"@cf/openai/whisper-tiny-en\"] as const;\nexport type STTModelId = (typeof STT_MODELS)[number];\n\nexport const LLM_MODELS = [\n \"@cf/meta/llama-3.1-8b-instruct\",\n \"@cf/meta/llama-3-8b-instruct\",\n \"@cf/meta/llama-2-7b-chat-int8\",\n \"@cf/mistral/mistral-7b-instruct-v0.1\",\n] as const;\nexport type LLMModelId = (typeof LLM_MODELS)[number];\n\nexport const TTS_MODELS = [\"@cf/deepgram/aura-2-en\", \"@cf/deepgram/aura-1\"] as const;\nexport type TTSModelId = (typeof TTS_MODELS)[number];\n\nexport const TTS_MODEL_VOICES = {\n \"@cf/deepgram/aura-2-en\": [\"asteria\", \"luna\", \"arcas\", \"athena\", \"helios\", \"orpheus\", \"perseus\", \"angus\"],\n \"@cf/deepgram/aura-1\": [\n \"asteria\",\n \"luna\",\n \"stella\",\n \"athena\",\n \"hera\",\n \"orion\",\n \"arcas\",\n \"perseus\",\n \"angus\",\n \"orpheus\",\n \"helios\",\n \"zeus\",\n ],\n} as const satisfies Record<TTSModelId, readonly string[]>;\n\nexport type TtsVoiceForModel<T extends TTSModelId> = (typeof TTS_MODEL_VOICES)[T][number];\nexport type TtsVoiceId = (typeof TTS_MODEL_VOICES)[TTSModelId][number];\n\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { DebugEvent } from '@shvm/vani-client/headless';
|
|
3
|
+
import { ClientMessage, VoiceConfig, VoiceStatus } from '@shvm/vani-client/shared';
|
|
4
|
+
|
|
5
|
+
interface VaniProps {
|
|
6
|
+
onError?: (error: string) => void;
|
|
7
|
+
onMessage?: (msg: {
|
|
8
|
+
role: "user" | "assistant";
|
|
9
|
+
content: string;
|
|
10
|
+
}) => void;
|
|
11
|
+
initialTranscript?: ClientMessage[];
|
|
12
|
+
defaultMode?: "full" | "pip";
|
|
13
|
+
mode?: "full" | "pip";
|
|
14
|
+
onModeChange?: (mode: "full" | "pip") => void;
|
|
15
|
+
initialConfig?: VoiceConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Base server URL for websocket URL construction.
|
|
18
|
+
*
|
|
19
|
+
* Default: `https://shvm.in`
|
|
20
|
+
*/
|
|
21
|
+
serverUrl?: string;
|
|
22
|
+
}
|
|
23
|
+
interface VaniViewProps {
|
|
24
|
+
status: VoiceStatus;
|
|
25
|
+
transcript: ClientMessage[];
|
|
26
|
+
history: DebugEvent[];
|
|
27
|
+
error: string | null;
|
|
28
|
+
connect: () => void;
|
|
29
|
+
cancel: () => void;
|
|
30
|
+
vadLoading: boolean;
|
|
31
|
+
onTogglePip?: () => void;
|
|
32
|
+
config?: VoiceConfig;
|
|
33
|
+
setConfig?: (config: VoiceConfig) => void;
|
|
34
|
+
feedback?: string | null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
declare function Vani(props: VaniProps): react_jsx_runtime.JSX.Element | null;
|
|
38
|
+
|
|
39
|
+
export { Vani, type VaniProps, type VaniViewProps };
|