@voice-kit/core 0.1.2 → 0.1.3
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/index.cjs +2137 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1466 -4
- package/dist/index.d.ts +1466 -4
- package/dist/index.js +2102 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -31
- package/dist/audio.cjs +0 -533
- package/dist/audio.cjs.map +0 -1
- package/dist/audio.d.cts +0 -260
- package/dist/audio.d.ts +0 -260
- package/dist/audio.js +0 -514
- package/dist/audio.js.map +0 -1
- package/dist/compliance.cjs +0 -343
- package/dist/compliance.cjs.map +0 -1
- package/dist/compliance.d.cts +0 -163
- package/dist/compliance.d.ts +0 -163
- package/dist/compliance.js +0 -335
- package/dist/compliance.js.map +0 -1
- package/dist/errors.cjs +0 -284
- package/dist/errors.cjs.map +0 -1
- package/dist/errors.d.cts +0 -100
- package/dist/errors.d.ts +0 -100
- package/dist/errors.js +0 -262
- package/dist/errors.js.map +0 -1
- package/dist/index-D3KfRXMP.d.cts +0 -319
- package/dist/index-D3KfRXMP.d.ts +0 -319
- package/dist/memory.cjs +0 -121
- package/dist/memory.cjs.map +0 -1
- package/dist/memory.d.cts +0 -29
- package/dist/memory.d.ts +0 -29
- package/dist/memory.js +0 -115
- package/dist/memory.js.map +0 -1
- package/dist/observability.cjs +0 -229
- package/dist/observability.cjs.map +0 -1
- package/dist/observability.d.cts +0 -122
- package/dist/observability.d.ts +0 -122
- package/dist/observability.js +0 -222
- package/dist/observability.js.map +0 -1
- package/dist/stt.cjs +0 -828
- package/dist/stt.cjs.map +0 -1
- package/dist/stt.d.cts +0 -308
- package/dist/stt.d.ts +0 -308
- package/dist/stt.js +0 -815
- package/dist/stt.js.map +0 -1
- package/dist/telephony.errors-BQYr6-vl.d.cts +0 -80
- package/dist/telephony.errors-C0-nScrF.d.ts +0 -80
- package/dist/tts.cjs +0 -429
- package/dist/tts.cjs.map +0 -1
- package/dist/tts.d.cts +0 -151
- package/dist/tts.d.ts +0 -151
- package/dist/tts.js +0 -418
- package/dist/tts.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/base.ts","../src/errors/agents.errors.ts","../src/errors/compliance.ts","../src/errors/inngest.errors.ts","../src/errors/stt.errors.ts","../src/errors/telephony.errors.ts","../src/errors/tts.errors.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * @voice-kit/core — Typed error hierarchy\r\n *\r\n * All VoiceKit errors extend VoiceKitError. Never throw raw Error.\r\n * Every error carries: code, message, provider, callId, retryable, severity.\r\n */\r\n\r\nimport type { ErrorSeverity } from '../types'\r\n\r\n// ─── Base Error ───────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Base class for all VoiceKit errors. Provides structured context for\r\n * logging, alerting, and programmatic error handling.\r\n *\r\n * @example\r\n * ```ts\r\n * try {\r\n * await stt.transcribeBatch(audio)\r\n * } catch (err) {\r\n * if (err instanceof STTError) {\r\n * console.error(err.code, err.provider, err.retryable)\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class VoiceKitError extends Error {\r\n readonly code: string\r\n readonly callId?: string\r\n readonly provider?: string\r\n readonly retryable: boolean\r\n readonly severity: ErrorSeverity\r\n override readonly cause?: unknown\r\n\r\n constructor(params: {\r\n code: string\r\n message: string\r\n callId?: string\r\n provider?: string\r\n retryable?: boolean\r\n severity?: ErrorSeverity\r\n cause?: unknown\r\n }) {\r\n super(params.message)\r\n this.name = this.constructor.name\r\n this.code = params.code\r\n this.callId = params.callId\r\n this.provider = params.provider\r\n this.retryable = params.retryable ?? false\r\n this.severity = params.severity ?? 'medium'\r\n this.cause = params.cause\r\n\r\n // Maintains proper prototype chain for `instanceof` in transpiled code\r\n Object.setPrototypeOf(this, new.target.prototype)\r\n }\r\n\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n code: this.code,\r\n message: this.message,\r\n callId: this.callId,\r\n provider: this.provider,\r\n retryable: this.retryable,\r\n severity: this.severity,\r\n }\r\n }\r\n}","\r\n// ─── Agent Errors ─────────────────────────────────────────────────────────────\r\n\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from agent orchestration (turn engine, handoff, injection).\r\n */\r\nexport class AgentError extends VoiceKitError { }\r\n\r\nexport class TurnTransitionError extends AgentError {\r\n readonly fromState: string\r\n readonly event: string\r\n\r\n constructor(fromState: string, toEvent: string, callId?: string) {\r\n super({\r\n code: 'AGENT_INVALID_TURN_TRANSITION',\r\n message: `Invalid turn transition: state '${fromState}' cannot handle event '${toEvent}'`,\r\n callId,\r\n retryable: false,\r\n severity: 'medium',\r\n })\r\n this.fromState = fromState\r\n this.event = toEvent\r\n }\r\n}\r\n\r\nexport class AgentHandoffError extends AgentError {\r\n constructor(capability: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'AGENT_HANDOFF_FAILED',\r\n message: `Handoff to '${capability}' agent failed`,\r\n callId,\r\n retryable: true,\r\n severity: 'high',\r\n cause,\r\n })\r\n }\r\n}\r\n","\r\n// ─── Compliance Errors ────────────────────────────────────────────────────────\r\n\r\nimport type { ErrorSeverity } from \"../types\"\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from compliance checks (TRAI DNC, calling hours, consent).\r\n */\r\nexport class ComplianceError extends VoiceKitError {\r\n readonly phoneNumber?: string\r\n\r\n constructor(params: {\r\n code: string\r\n message: string\r\n callId?: string\r\n phoneNumber?: string\r\n retryable?: boolean\r\n severity?: ErrorSeverity\r\n cause?: unknown\r\n }) {\r\n super({ ...params, provider: 'trai' })\r\n this.phoneNumber = params.phoneNumber\r\n }\r\n}\r\n\r\nexport class DNCBlockedError extends ComplianceError {\r\n constructor(phoneNumber: string, callId?: string) {\r\n super({\r\n code: 'COMPLIANCE_DNC_BLOCKED',\r\n message: `Number ${phoneNumber} is on DNC registry — call blocked`,\r\n callId,\r\n phoneNumber,\r\n retryable: false,\r\n severity: 'low',\r\n })\r\n }\r\n}\r\n\r\nexport class CallingHoursError extends ComplianceError {\r\n constructor(phoneNumber: string, currentTime: string, callId?: string) {\r\n super({\r\n code: 'COMPLIANCE_OUTSIDE_CALLING_HOURS',\r\n message: `Call to ${phoneNumber} blocked — outside TRAI calling hours (current: ${currentTime} IST)`,\r\n callId,\r\n phoneNumber,\r\n retryable: false,\r\n severity: 'low',\r\n })\r\n }\r\n}\r\n\r\nexport class ConsentMissingError extends ComplianceError {\r\n constructor(phoneNumber: string, callId?: string) {\r\n super({\r\n code: 'COMPLIANCE_CONSENT_MISSING',\r\n message: `No valid consent on record for ${phoneNumber}`,\r\n callId,\r\n phoneNumber,\r\n retryable: false,\r\n severity: 'medium',\r\n })\r\n }\r\n}\r\n","\r\n\r\n// ─── Inngest Errors ───────────────────────────────────────────────────────────\r\n\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from Inngest background task dispatch.\r\n */\r\nexport class InngestError extends VoiceKitError {\r\n readonly taskName?: string\r\n\r\n constructor(params: {\r\n code: string\r\n message: string\r\n callId?: string\r\n taskName?: string\r\n cause?: unknown\r\n }) {\r\n super({\r\n ...params,\r\n provider: 'inngest',\r\n retryable: true,\r\n severity: 'medium',\r\n })\r\n this.taskName = params.taskName\r\n }\r\n}","\r\n// ─── STT Errors ───────────────────────────────────────────────────────────────\r\n\r\nimport type { ErrorSeverity } from \"../types\"\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from speech-to-text providers.\r\n */\r\nexport class STTError extends VoiceKitError {\r\n readonly languageCode?: string\r\n\r\n constructor(params: {\r\n code: string\r\n message: string\r\n callId?: string\r\n provider?: string\r\n retryable?: boolean\r\n severity?: ErrorSeverity\r\n cause?: unknown\r\n languageCode?: string\r\n }) {\r\n super(params)\r\n this.languageCode = params.languageCode\r\n }\r\n}\r\n\r\nexport class STTConnectionError extends STTError {\r\n constructor(provider: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'STT_CONNECTION_FAILED',\r\n message: `Failed to connect to ${provider} STT service`,\r\n provider,\r\n callId,\r\n retryable: true,\r\n severity: 'high',\r\n cause,\r\n })\r\n }\r\n}\r\n\r\nexport class STTStreamError extends STTError {\r\n constructor(provider: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'STT_STREAM_ERROR',\r\n message: `STT stream error from ${provider}`,\r\n provider,\r\n callId,\r\n retryable: true,\r\n severity: 'medium',\r\n cause,\r\n })\r\n }\r\n}\r\n\r\nexport class STTLanguageNotSupportedError extends STTError {\r\n constructor(provider: string, language: string) {\r\n super({\r\n code: 'STT_LANGUAGE_NOT_SUPPORTED',\r\n message: `Language '${language}' is not supported by ${provider}`,\r\n provider,\r\n retryable: false,\r\n severity: 'low',\r\n languageCode: language,\r\n })\r\n }\r\n}\r\n","\r\n// ─── Telephony Errors ─────────────────────────────────────────────────────────\r\n\r\nimport type { ErrorSeverity } from \"../types\"\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from telephony providers.\r\n */\r\nexport class TelephonyError extends VoiceKitError {\r\n readonly to?: string\r\n readonly from?: string\r\n\r\n constructor(params: {\r\n code: string\r\n message: string\r\n callId?: string\r\n provider?: string\r\n retryable?: boolean\r\n severity?: ErrorSeverity\r\n cause?: unknown\r\n to?: string\r\n from?: string\r\n }) {\r\n super(params)\r\n this.to = params.to\r\n this.from = params.from\r\n }\r\n}\r\n\r\nexport class CallConnectionError extends TelephonyError {\r\n constructor(provider: string, to: string, cause?: unknown) {\r\n super({\r\n code: 'CALL_CONNECTION_FAILED',\r\n message: `Failed to connect call to ${to} via ${provider}`,\r\n provider,\r\n to,\r\n retryable: true,\r\n severity: 'high',\r\n cause,\r\n })\r\n }\r\n}\r\n\r\nexport class CallNotFoundError extends TelephonyError {\r\n constructor(callId: string, provider: string) {\r\n super({\r\n code: 'CALL_NOT_FOUND',\r\n message: `Call '${callId}' not found on ${provider}`,\r\n callId,\r\n provider,\r\n retryable: false,\r\n severity: 'low',\r\n })\r\n }\r\n}\r\n\r\nexport class AudioTransportError extends TelephonyError {\r\n constructor(provider: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'AUDIO_TRANSPORT_ERROR',\r\n message: `Audio transport error on ${provider}`,\r\n provider,\r\n callId,\r\n retryable: true,\r\n severity: 'high',\r\n cause,\r\n })\r\n }\r\n}\r\n","\r\n// ─── TTS Errors ───────────────────────────────────────────────────────────────\r\n\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from text-to-speech providers.\r\n */\r\nexport class TTSError extends VoiceKitError { }\r\n\r\nexport class TTSConnectionError extends TTSError {\r\n constructor(provider: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'TTS_CONNECTION_FAILED',\r\n message: `Failed to connect to ${provider} TTS service`,\r\n provider,\r\n callId,\r\n retryable: true,\r\n severity: 'high',\r\n cause,\r\n })\r\n }\r\n}\r\n\r\nexport class TTSStreamError extends TTSError {\r\n constructor(provider: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'TTS_STREAM_ERROR',\r\n message: `TTS stream error from ${provider}`,\r\n provider,\r\n callId,\r\n retryable: true,\r\n severity: 'medium',\r\n cause,\r\n })\r\n }\r\n}\r\n\r\nexport class TTSVoiceNotFoundError extends TTSError {\r\n constructor(provider: string, voiceId: string) {\r\n super({\r\n code: 'TTS_VOICE_NOT_FOUND',\r\n message: `Voice '${voiceId}' not found on ${provider}`,\r\n provider,\r\n retryable: false,\r\n severity: 'low',\r\n })\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/base.ts","../src/errors/agents.errors.ts","../src/errors/compliance.ts","../src/errors/inngest.errors.ts","../src/errors/stt.errors.ts","../src/errors/telephony.errors.ts","../src/errors/tts.errors.ts","../src/audio/codec/index.ts","../src/audio/resampler/index.ts","../src/audio/piplines/index.ts","../src/audio/vad/index.ts","../src/compliance/audit/index.ts","../src/compliance/trai/index.ts","../src/memory/lru-cache/index.ts","../src/observability/metric/index.ts","../src/observability/tracer/index.ts","../src/stt/assembly/index.ts","../src/stt/deepgram/index.ts","../src/stt/sarvam/index.ts","../src/stt/language-detect.ts","../src/stt/whisper/index.ts","../src/stt/STT-factory.ts","../src/tts/cartesia/index.ts","../src/tts/elevenlabs/index.ts","../src/tts/sarvam/index.ts","../src/tts/TTS-factory.ts"],"names":["Readable","PassThrough","ffmpeg","pino","logger","EventEmitter","LRUCache","appendFile","axios","isValidPhoneNumber","parsePhoneNumberFromString","DEFAULTS","NodeTracerProvider","Resource","ATTR_SERVICE_NAME","SimpleSpanProcessor","OTLPTraceExporter","trace","SpanStatusCode","AssemblyAI","SUPPORTED_LANGUAGES","DeepgramClient","openai","createOpenAI","Cartesia","DEFAULT_VOICE_ID","ElevenLabsClient","SARVAM_API_BASE"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * @voice-kit/core — Typed error hierarchy\r\n *\r\n * All VoiceKit errors extend VoiceKitError. Never throw raw Error.\r\n * Every error carries: code, message, provider, callId, retryable, severity.\r\n */\r\n\r\nimport type { ErrorSeverity } from '../types'\r\n\r\n// ─── Base Error ───────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Base class for all VoiceKit errors. Provides structured context for\r\n * logging, alerting, and programmatic error handling.\r\n *\r\n * @example\r\n * ```ts\r\n * try {\r\n * await stt.transcribeBatch(audio)\r\n * } catch (err) {\r\n * if (err instanceof STTError) {\r\n * console.error(err.code, err.provider, err.retryable)\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class VoiceKitError extends Error {\r\n readonly code: string\r\n readonly callId?: string\r\n readonly provider?: string\r\n readonly retryable: boolean\r\n readonly severity: ErrorSeverity\r\n override readonly cause?: unknown\r\n\r\n constructor(params: {\r\n code: string\r\n message: string\r\n callId?: string\r\n provider?: string\r\n retryable?: boolean\r\n severity?: ErrorSeverity\r\n cause?: unknown\r\n }) {\r\n super(params.message)\r\n this.name = this.constructor.name\r\n this.code = params.code\r\n this.callId = params.callId\r\n this.provider = params.provider\r\n this.retryable = params.retryable ?? false\r\n this.severity = params.severity ?? 'medium'\r\n this.cause = params.cause\r\n\r\n // Maintains proper prototype chain for `instanceof` in transpiled code\r\n Object.setPrototypeOf(this, new.target.prototype)\r\n }\r\n\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n code: this.code,\r\n message: this.message,\r\n callId: this.callId,\r\n provider: this.provider,\r\n retryable: this.retryable,\r\n severity: this.severity,\r\n }\r\n }\r\n}","\r\n// ─── Agent Errors ─────────────────────────────────────────────────────────────\r\n\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from agent orchestration (turn engine, handoff, injection).\r\n */\r\nexport class AgentError extends VoiceKitError { }\r\n\r\nexport class TurnTransitionError extends AgentError {\r\n readonly fromState: string\r\n readonly event: string\r\n\r\n constructor(fromState: string, toEvent: string, callId?: string) {\r\n super({\r\n code: 'AGENT_INVALID_TURN_TRANSITION',\r\n message: `Invalid turn transition: state '${fromState}' cannot handle event '${toEvent}'`,\r\n callId,\r\n retryable: false,\r\n severity: 'medium',\r\n })\r\n this.fromState = fromState\r\n this.event = toEvent\r\n }\r\n}\r\n\r\nexport class AgentHandoffError extends AgentError {\r\n constructor(capability: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'AGENT_HANDOFF_FAILED',\r\n message: `Handoff to '${capability}' agent failed`,\r\n callId,\r\n retryable: true,\r\n severity: 'high',\r\n cause,\r\n })\r\n }\r\n}\r\n","\r\n// ─── Compliance Errors ────────────────────────────────────────────────────────\r\n\r\nimport type { ErrorSeverity } from \"../types\"\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from compliance checks (TRAI DNC, calling hours, consent).\r\n */\r\nexport class ComplianceError extends VoiceKitError {\r\n readonly phoneNumber?: string\r\n\r\n constructor(params: {\r\n code: string\r\n message: string\r\n callId?: string\r\n phoneNumber?: string\r\n retryable?: boolean\r\n severity?: ErrorSeverity\r\n cause?: unknown\r\n }) {\r\n super({ ...params, provider: 'trai' })\r\n this.phoneNumber = params.phoneNumber\r\n }\r\n}\r\n\r\nexport class DNCBlockedError extends ComplianceError {\r\n constructor(phoneNumber: string, callId?: string) {\r\n super({\r\n code: 'COMPLIANCE_DNC_BLOCKED',\r\n message: `Number ${phoneNumber} is on DNC registry — call blocked`,\r\n callId,\r\n phoneNumber,\r\n retryable: false,\r\n severity: 'low',\r\n })\r\n }\r\n}\r\n\r\nexport class CallingHoursError extends ComplianceError {\r\n constructor(phoneNumber: string, currentTime: string, callId?: string) {\r\n super({\r\n code: 'COMPLIANCE_OUTSIDE_CALLING_HOURS',\r\n message: `Call to ${phoneNumber} blocked — outside TRAI calling hours (current: ${currentTime} IST)`,\r\n callId,\r\n phoneNumber,\r\n retryable: false,\r\n severity: 'low',\r\n })\r\n }\r\n}\r\n\r\nexport class ConsentMissingError extends ComplianceError {\r\n constructor(phoneNumber: string, callId?: string) {\r\n super({\r\n code: 'COMPLIANCE_CONSENT_MISSING',\r\n message: `No valid consent on record for ${phoneNumber}`,\r\n callId,\r\n phoneNumber,\r\n retryable: false,\r\n severity: 'medium',\r\n })\r\n }\r\n}\r\n","\r\n\r\n// ─── Inngest Errors ───────────────────────────────────────────────────────────\r\n\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from Inngest background task dispatch.\r\n */\r\nexport class InngestError extends VoiceKitError {\r\n readonly taskName?: string\r\n\r\n constructor(params: {\r\n code: string\r\n message: string\r\n callId?: string\r\n taskName?: string\r\n cause?: unknown\r\n }) {\r\n super({\r\n ...params,\r\n provider: 'inngest',\r\n retryable: true,\r\n severity: 'medium',\r\n })\r\n this.taskName = params.taskName\r\n }\r\n}","\r\n// ─── STT Errors ───────────────────────────────────────────────────────────────\r\n\r\nimport type { ErrorSeverity } from \"../types\"\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from speech-to-text providers.\r\n */\r\nexport class STTError extends VoiceKitError {\r\n readonly languageCode?: string\r\n\r\n constructor(params: {\r\n code: string\r\n message: string\r\n callId?: string\r\n provider?: string\r\n retryable?: boolean\r\n severity?: ErrorSeverity\r\n cause?: unknown\r\n languageCode?: string\r\n }) {\r\n super(params)\r\n this.languageCode = params.languageCode\r\n }\r\n}\r\n\r\nexport class STTConnectionError extends STTError {\r\n constructor(provider: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'STT_CONNECTION_FAILED',\r\n message: `Failed to connect to ${provider} STT service`,\r\n provider,\r\n callId,\r\n retryable: true,\r\n severity: 'high',\r\n cause,\r\n })\r\n }\r\n}\r\n\r\nexport class STTStreamError extends STTError {\r\n constructor(provider: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'STT_STREAM_ERROR',\r\n message: `STT stream error from ${provider}`,\r\n provider,\r\n callId,\r\n retryable: true,\r\n severity: 'medium',\r\n cause,\r\n })\r\n }\r\n}\r\n\r\nexport class STTLanguageNotSupportedError extends STTError {\r\n constructor(provider: string, language: string) {\r\n super({\r\n code: 'STT_LANGUAGE_NOT_SUPPORTED',\r\n message: `Language '${language}' is not supported by ${provider}`,\r\n provider,\r\n retryable: false,\r\n severity: 'low',\r\n languageCode: language,\r\n })\r\n }\r\n}\r\n","\r\n// ─── Telephony Errors ─────────────────────────────────────────────────────────\r\n\r\nimport type { ErrorSeverity } from \"../types\"\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from telephony providers.\r\n */\r\nexport class TelephonyError extends VoiceKitError {\r\n readonly to?: string\r\n readonly from?: string\r\n\r\n constructor(params: {\r\n code: string\r\n message: string\r\n callId?: string\r\n provider?: string\r\n retryable?: boolean\r\n severity?: ErrorSeverity\r\n cause?: unknown\r\n to?: string\r\n from?: string\r\n }) {\r\n super(params)\r\n this.to = params.to\r\n this.from = params.from\r\n }\r\n}\r\n\r\nexport class CallConnectionError extends TelephonyError {\r\n constructor(provider: string, to: string, cause?: unknown) {\r\n super({\r\n code: 'CALL_CONNECTION_FAILED',\r\n message: `Failed to connect call to ${to} via ${provider}`,\r\n provider,\r\n to,\r\n retryable: true,\r\n severity: 'high',\r\n cause,\r\n })\r\n }\r\n}\r\n\r\nexport class CallNotFoundError extends TelephonyError {\r\n constructor(callId: string, provider: string) {\r\n super({\r\n code: 'CALL_NOT_FOUND',\r\n message: `Call '${callId}' not found on ${provider}`,\r\n callId,\r\n provider,\r\n retryable: false,\r\n severity: 'low',\r\n })\r\n }\r\n}\r\n\r\nexport class AudioTransportError extends TelephonyError {\r\n constructor(provider: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'AUDIO_TRANSPORT_ERROR',\r\n message: `Audio transport error on ${provider}`,\r\n provider,\r\n callId,\r\n retryable: true,\r\n severity: 'high',\r\n cause,\r\n })\r\n }\r\n}\r\n","\r\n// ─── TTS Errors ───────────────────────────────────────────────────────────────\r\n\r\nimport { VoiceKitError } from \"./base\"\r\n\r\n/**\r\n * Errors from text-to-speech providers.\r\n */\r\nexport class TTSError extends VoiceKitError { }\r\n\r\nexport class TTSConnectionError extends TTSError {\r\n constructor(provider: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'TTS_CONNECTION_FAILED',\r\n message: `Failed to connect to ${provider} TTS service`,\r\n provider,\r\n callId,\r\n retryable: true,\r\n severity: 'high',\r\n cause,\r\n })\r\n }\r\n}\r\n\r\nexport class TTSStreamError extends TTSError {\r\n constructor(provider: string, cause?: unknown, callId?: string) {\r\n super({\r\n code: 'TTS_STREAM_ERROR',\r\n message: `TTS stream error from ${provider}`,\r\n provider,\r\n callId,\r\n retryable: true,\r\n severity: 'medium',\r\n cause,\r\n })\r\n }\r\n}\r\n\r\nexport class TTSVoiceNotFoundError extends TTSError {\r\n constructor(provider: string, voiceId: string) {\r\n super({\r\n code: 'TTS_VOICE_NOT_FOUND',\r\n message: `Voice '${voiceId}' not found on ${provider}`,\r\n provider,\r\n retryable: false,\r\n severity: 'low',\r\n })\r\n }\r\n}\r\n","/**\r\n * @voice-kit/core — G.711 µ-law codec\r\n *\r\n * Pure TypeScript implementation of G.711 µ-law (mu-law) encode/decode.\r\n * No external codec library needed for µ-law. This is 100% internal —\r\n * never exported from the public API.\r\n *\r\n * Used by AudioPipeline to convert Twilio/Exotel µ-law audio ↔ PCM.\r\n */\r\n\r\n/** µ-law bias constant (G.711 spec). */\r\nconst MULAW_BIAS = 33\r\n\r\n/** µ-law maximum value. */\r\nconst MULAW_MAX = 0x7fff\r\n\r\n/**\r\n * Convert a single µ-law encoded byte (0–255) to a 16-bit linear PCM sample.\r\n * Algorithm: ITU-T G.711 Section 3.\r\n *\r\n * @internal\r\n */\r\nexport function mulawToLinear(sample: number): number {\r\n // Invert all bits (µ-law is stored inverted per G.711 spec)\r\n sample = ~sample & 0xff\r\n\r\n const sign = sample & 0x80\r\n const exponent = (sample >> 4) & 0x07\r\n const mantissa = sample & 0x0f\r\n\r\n let linear = ((mantissa << 1) + 33) << exponent\r\n linear -= 33\r\n\r\n return sign !== 0 ? -linear : linear\r\n}\r\n\r\n/**\r\n * Convert a 16-bit linear PCM sample to a µ-law encoded byte.\r\n * Algorithm: ITU-T G.711 Section 3.\r\n *\r\n * @internal\r\n */\r\nexport function linearToMulaw(sample: number): number {\r\n // Clamp to 16-bit signed range\r\n sample = Math.max(-32768, Math.min(32767, sample))\r\n\r\n const sign = sample < 0 ? 0x80 : 0x00\r\n if (sample < 0) sample = -sample\r\n\r\n // Add bias\r\n sample += MULAW_BIAS\r\n\r\n // Clamp to max\r\n if (sample > MULAW_MAX) sample = MULAW_MAX\r\n\r\n // Find exponent (position of highest bit above bias)\r\n let exponent = 7\r\n let expMask = 0x4000\r\n for (; exponent > 0; exponent--) {\r\n if ((sample & expMask) !== 0) break\r\n expMask >>= 1\r\n }\r\n\r\n const mantissa = (sample >> (exponent + 3)) & 0x0f\r\n const mulaw = ~(sign | (exponent << 4) | mantissa) & 0xff\r\n\r\n return mulaw\r\n}\r\n\r\n/**\r\n * Convert a Buffer of µ-law encoded bytes to 16-bit little-endian PCM.\r\n * Each µ-law byte expands to 2 PCM bytes (16-bit LE signed).\r\n *\r\n * Input: N bytes (µ-law, 8kHz mono as sent by Twilio/Exotel)\r\n * Output: N*2 bytes (PCM 16-bit LE, same sample rate)\r\n *\r\n * @internal\r\n */\r\nexport function mulawBufferToPcm(buf: Buffer): Buffer {\r\n const pcm = Buffer.allocUnsafe(buf.length * 2)\r\n for (let i = 0; i < buf.length; i++) {\r\n const sample = mulawToLinear(buf[i] ?? 0)\r\n pcm.writeInt16LE(sample, i * 2)\r\n }\r\n return pcm\r\n}\r\n\r\n/**\r\n * Convert a Buffer of 16-bit little-endian PCM to µ-law bytes.\r\n * Each pair of PCM bytes compresses to 1 µ-law byte.\r\n *\r\n * Input: N bytes (PCM 16-bit LE)\r\n * Output: N/2 bytes (µ-law)\r\n *\r\n * @internal\r\n */\r\nexport function pcmBufferToMulaw(buf: Buffer): Buffer {\r\n const samples = buf.length >> 1 // divide by 2\r\n const mulaw = Buffer.allocUnsafe(samples)\r\n for (let i = 0; i < samples; i++) {\r\n const sample = buf.readInt16LE(i * 2)\r\n mulaw[i] = linearToMulaw(sample)\r\n }\r\n return mulaw\r\n}\r\n\r\n/**\r\n * Convert a base64-encoded µ-law string (as sent by Twilio Media Streams)\r\n * directly to PCM Buffer. Convenience wrapper used in TwilioProvider.\r\n *\r\n * @internal\r\n */\r\nexport function base64MulawToPcm(base64: string): Buffer {\r\n const mulaw = Buffer.from(base64, 'base64')\r\n return mulawBufferToPcm(mulaw)\r\n}\r\n\r\n/**\r\n * Convert a PCM Buffer to a base64-encoded µ-law string (for sending\r\n * back to Twilio Media Streams).\r\n *\r\n * @internal\r\n */\r\nexport function pcmToBase64Mulaw(pcm: Buffer): string {\r\n return pcmBufferToMulaw(pcm).toString('base64')\r\n}","/**\r\n * @voice-kit/core — PCM audio resampler\r\n *\r\n * Resamples raw PCM audio between sample rates using fluent-ffmpeg.\r\n * 100% internal — never exported from the public API.\r\n * Used by AudioPipeline to convert provider-native rates to STT-required rates.\r\n */\r\n\r\nimport ffmpeg from 'fluent-ffmpeg'\r\nimport { Readable, PassThrough } from 'node:stream'\r\nimport { AudioTransportError } from '../../errors'\r\n\r\n/**\r\n * Resample a PCM Buffer from one sample rate to another.\r\n * Both input and output are signed 16-bit little-endian PCM, mono.\r\n *\r\n * Common conversions:\r\n * 8kHz → 16kHz (Twilio/Exotel µ-law decoded → Deepgram input)\r\n * 48kHz → 16kHz (LiveKit Opus decoded → Deepgram input)\r\n * 24kHz → 8kHz (ElevenLabs output → Twilio send)\r\n *\r\n * @param buf Raw PCM bytes (s16le mono)\r\n * @param fromHz Source sample rate in Hz\r\n * @param toHz Target sample rate in Hz\r\n * @returns Resampled PCM bytes (s16le mono)\r\n *\r\n * @internal\r\n */\r\nexport async function resample(\r\n buf: Buffer,\r\n fromHz: number,\r\n toHz: number\r\n): Promise<Buffer> {\r\n // Fast path: no-op if rates match\r\n if (fromHz === toHz) return buf\r\n\r\n return new Promise<Buffer>((resolve, reject) => {\r\n const chunks: Buffer[] = []\r\n\r\n const input = new Readable({\r\n read() {\r\n this.push(buf)\r\n this.push(null)\r\n },\r\n })\r\n\r\n const output = new PassThrough()\r\n\r\n output.on('data', (chunk: Buffer) => chunks.push(chunk))\r\n output.on('end', () => resolve(Buffer.concat(chunks)))\r\n output.on('error', (err) =>\r\n reject(\r\n new AudioTransportError(\r\n 'ffmpeg-resampler',\r\n err\r\n )\r\n )\r\n )\r\n\r\n ffmpeg(input)\r\n .inputOptions([\r\n '-f s16le',\r\n `-ar ${fromHz}`,\r\n '-ac 1',\r\n ])\r\n .outputOptions([\r\n '-f s16le',\r\n `-ar ${toHz}`,\r\n '-ac 1',\r\n ])\r\n .on('error', (err: Error) =>\r\n reject(\r\n new AudioTransportError('ffmpeg-resampler', err)\r\n )\r\n )\r\n .pipe(output, { end: true })\r\n })\r\n}\r\n\r\n/**\r\n * Create a streaming resampler Transform stream.\r\n * More efficient than buffering for large audio chunks.\r\n *\r\n * @param fromHz Source sample rate in Hz\r\n * @param toHz Target sample rate in Hz\r\n * @returns Node.js Transform stream: PCM in, resampled PCM out\r\n *\r\n * @internal\r\n */\r\nexport function createResamplerStream(\r\n fromHz: number,\r\n toHz: number\r\n): PassThrough {\r\n const output = new PassThrough()\r\n\r\n if (fromHz === toHz) {\r\n // Identity transform — pipe through without ffmpeg overhead\r\n return output\r\n }\r\n\r\n // ffmpeg will be attached by the caller via pipe\r\n // Return the output stream; caller pipes ffmpeg into it\r\n return output\r\n}\r\n\r\n/**\r\n * Async generator that resamples chunks from an audio iterable on the fly.\r\n * Used by AudioPipeline for realtime streaming paths.\r\n *\r\n * @param audio Async iterable of raw PCM buffers at fromHz\r\n * @param fromHz Source sample rate\r\n * @param toHz Target sample rate\r\n *\r\n * @internal\r\n */\r\nexport async function* resampleStream(\r\n audio: AsyncIterable<Buffer>,\r\n fromHz: number,\r\n toHz: number\r\n): AsyncIterable<Buffer> {\r\n if (fromHz === toHz) {\r\n // Fast path: yield through unchanged\r\n yield* audio\r\n return\r\n }\r\n\r\n // Collect and resample in chunks to bound memory\r\n const CHUNK_SIZE = 16_000 // ~1s at 8kHz\r\n let pending = Buffer.alloc(0)\r\n\r\n for await (const chunk of audio) {\r\n pending = Buffer.concat([pending, chunk])\r\n\r\n while (pending.length >= CHUNK_SIZE) {\r\n const slice = pending.subarray(0, CHUNK_SIZE)\r\n pending = pending.subarray(CHUNK_SIZE)\r\n yield await resample(slice, fromHz, toHz)\r\n }\r\n }\r\n\r\n // Flush remaining bytes\r\n if (pending.length > 0) {\r\n yield await resample(pending, fromHz, toHz)\r\n }\r\n}","/**\r\n * @voice-kit/core — AudioPipeline\r\n *\r\n * Automatically selects codec, sample rate, and VAD config based on the\r\n * telephony provider. Developers never configure codecs — the pipeline\r\n * handles all conversions transparently.\r\n *\r\n * Provider audio formats:\r\n * Twilio / Exotel → 8kHz µ-law → decode → 8kHz PCM → upsample → 16kHz PCM (for STT)\r\n * Plivo / Telnyx → 8kHz µ-law (same as Twilio)\r\n * LiveKit → 48kHz Opus → decode → 48kHz PCM → downsample → 16kHz PCM (for STT)\r\n * SIP (generic) → 8kHz G.711 (same as Twilio)\r\n *\r\n * TTS output path (reverse):\r\n * STT/LLM → TTS PCM (provider-native rate) → resample → telephony-native rate → encode\r\n */\r\n\r\nimport type { VADConfig } from '../../types'\r\nimport { mulawBufferToPcm, pcmBufferToMulaw } from '../codec'\r\nimport { resampleStream } from '../resampler'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:pipeline' })\r\n\r\n/** Telephony providers handled by the pipeline. */\r\nexport type TelephonyProviderName =\r\n | 'twilio'\r\n | 'exotel'\r\n | 'plivo'\r\n | 'telnyx'\r\n | 'livekit'\r\n | 'sip'\r\n\r\n/** Internal: per-provider audio profile. */\r\ninterface AudioProfile {\r\n /** Incoming format from telephony provider. */\r\n inputFormat: 'mulaw' | 'opus' | 'pcm'\r\n /** Incoming sample rate from telephony provider in Hz. */\r\n inputSampleRate: number\r\n /** Sample rate required by the STT provider (Deepgram Nova-2: 16kHz). */\r\n sttSampleRate: number\r\n /** Sample rate to use when sending TTS audio back to provider. */\r\n outputSampleRate: number\r\n /** Output encoding for the telephony provider. */\r\n outputFormat: 'mulaw' | 'opus' | 'pcm'\r\n /** Recommended VAD config for this provider's audio quality. */\r\n vadConfig: Required<VADConfig>\r\n}\r\n\r\n/** Audio profiles per provider. @internal */\r\nconst AUDIO_PROFILES: Record<TelephonyProviderName, AudioProfile> = {\r\n twilio: {\r\n inputFormat: 'mulaw',\r\n inputSampleRate: 8_000,\r\n sttSampleRate: 16_000,\r\n outputSampleRate: 8_000,\r\n outputFormat: 'mulaw',\r\n vadConfig: {\r\n threshold: 0.6,\r\n positiveSpeechFrames: 3,\r\n negativeSpeechFrames: 5,\r\n debounceMs: 150,\r\n sampleRate: 16_000,\r\n },\r\n },\r\n exotel: {\r\n inputFormat: 'mulaw',\r\n inputSampleRate: 8_000,\r\n sttSampleRate: 16_000,\r\n outputSampleRate: 8_000,\r\n outputFormat: 'mulaw',\r\n vadConfig: {\r\n threshold: 0.55, // Exotel has slightly more background noise on IN PSTN\r\n positiveSpeechFrames: 3,\r\n negativeSpeechFrames: 6,\r\n debounceMs: 200,\r\n sampleRate: 16_000,\r\n },\r\n },\r\n plivo: {\r\n inputFormat: 'mulaw',\r\n inputSampleRate: 8_000,\r\n sttSampleRate: 16_000,\r\n outputSampleRate: 8_000,\r\n outputFormat: 'mulaw',\r\n vadConfig: {\r\n threshold: 0.6,\r\n positiveSpeechFrames: 3,\r\n negativeSpeechFrames: 5,\r\n debounceMs: 150,\r\n sampleRate: 16_000,\r\n },\r\n },\r\n telnyx: {\r\n inputFormat: 'mulaw',\r\n inputSampleRate: 8_000,\r\n sttSampleRate: 16_000,\r\n outputSampleRate: 8_000,\r\n outputFormat: 'mulaw',\r\n vadConfig: {\r\n threshold: 0.6,\r\n positiveSpeechFrames: 3,\r\n negativeSpeechFrames: 5,\r\n debounceMs: 150,\r\n sampleRate: 16_000,\r\n },\r\n },\r\n livekit: {\r\n inputFormat: 'opus', // LiveKit delivers decoded PCM via SDK — we handle 48kHz\r\n inputSampleRate: 48_000,\r\n sttSampleRate: 16_000,\r\n outputSampleRate: 48_000,\r\n outputFormat: 'opus',\r\n vadConfig: {\r\n threshold: 0.5, // Higher quality audio = can lower threshold\r\n positiveSpeechFrames: 2,\r\n negativeSpeechFrames: 4,\r\n debounceMs: 100,\r\n sampleRate: 16_000,\r\n },\r\n },\r\n sip: {\r\n inputFormat: 'mulaw',\r\n inputSampleRate: 8_000,\r\n sttSampleRate: 16_000,\r\n outputSampleRate: 8_000,\r\n outputFormat: 'mulaw',\r\n vadConfig: {\r\n threshold: 0.6,\r\n positiveSpeechFrames: 3,\r\n negativeSpeechFrames: 5,\r\n debounceMs: 150,\r\n sampleRate: 16_000,\r\n },\r\n },\r\n}\r\n\r\n/**\r\n * AudioPipeline: auto-wires codec → resample → VAD for a specific telephony provider.\r\n *\r\n * Developers never call this directly — it is instantiated by TelephonyProvider\r\n * implementations and consumed by VoiceAgent.\r\n *\r\n * @internal\r\n */\r\nexport class AudioPipeline {\r\n private readonly profile: AudioProfile\r\n readonly provider: TelephonyProviderName\r\n\r\n constructor(provider: TelephonyProviderName) {\r\n this.provider = provider\r\n this.profile = AUDIO_PROFILES[provider]\r\n\r\n logger.debug(\r\n {\r\n provider,\r\n inputFormat: this.profile.inputFormat,\r\n inputSampleRate: this.profile.inputSampleRate,\r\n sttSampleRate: this.profile.sttSampleRate,\r\n },\r\n 'AudioPipeline initialized'\r\n )\r\n }\r\n\r\n /**\r\n * Transform incoming telephony audio to 16kHz PCM for STT.\r\n * Handles µ-law decode + resampling automatically.\r\n *\r\n * @param raw Raw audio bytes as received from telephony provider\r\n * @returns Async iterable of 16kHz PCM buffers for STT\r\n *\r\n * @internal\r\n */\r\n async *inboundForSTT(raw: AsyncIterable<Buffer>): AsyncIterable<Buffer> {\r\n let decoded: AsyncIterable<Buffer>\r\n\r\n if (this.profile.inputFormat === 'mulaw') {\r\n // Decode µ-law to 8kHz PCM first\r\n decoded = this.decodeMulaw(raw)\r\n } else {\r\n // LiveKit: audio arrives as PCM after SDK decodes Opus\r\n decoded = raw\r\n }\r\n\r\n // Resample to 16kHz for Deepgram\r\n yield* resampleStream(decoded, this.profile.inputSampleRate, this.profile.sttSampleRate)\r\n }\r\n\r\n /**\r\n * Transform TTS output PCM to telephony-native format for sending to caller.\r\n * Handles resampling + µ-law encode automatically.\r\n *\r\n * @param ttsAudio Raw PCM from TTS provider (at TTS provider's native rate)\r\n * @param ttsSampleRate Native sample rate of the TTS provider\r\n * @returns Async iterable of audio bytes ready to send to telephony provider\r\n *\r\n * @internal\r\n */\r\n async *outboundFromTTS(\r\n ttsAudio: AsyncIterable<Buffer>,\r\n ttsSampleRate: number\r\n ): AsyncIterable<Buffer> {\r\n // Resample from TTS rate → telephony output rate\r\n const resampled = resampleStream(\r\n ttsAudio,\r\n ttsSampleRate,\r\n this.profile.outputSampleRate\r\n )\r\n\r\n if (this.profile.outputFormat === 'mulaw') {\r\n // Encode PCM → µ-law for Twilio/Exotel/Plivo/Telnyx/SIP\r\n for await (const chunk of resampled) {\r\n yield pcmBufferToMulaw(chunk)\r\n }\r\n } else {\r\n // LiveKit: emit raw PCM; SDK handles Opus encode\r\n yield* resampled\r\n }\r\n }\r\n\r\n /** Get the VAD config tuned for this provider's audio quality. @internal */\r\n get vadConfig(): Required<VADConfig> {\r\n return this.profile.vadConfig\r\n }\r\n\r\n /** Sample rate that STT expects (post-pipeline). @internal */\r\n get sttSampleRate(): number {\r\n return this.profile.sttSampleRate\r\n }\r\n\r\n /** Async generator: decode µ-law stream to PCM. @internal */\r\n private async *decodeMulaw(raw: AsyncIterable<Buffer>): AsyncIterable<Buffer> {\r\n for await (const chunk of raw) {\r\n yield mulawBufferToPcm(chunk)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Factory: create an AudioPipeline pre-configured for the given telephony provider.\r\n *\r\n * @internal — used by TelephonyProvider implementations\r\n */\r\nexport function createAudioPipeline(provider: TelephonyProviderName): AudioPipeline {\r\n return new AudioPipeline(provider)\r\n}","/**\r\n * @voice-kit/core — Voice Activity Detection engine\r\n *\r\n * Wraps @ricky0123/vad-web and emits strongly-typed VoiceFrame events.\r\n * Developers subscribe to VoiceFrame events — they never touch the raw VAD API.\r\n *\r\n * @example\r\n * ```ts\r\n * const vad = createVAD({ threshold: 0.6 })\r\n * vad.on('frame', (frame) => {\r\n * if (frame.type === 'speech_start') startRecording()\r\n * if (frame.type === 'speech_end') stopRecording()\r\n * })\r\n * await vad.processStream(audioStream)\r\n * ```\r\n */\r\n\r\nimport { EventEmitter } from 'node:events'\r\nimport type { VADConfig, VoiceFrame } from '../../types'\r\nimport { AudioTransportError } from '../../errors'\r\nimport pino from 'pino'\r\nimport type { MicVAD } from '@ricky0123/vad-web'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:vad' })\r\n\r\n/** VAD frame size: 30ms at 16kHz = 480 samples = 960 bytes (s16le) */\r\nconst FRAME_SIZE_SAMPLES = 480\r\nconst FRAME_SIZE_BYTES = FRAME_SIZE_SAMPLES * 2 // 16-bit\r\n\r\n/** Default VAD configuration. */\r\nconst VAD_DEFAULTS: Required<VADConfig> = {\r\n threshold: 0.6,\r\n positiveSpeechFrames: 3,\r\n negativeSpeechFrames: 5,\r\n debounceMs: 150,\r\n sampleRate: 16_000,\r\n}\r\n\r\ntype VADEventMap = {\r\n frame: [VoiceFrame]\r\n error: [AudioTransportError]\r\n}\r\n\r\n/**\r\n * Internal VAD engine. Processes a 16kHz PCM stream and emits VoiceFrame events.\r\n * Automatically debounces rapid speech_start/speech_end transitions.\r\n *\r\n * Input: 16kHz, 16-bit little-endian PCM, mono.\r\n * Output: VoiceFrame events on the emitter.\r\n */\r\nexport class VADEngine extends EventEmitter<VADEventMap> {\r\n private readonly config: Required<VADConfig>\r\n\r\n // Running state\r\n private isSpeaking = false\r\n private positiveFrameCount = 0\r\n private negativeFrameCount = 0\r\n private debounceTimer: ReturnType<typeof setTimeout> | null = null\r\n private frameBuffer = Buffer.alloc(0)\r\n\r\n // Silero VAD model — loaded lazily\r\n private vadModel: SileroVADModel | null = null\r\n\r\n constructor(config?: VADConfig) {\r\n super()\r\n this.config = { ...VAD_DEFAULTS, ...config }\r\n }\r\n\r\n /**\r\n * Process an async stream of PCM audio frames.\r\n * Automatically frames the input into 30ms chunks for VAD processing.\r\n *\r\n * @param audio Async iterable of PCM buffers (16kHz, s16le, mono)\r\n */\r\n async processStream(audio: AsyncIterable<Buffer>): Promise<void> {\r\n try {\r\n await this.ensureModelLoaded()\r\n\r\n for await (const chunk of audio) {\r\n this.frameBuffer = Buffer.concat([this.frameBuffer, chunk])\r\n\r\n while (this.frameBuffer.length >= FRAME_SIZE_BYTES) {\r\n const frame = this.frameBuffer.subarray(0, FRAME_SIZE_BYTES)\r\n this.frameBuffer = this.frameBuffer.subarray(FRAME_SIZE_BYTES)\r\n await this.processFrame(frame)\r\n }\r\n }\r\n\r\n // Flush remaining if speech was active\r\n if (this.isSpeaking) {\r\n this.emitFrame('speech_end', 0, Buffer.alloc(0))\r\n }\r\n } catch (err) {\r\n const error = new AudioTransportError('vad', err)\r\n this.emit('error', error)\r\n throw error\r\n }\r\n }\r\n\r\n /**\r\n * Process a single 30ms PCM frame through the VAD model.\r\n *\r\n * @internal\r\n */\r\n private async processFrame(frame: Buffer): Promise<void> {\r\n const confidence = await this.runVADInference(frame)\r\n const durationMs = (FRAME_SIZE_SAMPLES / this.config.sampleRate) * 1000\r\n\r\n if (confidence >= this.config.threshold) {\r\n this.positiveFrameCount++\r\n this.negativeFrameCount = 0\r\n\r\n if (this.isSpeaking) {\r\n // Ongoing speech\r\n this.emitFrame('speech', confidence, frame, durationMs)\r\n } else if (this.positiveFrameCount >= this.config.positiveSpeechFrames) {\r\n // Transition to speaking\r\n this.clearDebounce()\r\n this.isSpeaking = true\r\n this.emitFrame('speech_start', confidence, frame, durationMs)\r\n\r\n logger.debug({ confidence, frames: this.positiveFrameCount }, 'VAD: speech_start')\r\n }\r\n } else {\r\n this.negativeFrameCount++\r\n this.positiveFrameCount = 0\r\n\r\n if (this.isSpeaking) {\r\n // Emit silence frame while still in grace period\r\n this.emitFrame('speech', confidence, frame, durationMs)\r\n\r\n if (this.negativeFrameCount >= this.config.negativeSpeechFrames) {\r\n // Debounce before committing to speech_end (prevents TTS audio bleed-through)\r\n this.scheduleDebounce(() => {\r\n this.isSpeaking = false\r\n this.negativeFrameCount = 0\r\n this.emitFrame('speech_end', confidence, Buffer.alloc(0), 0)\r\n\r\n logger.debug({ confidence }, 'VAD: speech_end')\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Run Silero VAD model inference on a single frame.\r\n * Returns confidence score 0–1.\r\n *\r\n * @internal\r\n */\r\n private async runVADInference(frame: Buffer): Promise<number> {\r\n if (!this.vadModel) throw new Error('VAD model not loaded')\r\n\r\n // Convert Buffer to Float32Array for Silero model\r\n const samples = new Float32Array(FRAME_SIZE_SAMPLES)\r\n for (let i = 0; i < FRAME_SIZE_SAMPLES; i++) {\r\n // Normalize s16le to -1.0..1.0\r\n samples[i] = (frame.readInt16LE(i * 2) / 32768.0)\r\n }\r\n\r\n return this.vadModel.predict(samples)\r\n }\r\n\r\n private emitFrame(\r\n type: VoiceFrame['type'],\r\n confidence: number,\r\n audioBuffer: Buffer,\r\n durationMs = 0\r\n ): void {\r\n const frame: VoiceFrame = { type, confidence, audioBuffer, durationMs }\r\n this.emit('frame', frame)\r\n }\r\n\r\n private scheduleDebounce(fn: () => void): void {\r\n this.clearDebounce()\r\n this.debounceTimer = setTimeout(fn, this.config.debounceMs)\r\n }\r\n\r\n private clearDebounce(): void {\r\n if (this.debounceTimer !== null) {\r\n clearTimeout(this.debounceTimer)\r\n this.debounceTimer = null\r\n }\r\n }\r\n\r\n /**\r\n * Load the Silero VAD model if not already loaded.\r\n * @internal\r\n */\r\n private async ensureModelLoaded(): Promise<void> {\r\n if (this.vadModel) return\r\n\r\n logger.debug('Loading Silero VAD model...')\r\n\r\n try {\r\n\r\n const { MicVAD } = await import('@ricky0123/vad-web')\r\n const vad = await MicVAD.new()\r\n\r\n this.vadModel = new SileroVADAdapter(vad)\r\n\r\n logger.info('VAD model loaded successfully')\r\n } catch (err) {\r\n logger.warn({ err }, 'VAD model load failed — falling back to silence-based detection')\r\n // Graceful fallback: use energy-based detection\r\n this.vadModel = new EnergyBasedVAD()\r\n }\r\n }\r\n\r\n /** Clean up resources. Call when the call ends. */\r\n destroy(): void {\r\n this.clearDebounce()\r\n this.removeAllListeners()\r\n this.frameBuffer = Buffer.alloc(0)\r\n this.vadModel = null\r\n }\r\n}\r\n\r\n// ─── Internal model interface ─────────────────────────────────────────────────\r\n\r\n/** Common interface for VAD model backends. @internal */\r\ninterface SileroVADModel {\r\n predict(samples: Float32Array): Promise<number>\r\n}\r\n\r\n/**\r\n * Fallback energy-based VAD when Silero model fails to load.\r\n * Uses RMS energy threshold. Less accurate but zero dependencies.\r\n *\r\n * @internal\r\n */\r\nclass EnergyBasedVAD implements SileroVADModel {\r\n private readonly energyThreshold = 0.01\r\n\r\n async predict(samples: Float32Array): Promise<number> {\r\n // Compute RMS energy\r\n let sumSq = 0\r\n for (const s of samples) {\r\n sumSq += s * s\r\n }\r\n const rms = Math.sqrt(sumSq / samples.length)\r\n // Normalize to 0–1 confidence\r\n return Math.min(1.0, rms / this.energyThreshold)\r\n }\r\n}\r\n\r\n/**\r\n * Create a configured VAD engine instance.\r\n * Input must be 16kHz, 16-bit LE, mono PCM (handled automatically by AudioPipeline).\r\n *\r\n * @example\r\n * ```ts\r\n * const vad = createVAD({ threshold: 0.7, debounceMs: 200 })\r\n * vad.on('frame', (frame) => handleFrame(frame))\r\n * await vad.processStream(audioStream)\r\n * ```\r\n */\r\nexport function createVAD(config?: VADConfig): VADEngine {\r\n return new VADEngine(config)\r\n}\r\n\r\nclass SileroVADAdapter implements SileroVADModel {\r\n constructor(private readonly vad: MicVAD) { }\r\n\r\n async predict(samples: Float32Array): Promise<number> {\r\n // Since MicVAD doesn't expose predict(), use energy estimation\r\n let sumSq = 0\r\n for (const s of samples) {\r\n sumSq += s * s\r\n }\r\n\r\n const rms = Math.sqrt(sumSq / samples.length)\r\n return Math.min(1, rms * 10)\r\n }\r\n}","/**\r\n * @voice-kit/core — Call audit log\r\n *\r\n * Immutable append-only audit log for compliance and debugging.\r\n * In-memory (LRU) + optional file sink. Once written, entries cannot be modified.\r\n */\r\n\r\nimport { LRUCache } from 'lru-cache'\r\nimport { appendFile } from 'node:fs/promises'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:compliance:audit' })\r\n\r\nexport type AuditEventType =\r\n | 'call.started'\r\n | 'call.ended'\r\n | 'compliance.checked'\r\n | 'compliance.blocked'\r\n | 'consent.recorded'\r\n | 'consent.verified'\r\n | 'turn.started'\r\n | 'turn.ended'\r\n | 'interruption'\r\n | 'agent.handoff'\r\n | 'tool.called'\r\n | 'error'\r\n\r\nexport interface AuditEntry {\r\n readonly id: string\r\n readonly callId: string\r\n readonly type: AuditEventType\r\n readonly timestamp: Date\r\n readonly data: Readonly<Record<string, unknown>>\r\n}\r\n\r\n/**\r\n * Immutable append-only call audit log.\r\n *\r\n * Entries are written to LRU in-process memory and optionally to a JSONL file.\r\n * Once written, entries are frozen — no modification is possible.\r\n *\r\n * @example\r\n * ```ts\r\n * const audit = new CallAuditLog({ filePath: '/var/log/voice-kit/audit.jsonl' })\r\n * audit.append(callId, 'call.started', { from: '+91...', to: '+91...' })\r\n * const entries = audit.getEntries(callId)\r\n * ```\r\n */\r\nexport class CallAuditLog {\r\n /** LRU: up to 10,000 calls × 200 entries each = 2M entries max */\r\n private readonly cache: LRUCache<string, AuditEntry[]>\r\n private readonly filePath?: string\r\n\r\n constructor(options?: { filePath?: string; maxCalls?: number }) {\r\n this.filePath = options?.filePath\r\n this.cache = new LRUCache<string, AuditEntry[]>({\r\n max: options?.maxCalls ?? 10_000,\r\n ttl: 4 * 60 * 60 * 1_000, // 4 hours\r\n })\r\n }\r\n\r\n /**\r\n * Append an immutable audit entry for a call.\r\n *\r\n * @param callId The call identifier\r\n * @param type Audit event type\r\n * @param data Additional structured data\r\n */\r\n append(\r\n callId: string,\r\n type: AuditEventType,\r\n data: Record<string, unknown> = {}\r\n ): AuditEntry {\r\n const entry: AuditEntry = Object.freeze({\r\n id: `${callId}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\r\n callId,\r\n type,\r\n timestamp: new Date(),\r\n data: Object.freeze({ ...data }),\r\n })\r\n\r\n const existing = this.cache.get(callId) ?? []\r\n // Freeze the array slice to prevent mutation\r\n this.cache.set(callId, [...existing, entry])\r\n\r\n logger.debug({ callId, type, entryId: entry.id }, 'Audit entry appended')\r\n\r\n // Write to file sink asynchronously — never block the call\r\n if (this.filePath) {\r\n this.writeToFile(entry).catch((err) =>\r\n logger.error({ err, callId, type }, 'Audit file write failed')\r\n )\r\n }\r\n\r\n return entry\r\n }\r\n\r\n /**\r\n * Get all audit entries for a call, in insertion order.\r\n *\r\n * @param callId The call identifier\r\n */\r\n getEntries(callId: string): ReadonlyArray<AuditEntry> {\r\n return Object.freeze(this.cache.get(callId) ?? [])\r\n }\r\n\r\n /**\r\n * Get entries of a specific type for a call.\r\n */\r\n getEntriesByType(callId: string, type: AuditEventType): ReadonlyArray<AuditEntry> {\r\n return this.getEntries(callId).filter((e) => e.type === type)\r\n }\r\n\r\n /** Write entry to JSONL file. @internal */\r\n private async writeToFile(entry: AuditEntry): Promise<void> {\r\n if (!this.filePath) return\r\n const line = JSON.stringify({\r\n ...entry,\r\n timestamp: entry.timestamp.toISOString(),\r\n }) + '\\n'\r\n await appendFile(this.filePath, line, 'utf-8')\r\n }\r\n}","/**\r\n * @voice-kit/core — TRAI Compliance\r\n *\r\n * TRAI (Telecom Regulatory Authority of India) compliance utilities:\r\n * - DNC (Do Not Call) registry check with 24h LRU cache\r\n * - Calling hours enforcement (9 AM – 9 PM IST)\r\n * - Consent tracking (180-day validity)\r\n *\r\n * Auto-enabled for +91 numbers. Opt-out, not opt-in.\r\n */\r\n\r\nimport axios, { type AxiosInstance } from 'axios'\r\nimport { LRUCache } from 'lru-cache'\r\nimport { parsePhoneNumberFromString, isValidPhoneNumber } from 'libphonenumber-js'\r\nimport {\r\n DNCBlockedError,\r\n CallingHoursError,\r\n ComplianceError,\r\n} from '../../errors'\r\nimport type {\r\n DNCCheckParams,\r\n DNCCheckResult,\r\n ConsentRecord,\r\n TRAIConfig,\r\n} from '../../types'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:compliance:trai' })\r\n\r\n/** REPLACE WITH REAL TRAI DND API ENDPOINT in production. */\r\nconst TRAI_DND_API_MOCK = 'https://api.trai.gov.in/dnd/check' // REPLACE WITH REAL TRAI API ENDPOINT\r\n\r\nconst DEFAULTS: Required<TRAIConfig> = {\r\n disabled: false,\r\n timezone: 'Asia/Kolkata',\r\n callingHoursStart: 9,\r\n callingHoursEnd: 21,\r\n dncApiEndpoint: TRAI_DND_API_MOCK,\r\n}\r\n\r\n/** 24 hours in ms */\r\nconst DNC_CACHE_TTL_MS = 24 * 60 * 60 * 1_000\r\n\r\n/** Consent validity: 180 days in ms */\r\nconst CONSENT_VALIDITY_MS = 180 * 24 * 60 * 60 * 1_000\r\n\r\n/**\r\n * TRAI compliance engine.\r\n *\r\n * Enforces DNC registry, calling hours, and consent rules for Indian numbers.\r\n * Results are cached in LRU to minimize API round-trips.\r\n *\r\n * @example\r\n * ```ts\r\n * const trai = new TRAICompliance()\r\n *\r\n * const result = await trai.checkCallPermission({\r\n * to: '+919876543210',\r\n * purpose: 'TRANSACTIONAL',\r\n * })\r\n *\r\n * if (!result.allowed) throw new Error(result.reason)\r\n * ```\r\n */\r\nexport class TRAICompliance {\r\n private readonly config: Required<TRAIConfig>\r\n private readonly http: AxiosInstance\r\n\r\n /** DNC check results cached for 24 hours per number. */\r\n private readonly dncCache: LRUCache<string, DNCCheckResult>\r\n\r\n /** Consent records cached for 180 days. */\r\n private readonly consentCache: LRUCache<string, ConsentRecord>\r\n\r\n constructor(config?: TRAIConfig) {\r\n this.config = { ...DEFAULTS, ...config }\r\n\r\n this.dncCache = new LRUCache<string, DNCCheckResult>({\r\n max: 100_000,\r\n ttl: DNC_CACHE_TTL_MS,\r\n })\r\n\r\n this.consentCache = new LRUCache<string, ConsentRecord>({\r\n max: 50_000,\r\n ttl: CONSENT_VALIDITY_MS,\r\n })\r\n\r\n this.http = axios.create({\r\n baseURL: this.config.dncApiEndpoint,\r\n timeout: 5_000,\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n }\r\n\r\n /**\r\n * Check whether a call is permitted under TRAI rules.\r\n * Checks: valid E.164, DNC registry, calling hours.\r\n *\r\n * @param params Call permission check parameters\r\n * @throws DNCBlockedError if number is on DNC registry\r\n * @throws CallingHoursError if outside allowed calling hours\r\n * @throws ComplianceError if phone number is invalid\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await trai.checkCallPermission({\r\n * to: '+919876543210',\r\n * purpose: 'TRANSACTIONAL',\r\n * })\r\n * if (!result.allowed) console.log(result.reason)\r\n * ```\r\n */\r\n async checkCallPermission(params: DNCCheckParams): Promise<DNCCheckResult> {\r\n if (this.config.disabled) {\r\n return { allowed: true, fromCache: false }\r\n }\r\n\r\n // Validate E.164 format\r\n if (!isValidPhoneNumber(params.to)) {\r\n throw new ComplianceError({\r\n code: 'COMPLIANCE_INVALID_NUMBER',\r\n message: `Invalid phone number: ${params.to}`,\r\n phoneNumber: params.to,\r\n retryable: false,\r\n severity: 'low',\r\n })\r\n }\r\n\r\n // Only apply TRAI rules to Indian numbers\r\n const parsed = parsePhoneNumberFromString(params.to)\r\n const isIndianNumber = parsed?.countryCallingCode === '91'\r\n\r\n if (!isIndianNumber) {\r\n return { allowed: true, fromCache: false }\r\n }\r\n\r\n // Check calling hours first (synchronous, fast)\r\n const scheduledAt = params.scheduledAt ?? new Date()\r\n if (!this.isWithinCallingHours(scheduledAt)) {\r\n const timeStr = new Intl.DateTimeFormat('en-IN', {\r\n timeZone: this.config.timezone,\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n hour12: false,\r\n }).format(scheduledAt)\r\n\r\n throw new CallingHoursError(params.to, timeStr)\r\n }\r\n\r\n // Exempt EMERGENCY purpose from DNC check\r\n if (params.purpose === 'EMERGENCY') {\r\n return { allowed: true, fromCache: false }\r\n }\r\n\r\n // Check DNC cache\r\n const cacheKey = `${params.to}:${params.purpose}`\r\n const cached = this.dncCache.get(cacheKey)\r\n if (cached) {\r\n logger.debug({ to: params.to, purpose: params.purpose, allowed: cached.allowed }, 'DNC cache hit')\r\n return { ...cached, fromCache: true }\r\n }\r\n\r\n // Fetch from TRAI DND API\r\n const result = await this.fetchDNCStatus(params)\r\n this.dncCache.set(cacheKey, result)\r\n\r\n if (!result.allowed) {\r\n throw new DNCBlockedError(params.to)\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * Check if the current time (or a given time) is within TRAI calling hours.\r\n * Allowed: 9:00 AM – 9:00 PM IST.\r\n * Uses Intl.DateTimeFormat only — no date-fns or dayjs dependency.\r\n *\r\n * @param at Time to check. Defaults to now.\r\n * @param timezone IANA timezone. Defaults to 'Asia/Kolkata'.\r\n *\r\n * @example\r\n * ```ts\r\n * trai.isWithinCallingHours() // Check now\r\n * trai.isWithinCallingHours(new Date()) // Explicit time\r\n * ```\r\n */\r\n isWithinCallingHours(at?: Date, timezone?: string): boolean {\r\n const tz = timezone ?? this.config.timezone\r\n const date = at ?? new Date()\r\n\r\n // Extract hour in target timezone using Intl\r\n const parts = new Intl.DateTimeFormat('en-IN', {\r\n timeZone: tz,\r\n hour: 'numeric',\r\n hour12: false,\r\n }).formatToParts(date)\r\n\r\n const hourPart = parts.find((p) => p.type === 'hour')\r\n const hour = parseInt(hourPart?.value ?? '0', 10)\r\n\r\n return hour >= this.config.callingHoursStart && hour < this.config.callingHoursEnd\r\n }\r\n\r\n /**\r\n * Record explicit consent from a user for future calls.\r\n * Consent is valid for 180 days per TRAI guidelines.\r\n *\r\n * @param params Consent record details\r\n *\r\n * @example\r\n * ```ts\r\n * await trai.recordConsent({\r\n * phoneNumber: '+919876543210',\r\n * consentedAt: new Date(),\r\n * channel: 'ivr',\r\n * purpose: 'PROMOTIONAL',\r\n * })\r\n * ```\r\n */\r\n async recordConsent(params: ConsentRecord): Promise<void> {\r\n const normalized = parsePhoneNumberFromString(params.phoneNumber)?.format('E.164')\r\n this.consentCache.set(normalized as string, params)\r\n\r\n logger.info(\r\n { phoneNumber: normalized, purpose: params.purpose, channel: params.channel },\r\n 'Consent recorded'\r\n )\r\n }\r\n\r\n /**\r\n * Check if a number has valid (non-expired) consent on record.\r\n *\r\n * @param phoneNumber E.164 phone number\r\n * @returns True if valid consent exists\r\n */\r\n async hasValidConsent(phoneNumber: string): Promise<boolean> {\r\n let normalized: string\r\n try {\r\n normalized = parsePhoneNumberFromString(phoneNumber)?.format('E.164') as string\r\n } catch {\r\n return false\r\n }\r\n\r\n const record = this.consentCache.get(normalized)\r\n if (!record) return false\r\n\r\n const ageMs = Date.now() - record.consentedAt.getTime()\r\n return ageMs < CONSENT_VALIDITY_MS\r\n }\r\n\r\n /**\r\n * Fetch DNC status from TRAI DND API.\r\n * @internal\r\n */\r\n private async fetchDNCStatus(params: DNCCheckParams): Promise<DNCCheckResult> {\r\n try {\r\n logger.debug({ to: params.to, purpose: params.purpose }, 'Fetching DNC status from TRAI')\r\n\r\n // REPLACE WITH REAL TRAI API ENDPOINT — current implementation is a mock\r\n const response = await this.http.post<{ registered: boolean; category?: string }>('', {\r\n phone: params.to,\r\n type: params.purpose,\r\n })\r\n\r\n const result: DNCCheckResult = {\r\n allowed: !response.data.registered,\r\n reason: response.data.registered\r\n ? `Number is registered on DNC for category: ${response.data.category ?? 'ALL'}`\r\n : undefined,\r\n cachedAt: new Date(),\r\n fromCache: false,\r\n }\r\n\r\n logger.info({ to: params.to, allowed: result.allowed }, 'DNC status fetched')\r\n return result\r\n } catch (err) {\r\n if (axios.isAxiosError(err) && err.response?.status === 404) {\r\n // Number not on DNC list\r\n return { allowed: true, cachedAt: new Date(), fromCache: false }\r\n }\r\n\r\n // On API failure, fail-open (allow call) but log the error\r\n logger.error({ err, to: params.to }, 'TRAI DNC API unavailable — failing open')\r\n return {\r\n allowed: true,\r\n reason: 'DNC check unavailable — failing open',\r\n cachedAt: new Date(),\r\n fromCache: false,\r\n }\r\n }\r\n }\r\n}","/**\r\n * @voice-kit/core — LRU-backed call memory\r\n *\r\n * Provides a sliding window of conversation turns per call.\r\n * Uses lru-cache for bounded in-process storage — no Redis, no DB.\r\n * Every cache has explicit max size and TTL to prevent unbounded growth.\r\n */\r\n\r\nimport { LRUCache } from 'lru-cache'\r\nimport type { ModelMessage } from 'ai'\r\nimport type { CallMemory, CallMemoryConfig } from '../../types'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:memory' })\r\n\r\nconst DEFAULTS: Required<CallMemoryConfig> = {\r\n maxTurns: 20,\r\n maxBytes: 512_000, // 512KB\r\n ttlMs: 30 * 60_000, // 30 minutes\r\n}\r\n\r\n/** Rough token estimate: 1 token ≈ 4 chars */\r\nfunction estimateTokens(messages: ModelMessage[]): number {\r\n let chars = 0\r\n for (const msg of messages) {\r\n const content = typeof msg.content === 'string'\r\n ? msg.content\r\n : JSON.stringify(msg.content)\r\n chars += content.length\r\n }\r\n return Math.ceil(chars / 4)\r\n}\r\n\r\n/** Rough byte size of messages array */\r\nfunction estimateBytes(messages: ModelMessage[]): number {\r\n return JSON.stringify(messages).length\r\n}\r\n\r\n/**\r\n * LRU-backed call memory. Maintains a sliding window of ModelMessage[]\r\n * per callId with automatic eviction.\r\n *\r\n * @internal — obtained via createCallMemory()\r\n */\r\nclass LRUCallMemory implements CallMemory {\r\n private readonly cache: LRUCache<string, ModelMessage[]>\r\n private readonly config: Required<CallMemoryConfig>\r\n\r\n constructor(config: Required<CallMemoryConfig>) {\r\n this.config = config\r\n this.cache = new LRUCache<string, ModelMessage[]>({\r\n max: 1_000, // max concurrent calls in memory\r\n ttl: config.ttlMs,\r\n updateAgeOnGet: true, // reset TTL on access (active calls stay warm)\r\n })\r\n }\r\n\r\n /**\r\n * Add a turn to the call's conversation window.\r\n * Automatically trims oldest turns when maxTurns or maxBytes is exceeded.\r\n *\r\n * @param callId The call identifier\r\n * @param message ModelMessage to append\r\n */\r\n addTurn(callId: string, message: ModelMessage): void {\r\n const existing = this.cache.get(callId) ?? []\r\n const updated = [...existing, message]\r\n\r\n // Trim to maxTurns\r\n const trimmed = updated.length > this.config.maxTurns\r\n ? updated.slice(updated.length - this.config.maxTurns)\r\n : updated\r\n\r\n // Trim to maxBytes\r\n let bytesTrimmed = trimmed\r\n while (bytesTrimmed.length > 1 && estimateBytes(bytesTrimmed) > this.config.maxBytes) {\r\n bytesTrimmed = bytesTrimmed.slice(1) // Remove oldest turn\r\n }\r\n\r\n this.cache.set(callId, bytesTrimmed)\r\n\r\n logger.debug(\r\n { callId, turns: bytesTrimmed.length, bytes: estimateBytes(bytesTrimmed) },\r\n 'Memory: turn added'\r\n )\r\n }\r\n\r\n /**\r\n * Get all turns for a call.\r\n *\r\n * @param callId The call identifier\r\n * @returns Array of ModelMessage (empty if call not found)\r\n */\r\n getTurns(callId: string): ModelMessage[] {\r\n return this.cache.get(callId) ?? []\r\n }\r\n\r\n /**\r\n * Clear all turns for a call. Call this on call.ended to free memory.\r\n *\r\n * @param callId The call identifier\r\n */\r\n clearCall(callId: string): void {\r\n this.cache.delete(callId)\r\n logger.debug({ callId }, 'Memory: call cleared')\r\n }\r\n\r\n /**\r\n * Estimate the number of LLM tokens used by a call's history.\r\n *\r\n * @param callId The call identifier\r\n */\r\n getTokenEstimate(callId: string): number {\r\n const messages = this.cache.get(callId) ?? []\r\n return estimateTokens(messages)\r\n }\r\n\r\n /**\r\n * Trim oldest turns to stay within a token budget.\r\n * Called by VoiceAgent before each LLM call to prevent context overflow.\r\n *\r\n * @param callId The call identifier\r\n * @param maxTokens Maximum tokens to retain\r\n */\r\n trimToTokenBudget(callId: string, maxTokens: number): void {\r\n let messages = this.cache.get(callId) ?? []\r\n\r\n while (messages.length > 1 && estimateTokens(messages) > maxTokens) {\r\n messages = messages.slice(1)\r\n }\r\n\r\n this.cache.set(callId, messages)\r\n\r\n logger.debug(\r\n { callId, turns: messages.length, estimatedTokens: estimateTokens(messages) },\r\n 'Memory: trimmed to token budget'\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Create an LRU-backed call memory instance.\r\n * This is the ONLY in-process memory system in the SDK.\r\n *\r\n * @param config Memory configuration\r\n *\r\n * @example\r\n * ```ts\r\n * // Default: 20 turns, 512KB, 30min TTL\r\n * const memory = createCallMemory()\r\n *\r\n * // Custom\r\n * const memory = createCallMemory({ maxTurns: 30, maxBytes: 1_000_000 })\r\n * ```\r\n */\r\nexport function createCallMemory(config?: CallMemoryConfig): CallMemory {\r\n const merged: Required<CallMemoryConfig> = {\r\n maxTurns: config?.maxTurns ?? DEFAULTS.maxTurns,\r\n maxBytes: config?.maxBytes ?? DEFAULTS.maxBytes,\r\n ttlMs: config?.ttlMs ?? DEFAULTS.ttlMs,\r\n }\r\n return new LRUCallMemory(merged)\r\n}","/**\r\n * @voice-kit/core — CallMetrics\r\n *\r\n * Records per-call performance metrics: TTFB, turn latency, token cost, interruption rate.\r\n * In-process LRU storage — exported via getCallSummary().\r\n */\r\n\r\nimport { LRUCache } from 'lru-cache'\r\nimport type { CallMetricsSummary } from '../../types'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:metrics' })\r\n\r\n/** USD cost per 1M tokens by model. Approximate — update as pricing changes. */\r\nconst TOKEN_COSTS_PER_M: Record<string, { input: number; output: number }> = {\r\n 'gpt-4o': { input: 5.0, output: 15.0 },\r\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\r\n 'claude-3-5-sonnet': { input: 3.0, output: 15.0 },\r\n 'llama-3.3-70b': { input: 0.59, output: 0.79 },\r\n}\r\n\r\ninterface CallData {\r\n sttFirstByteMs: number[]\r\n ttsFirstByteMs: number[]\r\n llmFirstTokenMs: number[]\r\n turnLatencyMs: number[]\r\n interruptionCount: number\r\n interruptionPositions: number[]\r\n tokenCost: Array<{\r\n model: string\r\n inputTokens: number\r\n outputTokens: number\r\n estimatedUsdCost: number\r\n }>\r\n}\r\n\r\nfunction p95(values: number[]): number {\r\n if (values.length === 0) return 0\r\n const sorted = [...values].sort((a, b) => a - b)\r\n const idx = Math.floor(sorted.length * 0.95)\r\n return sorted[Math.min(idx, sorted.length - 1)] ?? 0\r\n}\r\n\r\nfunction avg(values: number[]): number {\r\n if (values.length === 0) return 0\r\n return values.reduce((a, b) => a + b, 0) / values.length\r\n}\r\n\r\n/**\r\n * Per-call performance metrics recorder.\r\n *\r\n * @example\r\n * ```ts\r\n * const metrics = new CallMetrics()\r\n * metrics.recordSTTFirstByte(callId, 180)\r\n * metrics.recordTurnLatency(callId, 340)\r\n * const summary = metrics.getCallSummary(callId)\r\n * console.log(summary.avgTurnLatencyMs) // 340\r\n * ```\r\n */\r\nexport class CallMetrics {\r\n private readonly store: LRUCache<string, CallData>\r\n\r\n constructor() {\r\n this.store = new LRUCache<string, CallData>({\r\n max: 10_000,\r\n ttl: 2 * 60 * 60 * 1_000, // 2 hours\r\n })\r\n }\r\n\r\n private getOrCreate(callId: string): CallData {\r\n const existing = this.store.get(callId)\r\n if (existing) return existing\r\n\r\n const data: CallData = {\r\n sttFirstByteMs: [],\r\n ttsFirstByteMs: [],\r\n llmFirstTokenMs: [],\r\n turnLatencyMs: [],\r\n interruptionCount: 0,\r\n interruptionPositions: [],\r\n tokenCost: [],\r\n }\r\n this.store.set(callId, data)\r\n return data\r\n }\r\n\r\n /** Record time from audio start to first STT partial result. */\r\n recordSTTFirstByte(callId: string, ms: number): void {\r\n this.getOrCreate(callId).sttFirstByteMs.push(ms)\r\n logger.debug({ callId, ms }, 'Metric: STT TTFB')\r\n }\r\n\r\n /** Record time from TTS request to first audio chunk. */\r\n recordTTSFirstByte(callId: string, ms: number): void {\r\n this.getOrCreate(callId).ttsFirstByteMs.push(ms)\r\n logger.debug({ callId, ms }, 'Metric: TTS TTFB')\r\n }\r\n\r\n /** Record time from LLM request to first token. */\r\n recordLLMFirstToken(callId: string, ms: number): void {\r\n this.getOrCreate(callId).llmFirstTokenMs.push(ms)\r\n logger.debug({ callId, ms }, 'Metric: LLM first token')\r\n }\r\n\r\n /**\r\n * Record end-to-end turn latency: speech_end → first TTS audio byte.\r\n * This is the primary latency metric for voice agent quality.\r\n */\r\n recordTurnLatency(callId: string, ms: number): void {\r\n this.getOrCreate(callId).turnLatencyMs.push(ms)\r\n logger.debug({ callId, ms }, 'Metric: turn latency')\r\n }\r\n\r\n /**\r\n * Record an interruption event.\r\n *\r\n * @param callId Call identifier\r\n * @param positionPct 0–1, how far through the TTS stream the interruption occurred\r\n */\r\n recordInterruption(callId: string, positionPct: number): void {\r\n const data = this.getOrCreate(callId)\r\n data.interruptionCount++\r\n data.interruptionPositions.push(positionPct)\r\n logger.debug({ callId, positionPct }, 'Metric: interruption')\r\n }\r\n\r\n /** Record token usage and estimated cost for a model call. */\r\n recordTokenCost(\r\n callId: string,\r\n model: string,\r\n inputTokens: number,\r\n outputTokens: number\r\n ): void {\r\n const costs = TOKEN_COSTS_PER_M[model] ?? { input: 0, output: 0 }\r\n const estimatedUsdCost =\r\n (inputTokens / 1_000_000) * costs.input +\r\n (outputTokens / 1_000_000) * costs.output\r\n\r\n this.getOrCreate(callId).tokenCost.push({\r\n model,\r\n inputTokens,\r\n outputTokens,\r\n estimatedUsdCost,\r\n })\r\n\r\n logger.debug({ callId, model, inputTokens, outputTokens, estimatedUsdCost }, 'Metric: token cost')\r\n }\r\n\r\n /**\r\n * Get a full summary of metrics for a call.\r\n *\r\n * @param callId The call identifier\r\n * @returns Aggregated metrics summary\r\n */\r\n getCallSummary(callId: string): CallMetricsSummary {\r\n const data = this.getOrCreate(callId)\r\n\r\n return {\r\n callId,\r\n sttFirstByteMs: [...data.sttFirstByteMs],\r\n ttsFirstByteMs: [...data.ttsFirstByteMs],\r\n llmFirstTokenMs: [...data.llmFirstTokenMs],\r\n turnLatencyMs: [...data.turnLatencyMs],\r\n interruptionCount: data.interruptionCount,\r\n interruptionPositions: [...data.interruptionPositions],\r\n tokenCost: [...data.tokenCost],\r\n avgTurnLatencyMs: Math.round(avg(data.turnLatencyMs)),\r\n p95TurnLatencyMs: Math.round(p95(data.turnLatencyMs)),\r\n }\r\n }\r\n\r\n /** Remove metrics for a call. Call on call.ended to free memory. */\r\n clearCall(callId: string): void {\r\n this.store.delete(callId)\r\n }\r\n}","/**\r\n * @voice-kit/core — OpenTelemetry tracing\r\n *\r\n * VoiceSDKTracer: wraps every external provider call with OTel spans.\r\n * Auto-exports to OTLP endpoint if OTEL_EXPORTER_OTLP_ENDPOINT is set.\r\n */\r\n\r\nimport { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'\r\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\r\nimport { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'\r\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'\r\nimport { trace, SpanStatusCode, type Tracer, type Span } from '@opentelemetry/api'\r\nimport { resourceFromAttributes as Resource } from '@opentelemetry/resources'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:observability' })\r\n\r\nlet _provider: NodeTracerProvider | null = null\r\n\r\n/**\r\n * Initialize the global OTel trace provider.\r\n * Called once at SDK startup if OTEL_EXPORTER_OTLP_ENDPOINT is set.\r\n *\r\n * @internal\r\n */\r\nfunction getOrInitProvider(): NodeTracerProvider {\r\n if (_provider) return _provider\r\n\r\n const endpoint = process.env['OTEL_EXPORTER_OTLP_ENDPOINT']\r\n\r\n _provider = new NodeTracerProvider({\r\n resource: Resource({\r\n [ATTR_SERVICE_NAME]: 'voice-kit',\r\n }),\r\n // Pass span processors directly in constructor — addSpanProcessor doesn't exist in this version\r\n spanProcessors: endpoint\r\n ? [new SimpleSpanProcessor(new OTLPTraceExporter({ url: endpoint }))]\r\n : [],\r\n })\r\n\r\n if (endpoint) {\r\n logger.info({ endpoint }, 'OTel OTLP exporter configured')\r\n }\r\n\r\n _provider.register()\r\n return _provider\r\n}\r\n\r\n/**\r\n * OpenTelemetry tracer for VoiceKit. Wraps every external I/O with spans.\r\n *\r\n * @example\r\n * ```ts\r\n * const tracer = new VoiceSDKTracer()\r\n * const result = await tracer.traceSTT(\r\n * () => stt.transcribeBatch(audio),\r\n * { provider: 'deepgram', language: 'en-IN' }\r\n * )\r\n * ```\r\n */\r\nexport class VoiceSDKTracer {\r\n private readonly tracer: Tracer\r\n\r\n constructor() {\r\n getOrInitProvider()\r\n this.tracer = trace.getTracer('@voice-kit/core', '0.1.0')\r\n }\r\n\r\n /**\r\n * Trace an STT operation with provider + language attributes.\r\n */\r\n async traceSTT<T>(\r\n fn: () => Promise<T>,\r\n attrs: { provider: string; language: string; callId?: string }\r\n ): Promise<T> {\r\n return this.withSpan(`stt.${attrs.provider}`, fn, {\r\n 'stt.provider': attrs.provider,\r\n 'stt.language': attrs.language,\r\n ...(attrs.callId && { 'call.id': attrs.callId }),\r\n })\r\n }\r\n\r\n /**\r\n * Trace a TTS synthesis operation.\r\n */\r\n async traceTTS<T>(\r\n fn: () => Promise<T>,\r\n attrs: { provider: string; voice: string; chars: number; callId?: string }\r\n ): Promise<T> {\r\n return this.withSpan(`tts.${attrs.provider}`, fn, {\r\n 'tts.provider': attrs.provider,\r\n 'tts.voice_id': attrs.voice,\r\n 'tts.char_count': attrs.chars,\r\n ...(attrs.callId && { 'call.id': attrs.callId }),\r\n })\r\n }\r\n\r\n /**\r\n * Trace an LLM generation call.\r\n */\r\n async traceLLM<T>(\r\n fn: () => Promise<T>,\r\n attrs: { model: string; inputTokens: number; callId?: string }\r\n ): Promise<T> {\r\n return this.withSpan(`llm.${attrs.model}`, fn, {\r\n 'llm.model': attrs.model,\r\n 'llm.input_tokens': attrs.inputTokens,\r\n ...(attrs.callId && { 'call.id': attrs.callId }),\r\n })\r\n }\r\n\r\n /**\r\n * Trace a full call lifecycle.\r\n */\r\n async traceCall<T>(\r\n fn: () => Promise<T>,\r\n attrs: { callId: string; direction: 'inbound' | 'outbound' }\r\n ): Promise<T> {\r\n return this.withSpan('call', fn, {\r\n 'call.id': attrs.callId,\r\n 'call.direction': attrs.direction,\r\n })\r\n }\r\n\r\n /**\r\n * Trace a single conversation turn.\r\n */\r\n async traceTurn<T>(\r\n fn: () => Promise<T>,\r\n attrs: { turnIndex: number; callId: string }\r\n ): Promise<T> {\r\n return this.withSpan('turn', fn, {\r\n 'turn.index': attrs.turnIndex,\r\n 'call.id': attrs.callId,\r\n })\r\n }\r\n\r\n /** Generic span wrapper. @internal */\r\n private async withSpan<T>(\r\n name: string,\r\n fn: () => Promise<T>,\r\n attributes: Record<string, string | number | boolean>\r\n ): Promise<T> {\r\n const span: Span = this.tracer.startSpan(name, { attributes })\r\n const startMs = Date.now()\r\n\r\n try {\r\n const result = await fn()\r\n span.setStatus({ code: SpanStatusCode.OK })\r\n span.setAttribute('duration_ms', Date.now() - startMs)\r\n return result\r\n } catch (err) {\r\n span.setStatus({\r\n code: SpanStatusCode.ERROR,\r\n message: err instanceof Error ? err.message : String(err),\r\n })\r\n span.recordException(err instanceof Error ? err : new Error(String(err)))\r\n throw err\r\n } finally {\r\n span.end()\r\n }\r\n }\r\n}","/**\r\n * @voice-kit/core — AssemblyAI STT Provider\r\n *\r\n * Async long-form transcription using AssemblyAI SDK.\r\n * Best for post-call recordings, meeting notes, long interviews.\r\n * Does not support realtime streaming — use Deepgram for live calls.\r\n */\r\n\r\nimport { AssemblyAI } from 'assemblyai'\r\nimport { STTConnectionError, STTStreamError } from '../../errors'\r\nimport type { STTProvider, STTResult, STTConfig } from '../../types'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:stt:assemblyai' })\r\n\r\nconst SUPPORTED_LANGUAGES = [\r\n 'en', 'en_au', 'en_uk', 'en_us',\r\n 'hi', 'fr', 'de', 'es', 'it', 'pt', 'nl', 'ja', 'zh',\r\n]\r\n\r\n/**\r\n * AssemblyAI async transcription provider.\r\n * @internal — obtained via createSTT('assemblyai', config)\r\n */\r\nexport class AssemblyAISTTProvider implements STTProvider {\r\n readonly name = 'assemblyai'\r\n readonly supportsStreaming = false\r\n readonly supportedLanguages = SUPPORTED_LANGUAGES\r\n\r\n private readonly client: AssemblyAI\r\n private readonly config: Required<STTConfig>\r\n\r\n constructor(config: STTConfig) {\r\n const apiKey = config.apiKey ?? process.env['ASSEMBLYAI_API_KEY']\r\n if (!apiKey) throw new STTConnectionError('assemblyai', new Error('ASSEMBLYAI_API_KEY not set'))\r\n\r\n this.client = new AssemblyAI({ apiKey })\r\n this.config = {\r\n language: config.language ?? 'en',\r\n alternateLanguages: config.alternateLanguages ?? [],\r\n apiKey,\r\n model: config.model ?? 'best',\r\n wordTimestamps: config.wordTimestamps ?? true,\r\n interimResults: false,\r\n smartFormat: config.smartFormat ?? true,\r\n region: '',\r\n }\r\n }\r\n\r\n /**\r\n * Batch-transcribes collected audio. AssemblyAI has no realtime streaming.\r\n * Collects all audio from the iterable, uploads, then polls for result.\r\n *\r\n * @param audio Async iterable of PCM buffers\r\n */\r\n async *transcribeStream(audio: AsyncIterable<Buffer>): AsyncIterable<STTResult> {\r\n const chunks: Buffer[] = []\r\n for await (const chunk of audio) chunks.push(chunk)\r\n const result = await this.transcribeBatch(Buffer.concat(chunks))\r\n yield result\r\n }\r\n\r\n /**\r\n * Upload audio to AssemblyAI and wait for async transcription.\r\n * Suitable for call recordings. Average latency: 15–45s per minute of audio.\r\n *\r\n * @param audio Raw WAV/PCM/MP3 buffer\r\n *\r\n * @example\r\n * ```ts\r\n * const stt = createSTT('assemblyai', { wordTimestamps: true })\r\n * const result = await stt.transcribeBatch(recordingBuffer)\r\n * console.log(result.words) // Word-level timestamps\r\n * ```\r\n */\r\n async transcribeBatch(audio: Buffer): Promise<STTResult> {\r\n const startMs = Date.now()\r\n\r\n try {\r\n logger.debug({ bytes: audio.length, language: this.config.language }, 'AssemblyAI transcription started')\r\n\r\n const transcript = await this.client.transcripts.transcribe({\r\n audio: audio,\r\n language_code: this.config.language,\r\n speech_model: this.config.model as 'best' | 'nano',\r\n punctuate: this.config.smartFormat,\r\n format_text: this.config.smartFormat,\r\n word_boost: [],\r\n ...(this.config.wordTimestamps && { timestamps: true }),\r\n })\r\n\r\n if (transcript.status === 'error') {\r\n throw new STTStreamError('assemblyai', new Error(transcript.error ?? 'Transcription failed'))\r\n }\r\n\r\n logger.info(\r\n { id: transcript.id, duration: transcript.audio_duration, latencyMs: Date.now() - startMs },\r\n 'AssemblyAI transcription complete'\r\n )\r\n\r\n return {\r\n transcript: transcript.text ?? '',\r\n isFinal: true,\r\n confidence: transcript.confidence ?? 0.9,\r\n language: this.config.language,\r\n languageSwitchDetected: false,\r\n words: this.config.wordTimestamps && transcript.words\r\n ? transcript.words.map((w) => ({\r\n word: w.text,\r\n startMs: w.start,\r\n endMs: w.end,\r\n confidence: w.confidence,\r\n }))\r\n : undefined,\r\n latencyMs: Date.now() - startMs,\r\n }\r\n } catch (err) {\r\n if (err instanceof STTStreamError) throw err\r\n throw new STTStreamError('assemblyai', err)\r\n }\r\n }\r\n}","/**\r\n * @voice-kit/core — Deepgram Nova-3 STT Provider\r\n *\r\n * Streaming STT using Deepgram Nova-3. Handles WebSocket reconnect with\r\n * exponential backoff, interim + final results, language detection.\r\n * Never instantiate directly — use createSTT('deepgram', config).\r\n *\r\n * SDK: @deepgram/sdk v5 (beta) — https://github.com/deepgram/deepgram-js-sdk\r\n */\r\n\r\nimport { DeepgramClient, type ListenV1Response } from '@deepgram/sdk'\r\nimport { STTConnectionError, STTStreamError } from '../../errors'\r\nimport type { STTProvider, STTResult, STTConfig } from '../../types'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:stt:deepgram' })\r\n\r\n/** Supported Deepgram languages with India-first ordering. */\r\nconst SUPPORTED_LANGUAGES = [\r\n 'en-IN', 'hi-IN', 'ta-IN', 'te-IN', 'kn-IN', 'mr-IN',\r\n 'en-US', 'en-GB', 'en-AU',\r\n]\r\n\r\n/** Exponential backoff config. */\r\nconst BACKOFF = {\r\n baseMs: 100,\r\n maxMs: 5_000,\r\n jitterPct: 0.2,\r\n maxAttempts: 3,\r\n}\r\n\r\nfunction backoffDelay(attempt: number): number {\r\n const base = Math.min(BACKOFF.baseMs * Math.pow(2, attempt), BACKOFF.maxMs)\r\n const jitter = base * BACKOFF.jitterPct * (Math.random() * 2 - 1)\r\n return Math.round(base + jitter)\r\n}\r\n\r\n/**\r\n * Deepgram Nova-3 streaming STT provider.\r\n * @internal — obtained via createSTT('deepgram', config)\r\n */\r\nexport class DeepgramSTTProvider implements STTProvider {\r\n readonly name = 'deepgram'\r\n readonly supportsStreaming = true\r\n readonly supportedLanguages = SUPPORTED_LANGUAGES\r\n\r\n private readonly client: DeepgramClient\r\n private readonly config: Required<STTConfig>\r\n\r\n constructor(config: STTConfig) {\r\n const apiKey = config.apiKey ?? process.env['DEEPGRAM_API_KEY']\r\n if (!apiKey) throw new STTConnectionError('deepgram', new Error('DEEPGRAM_API_KEY not set'))\r\n\r\n // v5: new DeepgramClient({ apiKey }) — replaces createClient(apiKey) from v4\r\n this.client = new DeepgramClient({ apiKey })\r\n\r\n this.config = {\r\n language: config.language ?? 'en-IN',\r\n alternateLanguages: config.alternateLanguages ?? [],\r\n apiKey,\r\n // nova-3 is now Deepgram's latest recommended model\r\n model: config.model ?? 'nova-3',\r\n wordTimestamps: config.wordTimestamps ?? false,\r\n interimResults: config.interimResults ?? true,\r\n smartFormat: config.smartFormat ?? true,\r\n region: config.region ?? '',\r\n }\r\n }\r\n\r\n /**\r\n * Stream audio to Deepgram and receive interim + final transcription results.\r\n * Handles reconnection transparently with exponential backoff.\r\n *\r\n * @param audio Async iterable of 16kHz PCM buffers from AudioPipeline\r\n *\r\n * @example\r\n * ```ts\r\n * const stt = createSTT('deepgram', { language: 'hi-IN' })\r\n * for await (const result of stt.transcribeStream(audioIterable)) {\r\n * if (result.isFinal) console.log('User said:', result.transcript)\r\n * }\r\n * ```\r\n */\r\n async *transcribeStream(audio: AsyncIterable<Buffer>): AsyncIterable<STTResult> {\r\n let attempt = 0\r\n const startMs = Date.now()\r\n\r\n while (attempt <= BACKOFF.maxAttempts) {\r\n const connection = await this.connectWithRetry(attempt)\r\n const results: STTResult[] = []\r\n let done = false\r\n let error: Error | null = null\r\n\r\n // v5: unified \"message\" event replaces LiveTranscriptionEvents.Transcript.\r\n // Check data.type === \"Results\" to identify transcript frames.\r\n connection.on('message', (data: any) => {\r\n if (data.type !== 'Results') return\r\n\r\n const alt = data.channel?.alternatives?.[0]\r\n // Skip empty interim frames (common during silence)\r\n if (!alt?.transcript) return\r\n\r\n const isFinal = data.is_final === true\r\n const result: STTResult = {\r\n transcript: alt.transcript,\r\n isFinal,\r\n // speech_final=true means Deepgram detected end-of-utterance (endpointing).\r\n // A frame can be speech_final without is_final — callers should act on both.\r\n confidence: alt.confidence ?? 0,\r\n // alt.languages populated when detect_language is enabled\r\n language: alt.languages?.[0] ?? this.config.language,\r\n languageSwitchDetected: false,\r\n words: this.config.wordTimestamps\r\n ? alt.words?.map((w: any) => ({\r\n word: w.word ?? '',\r\n startMs: (w.start ?? 0) * 1000,\r\n endMs: (w.end ?? 0) * 1000,\r\n confidence: w.confidence ?? 0,\r\n punctuatedWord: w.punctuated_word,\r\n }))\r\n : undefined,\r\n latencyMs: Date.now() - startMs,\r\n }\r\n results.push(result)\r\n\r\n if (isFinal) {\r\n logger.debug(\r\n { transcript: result.transcript, confidence: result.confidence, language: result.language },\r\n 'Deepgram final transcript'\r\n )\r\n }\r\n })\r\n\r\n // v5: lowercase \"close\" event\r\n connection.on('close', () => {\r\n done = true\r\n })\r\n\r\n connection.on('error', (err: Error) => {\r\n error = err\r\n logger.warn({ err, attempt }, 'Deepgram stream error')\r\n })\r\n\r\n // Send audio frames.\r\n // v5 listen.v1: raw binary frames go via connection.socket.send()\r\n const sendAudio = async () => {\r\n try {\r\n for await (const chunk of audio) {\r\n connection.socket.send(chunk)\r\n }\r\n // Finalize signals Deepgram to flush remaining audio and close cleanly\r\n connection.socket.send(JSON.stringify({ type: 'Finalize' }))\r\n } catch (err) {\r\n error = err instanceof Error ? err : new Error(String(err))\r\n }\r\n }\r\n\r\n const sendPromise = sendAudio()\r\n let resultIndex = 0\r\n\r\n while (!done || resultIndex < results.length) {\r\n if (resultIndex < results.length) {\r\n yield results[resultIndex++]!\r\n } else {\r\n await new Promise((r) => setTimeout(r, 10))\r\n }\r\n\r\n if (error && attempt < BACKOFF.maxAttempts) {\r\n // Close current connection and fall through to reconnect\r\n try { connection.socket.close() } catch { /* ignore */ }\r\n break\r\n }\r\n\r\n if (error && attempt >= BACKOFF.maxAttempts) {\r\n await sendPromise.catch(() => { })\r\n throw new STTStreamError('deepgram', error)\r\n }\r\n }\r\n\r\n await sendPromise.catch(() => { })\r\n\r\n if (!error) return // Clean exit\r\n\r\n attempt++\r\n await new Promise((r) => setTimeout(r, backoffDelay(attempt)))\r\n logger.info({ attempt }, 'Deepgram reconnecting...')\r\n }\r\n\r\n throw new STTStreamError('deepgram', new Error('Max reconnect attempts exceeded'))\r\n }\r\n\r\n /**\r\n * Transcribe a complete audio buffer (non-streaming).\r\n * Uses Deepgram pre-recorded API.\r\n *\r\n * @param audio Raw PCM or WAV buffer\r\n */\r\n async transcribeBatch(audio: Buffer): Promise<STTResult> {\r\n const startMs = Date.now()\r\n\r\n // v5: listen.v1.media.transcribeFile() — throws on error (no { result, error } wrapper)\r\n try {\r\n const response: ListenV1Response = await this.client.listen.v1.media.transcribeFile(\r\n audio,\r\n {\r\n model: this.config.model,\r\n language: this.config.language,\r\n // v5: boolean-like options must be strings\r\n smart_format: true,\r\n diarize: false,\r\n }\r\n ) as ListenV1Response\r\n\r\n const alt = response?.results?.channels?.[0]?.alternatives?.[0]\r\n return {\r\n transcript: alt?.transcript ?? '',\r\n isFinal: true,\r\n confidence: alt?.confidence ?? 0,\r\n language: this.config.language,\r\n languageSwitchDetected: false,\r\n latencyMs: Date.now() - startMs,\r\n }\r\n } catch (err) {\r\n if (err instanceof STTStreamError) throw err\r\n throw new STTStreamError('deepgram', err instanceof Error ? err : new Error(String(err)))\r\n }\r\n }\r\n\r\n /**\r\n * Create and open a live WebSocket connection to Deepgram.\r\n *\r\n * v5 connection lifecycle (3 explicit steps):\r\n * 1. await listen.v1.connect(options) — constructs the connection object\r\n * 2. connection.connect() — initiates the WebSocket handshake\r\n * 3. await connection.waitForOpen() — resolves once the socket is ready\r\n *\r\n * @internal\r\n */\r\n private async connectWithRetry(attempt: number): Promise<any> {\r\n const delay = attempt > 0 ? backoffDelay(attempt) : 0\r\n if (delay > 0) await new Promise((r) => setTimeout(r, delay))\r\n\r\n try {\r\n logger.debug({ attempt, language: this.config.language }, 'Connecting to Deepgram')\r\n\r\n // v5: listen.v1.connect() is async; options accepted directly\r\n const connection = await this.client.listen.v1.connect({\r\n model: this.config.model,\r\n language: this.config.language,\r\n // v5: boolean-like options must be strings\r\n smart_format: \"true\",\r\n interim_results: String(this.config.interimResults),\r\n encoding: 'linear16',\r\n sample_rate: 16000,\r\n channels: 1,\r\n utterance_end_ms: '1000',\r\n ...(this.config.alternateLanguages.length > 0 && {\r\n detect_language: 'true',\r\n // language must be omitted when detect_language is enabled\r\n language: undefined,\r\n }),\r\n Authorization: `Token ${this.config.apiKey}`,\r\n })\r\n\r\n // v5: must explicitly call .connect() then await .waitForOpen()\r\n connection.connect()\r\n\r\n await Promise.race([\r\n connection.waitForOpen(),\r\n new Promise<never>((_, reject) =>\r\n setTimeout(\r\n () => reject(new STTConnectionError('deepgram', new Error('Connection timeout'))),\r\n 10_000\r\n )\r\n ),\r\n ])\r\n\r\n logger.info({ attempt, language: this.config.language }, 'Deepgram connected')\r\n return connection\r\n } catch (err) {\r\n if (err instanceof STTConnectionError) throw err\r\n throw new STTConnectionError('deepgram', err instanceof Error ? err : new Error(String(err)))\r\n }\r\n }\r\n}","/**\r\n * @voice-kit/core — Sarvam AI Indic STT Provider\r\n *\r\n * Sarvam AI provides state-of-the-art STT for Indian languages:\r\n * hi-IN, kn-IN, ta-IN, te-IN, mr-IN, bn-IN, gu-IN, pa-IN, or-IN\r\n *\r\n * Uses axios for HTTP calls. No official JS SDK — we use the REST API directly.\r\n */\r\n\r\nimport axios, { type AxiosInstance } from 'axios'\r\nimport { STTConnectionError, STTStreamError, STTLanguageNotSupportedError } from '../../errors'\r\nimport type { STTProvider, STTResult, STTConfig } from '../../types'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:stt:sarvam' })\r\n\r\nconst SARVAM_API_BASE = 'https://api.sarvam.ai'\r\n\r\n/** All Indic languages supported by Sarvam AI. */\r\nconst SUPPORTED_LANGUAGES = [\r\n 'hi-IN', 'kn-IN', 'ta-IN', 'te-IN', 'mr-IN',\r\n 'bn-IN', 'gu-IN', 'pa-IN', 'or-IN', 'ml-IN',\r\n]\r\n\r\n/** Language code → Sarvam model mapping. */\r\nconst SARVAM_MODELS: Record<string, string> = {\r\n 'hi-IN': 'saarika:v1',\r\n 'kn-IN': 'saarika:v1',\r\n 'ta-IN': 'saarika:v1',\r\n 'te-IN': 'saarika:v1',\r\n 'mr-IN': 'saarika:v1',\r\n 'bn-IN': 'saarika:v1',\r\n 'gu-IN': 'saarika:v1',\r\n 'pa-IN': 'saarika:v1',\r\n 'or-IN': 'saarika:v1',\r\n 'ml-IN': 'saarika:v1',\r\n}\r\n\r\n/** Sarvam API response shape. */\r\ninterface SarvamTranscribeResponse {\r\n transcript: string\r\n language_code: string\r\n confidence: number\r\n}\r\n\r\n/**\r\n * Sarvam AI Indic STT provider.\r\n * @internal — obtained via createSTT('sarvam', config)\r\n */\r\nexport class SarvamSTTProvider implements STTProvider {\r\n readonly name = 'sarvam'\r\n readonly supportsStreaming = false // Sarvam REST API is batch-only\r\n readonly supportedLanguages = SUPPORTED_LANGUAGES\r\n\r\n private readonly http: AxiosInstance\r\n private readonly config: Required<STTConfig>\r\n\r\n constructor(config: STTConfig) {\r\n const apiKey = config.apiKey ?? process.env['SARVAM_API_KEY']\r\n if (!apiKey) throw new STTConnectionError('sarvam', new Error('SARVAM_API_KEY not set'))\r\n\r\n const language = config.language ?? 'hi-IN'\r\n if (!SUPPORTED_LANGUAGES.includes(language)) {\r\n throw new STTLanguageNotSupportedError('sarvam', language)\r\n }\r\n\r\n this.http = axios.create({\r\n baseURL: SARVAM_API_BASE,\r\n headers: {\r\n 'API-Subscription-Key': apiKey,\r\n 'Content-Type': 'multipart/form-data',\r\n },\r\n timeout: 30_000,\r\n })\r\n\r\n this.config = {\r\n language,\r\n alternateLanguages: config.alternateLanguages ?? [],\r\n apiKey,\r\n model: config.model ?? SARVAM_MODELS[language] ?? 'saarika:v1',\r\n wordTimestamps: false, // Sarvam doesn't support word timestamps yet\r\n interimResults: false,\r\n smartFormat: config.smartFormat ?? true,\r\n region: config.region ?? '',\r\n }\r\n }\r\n\r\n /**\r\n * Collects audio and transcribes via Sarvam batch API.\r\n * Sarvam doesn't support realtime streaming.\r\n *\r\n * @param audio Async iterable of 16kHz PCM buffers\r\n */\r\n async *transcribeStream(audio: AsyncIterable<Buffer>): AsyncIterable<STTResult> {\r\n const chunks: Buffer[] = []\r\n for await (const chunk of audio) chunks.push(chunk)\r\n const result = await this.transcribeBatch(Buffer.concat(chunks))\r\n yield result\r\n }\r\n\r\n /**\r\n * Transcribe a WAV/PCM audio buffer in an Indic language.\r\n *\r\n * @param audio 16kHz PCM or WAV buffer\r\n *\r\n * @example\r\n * ```ts\r\n * const stt = createSTT('sarvam', { language: 'ta-IN' })\r\n * const result = await stt.transcribeBatch(tamilAudioBuffer)\r\n * console.log(result.transcript) // Tamil text\r\n * ```\r\n */\r\n async transcribeBatch(audio: Buffer): Promise<STTResult> {\r\n const startMs = Date.now()\r\n\r\n try {\r\n logger.debug(\r\n { language: this.config.language, bytes: audio.length },\r\n 'Sarvam transcription request'\r\n )\r\n\r\n const form = new FormData()\r\n form.append('file', new Blob([audio], { type: 'audio/wav' }), 'audio.wav')\r\n form.append('language_code', this.config.language)\r\n form.append('model', this.config.model)\r\n if (this.config.smartFormat) {\r\n form.append('with_disfluencies', 'false')\r\n }\r\n\r\n const response = await this.http.post<SarvamTranscribeResponse>(\r\n '/speech-to-text',\r\n form\r\n )\r\n\r\n const data = response.data\r\n\r\n logger.info(\r\n { language: data.language_code, confidence: data.confidence, latencyMs: Date.now() - startMs },\r\n 'Sarvam transcription complete'\r\n )\r\n\r\n return {\r\n transcript: data.transcript,\r\n isFinal: true,\r\n confidence: data.confidence ?? 0.9,\r\n language: data.language_code ?? this.config.language,\r\n languageSwitchDetected: false,\r\n latencyMs: Date.now() - startMs,\r\n }\r\n } catch (err) {\r\n if (axios.isAxiosError(err)) {\r\n throw new STTStreamError(\r\n 'sarvam',\r\n new Error(`Sarvam API error: ${err.response?.status} ${JSON.stringify(err.response?.data)}`)\r\n )\r\n }\r\n throw new STTStreamError('sarvam', err)\r\n }\r\n }\r\n}","/**\r\n * @voice-kit/core — Hinglish language switch detector\r\n *\r\n * Detects mid-sentence Hindi↔English (Hinglish) code-switching in realtime STT output.\r\n * Pure algorithmic detection — no external API calls, no latency overhead.\r\n *\r\n * Detection signals:\r\n * 1. Devanagari Unicode range (U+0900–U+097F) for Hindi\r\n * 2. Latin character runs for English\r\n * 3. Common Hinglish transition patterns (e.g. \"main think karta hun\")\r\n * 4. Script boundary crossing mid-sentence\r\n */\r\n\r\nimport { EventEmitter } from 'node:events'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:stt:language-detect' })\r\n\r\n/** Devanagari Unicode block: U+0900–U+097F */\r\nconst DEVANAGARI_RANGE = /[\\u0900-\\u097F]/\r\nconst DEVANAGARI_WORD = /[\\u0900-\\u097F]+/g\r\n\r\n/** Latin word (English) pattern */\r\nconst LATIN_WORD = /[a-zA-Z]+/g\r\n\r\n/** Minimum word run length to classify a language segment. */\r\nconst MIN_WORDS_FOR_CLASSIFICATION = 2\r\n\r\n/** Minimum confidence to emit a language switch event. */\r\nconst SWITCH_CONFIDENCE_THRESHOLD = 0.6\r\n\r\n/** Common Hinglish filler words that appear in both languages — ignored for classification. */\r\nconst NEUTRAL_TOKENS = new Set([\r\n 'ok', 'okay', 'haan', 'nahin', 'nahi', 'kya', 'hai', 'ho', 'na', 'toh',\r\n 'aur', 'ya', 'matlab', 'yani', 'i', 'a', 'the', 'is', 'are', 'and', 'or',\r\n])\r\n\r\nexport type LanguageCode = 'hi-IN' | 'en-IN' | 'unknown'\r\n\r\nexport interface LanguageSwitchEvent {\r\n /** Language switched from. */\r\n from: LanguageCode\r\n /** Language switched to. */\r\n to: LanguageCode\r\n /** Position in transcript where switch occurred (word index). */\r\n position: number\r\n /** Confidence of the detection 0–1. */\r\n confidence: number\r\n /** Full transcript at time of detection. */\r\n transcript: string\r\n /** Timestamp of detection. */\r\n detectedAt: Date\r\n}\r\n\r\ntype LanguageDetectorEventMap = {\r\n 'language.switched': [LanguageSwitchEvent]\r\n}\r\n\r\n/**\r\n * Hinglish language switch detector.\r\n *\r\n * Analyzes STT transcripts word-by-word in realtime.\r\n * Emits 'language.switched' events when a significant script change is detected.\r\n *\r\n * @example\r\n * ```ts\r\n * const detector = new LanguageSwitchDetector('en-IN')\r\n * detector.on('language.switched', ({ from, to, transcript }) => {\r\n * console.log(`Language switched: ${from} → ${to} in: \"${transcript}\"`)\r\n * })\r\n *\r\n * // Call on every STT final result\r\n * detector.analyze('main yeh kaam kal karonga I promise')\r\n * ```\r\n */\r\nexport class LanguageSwitchDetector extends EventEmitter<LanguageDetectorEventMap> {\r\n private currentLanguage: LanguageCode\r\n private readonly primaryLanguage: LanguageCode\r\n\r\n /** Rolling window of recent language classifications for smoothing. */\r\n private recentClassifications: LanguageCode[] = []\r\n private readonly windowSize = 5\r\n\r\n constructor(primaryLanguage: LanguageCode = 'en-IN') {\r\n super()\r\n this.primaryLanguage = primaryLanguage\r\n this.currentLanguage = primaryLanguage\r\n }\r\n\r\n /**\r\n * Analyze a transcript for language switches.\r\n * Should be called on every STT final result.\r\n *\r\n * @param transcript The transcribed text to analyze\r\n * @returns Detected language of the transcript\r\n */\r\n analyze(transcript: string): LanguageCode {\r\n const words = this.tokenize(transcript)\r\n if (words.length === 0) return this.currentLanguage\r\n\r\n const classification = this.classifySegment(words)\r\n const confidence = this.computeConfidence(words, classification)\r\n\r\n // Update rolling window\r\n this.recentClassifications.push(classification)\r\n if (this.recentClassifications.length > this.windowSize) {\r\n this.recentClassifications.shift()\r\n }\r\n\r\n // Smooth classification over rolling window\r\n const smoothed = this.smoothedLanguage()\r\n\r\n if (\r\n smoothed !== this.currentLanguage &&\r\n confidence >= SWITCH_CONFIDENCE_THRESHOLD &&\r\n smoothed !== 'unknown'\r\n ) {\r\n const event: LanguageSwitchEvent = {\r\n from: this.currentLanguage,\r\n to: smoothed,\r\n position: 0, // position in full conversation\r\n confidence,\r\n transcript,\r\n detectedAt: new Date(),\r\n }\r\n\r\n const prev = this.currentLanguage\r\n this.currentLanguage = smoothed\r\n\r\n logger.info(\r\n { from: prev, to: smoothed, confidence, transcript: transcript.slice(0, 50) },\r\n 'Language switch detected'\r\n )\r\n\r\n this.emit('language.switched', event)\r\n }\r\n\r\n return this.currentLanguage\r\n }\r\n\r\n /**\r\n * Analyze a transcript and return per-word language classification.\r\n * Useful for word-level Hinglish mixing visualization.\r\n *\r\n * @param transcript Text to analyze\r\n * @returns Array of { word, language } pairs\r\n */\r\n analyzeWords(transcript: string): Array<{ word: string; language: LanguageCode }> {\r\n const words = this.tokenize(transcript)\r\n return words.map((word) => ({\r\n word,\r\n language: this.classifyWord(word),\r\n }))\r\n }\r\n\r\n /** Reset to primary language (e.g., on new call). */\r\n reset(): void {\r\n this.currentLanguage = this.primaryLanguage\r\n this.recentClassifications = []\r\n }\r\n\r\n /** Current detected language. */\r\n get language(): LanguageCode {\r\n return this.currentLanguage\r\n }\r\n\r\n // ─── Private helpers ────────────────────────────────────────────────────────\r\n\r\n private tokenize(text: string): string[] {\r\n return text\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter((w) => w.length > 0 && !NEUTRAL_TOKENS.has(w))\r\n }\r\n\r\n private classifyWord(word: string): LanguageCode {\r\n if (DEVANAGARI_RANGE.test(word)) return 'hi-IN'\r\n if (/^[a-z]+$/.test(word)) return 'en-IN'\r\n return 'unknown'\r\n }\r\n\r\n private classifySegment(words: string[]): LanguageCode {\r\n let hindiCount = 0\r\n let englishCount = 0\r\n\r\n for (const word of words) {\r\n const lang = this.classifyWord(word)\r\n if (lang === 'hi-IN') hindiCount++\r\n else if (lang === 'en-IN') englishCount++\r\n }\r\n\r\n if (hindiCount === 0 && englishCount === 0) return 'unknown'\r\n if (hindiCount > englishCount) return 'hi-IN'\r\n if (englishCount > hindiCount) return 'en-IN'\r\n\r\n // Tie: defer to primary language\r\n return this.primaryLanguage\r\n }\r\n\r\n private computeConfidence(words: string[], classification: LanguageCode): number {\r\n const relevant = words.filter((w) => this.classifyWord(w) !== 'unknown')\r\n if (relevant.length < MIN_WORDS_FOR_CLASSIFICATION) return 0\r\n\r\n const matching = relevant.filter((w) => this.classifyWord(w) === classification)\r\n return matching.length / relevant.length\r\n }\r\n\r\n private smoothedLanguage(): LanguageCode {\r\n if (this.recentClassifications.length === 0) return this.primaryLanguage\r\n\r\n const counts: Record<LanguageCode, number> = { 'hi-IN': 0, 'en-IN': 0, 'unknown': 0 }\r\n for (const lang of this.recentClassifications) {\r\n counts[lang]++\r\n }\r\n\r\n // Find majority (excluding 'unknown')\r\n if (counts['hi-IN'] > counts['en-IN']) return 'hi-IN'\r\n if (counts['en-IN'] > counts['hi-IN']) return 'en-IN'\r\n return this.currentLanguage // no change on tie\r\n }\r\n}\r\n\r\n/**\r\n * Detect whether a transcript contains mixed Hindi+English (Hinglish).\r\n * Stateless convenience function for one-shot analysis.\r\n *\r\n * @param transcript Text to analyze\r\n * @returns True if both Devanagari and Latin characters are present\r\n *\r\n * @example\r\n * ```ts\r\n * isHinglish('main kal office jaaunga') // true\r\n * isHinglish('I will go to the office') // false\r\n * isHinglish('मैं कल ऑफिस जाऊंगा') // false (pure Hindi)\r\n * ```\r\n */\r\nexport function isInglish(transcript: string): boolean {\r\n const hasDevanagari = DEVANAGARI_RANGE.test(transcript)\r\n const hasLatin = /[a-zA-Z]/.test(transcript)\r\n return hasDevanagari && hasLatin\r\n}","/**\r\n * @voice-kit/core — OpenAI Whisper STT Provider (batch fallback)\r\n *\r\n * Uses @ai-sdk/openai for batch transcription. Does not support streaming.\r\n * Use as fallback for long-form audio or when Deepgram is unavailable.\r\n */\r\n\r\nimport { createOpenAI } from '@ai-sdk/openai'\r\nimport { STTStreamError, STTLanguageNotSupportedError } from '../../errors'\r\nimport type { STTProvider, STTResult, STTConfig } from '../../types'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:stt:whisper' })\r\n\r\nconst WHISPER_LANGUAGES = [\r\n 'en', 'hi', 'ta', 'te', 'kn', 'mr', 'bn', 'gu', 'pa', 'ur',\r\n 'fr', 'de', 'es', 'pt', 'it', 'nl', 'pl', 'ru', 'ja', 'zh',\r\n]\r\n\r\n/**\r\n * OpenAI Whisper STT provider. Batch-only — does not support streaming.\r\n * @internal — obtained via createSTT('whisper', config)\r\n */\r\nexport class WhisperSTTProvider implements STTProvider {\r\n readonly name = 'whisper'\r\n readonly supportsStreaming = false\r\n readonly supportedLanguages = WHISPER_LANGUAGES\r\n\r\n private readonly config: Required<STTConfig>\r\n\r\n constructor(config: STTConfig) {\r\n const apiKey = config.apiKey ?? process.env['OPENAI_API_KEY']\r\n if (!apiKey) throw new STTStreamError('whisper', new Error('OPENAI_API_KEY not set'))\r\n\r\n const language = config.language ?? 'en-IN'\r\n // Whisper uses ISO 639-1 (2-char), strip region suffix\r\n const whisperLang = language.split('-')[0] ?? 'en'\r\n if (!WHISPER_LANGUAGES.includes(whisperLang)) {\r\n throw new STTLanguageNotSupportedError('whisper', language)\r\n }\r\n\r\n this.config = {\r\n language,\r\n alternateLanguages: config.alternateLanguages ?? [],\r\n apiKey,\r\n model: config.model ?? 'whisper-1',\r\n wordTimestamps: config.wordTimestamps ?? false,\r\n interimResults: false,\r\n smartFormat: false,\r\n region: '',\r\n }\r\n }\r\n\r\n /**\r\n * Streaming not supported by Whisper. Collects all audio then transcribes.\r\n * For realtime use, use createSTT('deepgram') instead.\r\n */\r\n async *transcribeStream(audio: AsyncIterable<Buffer>): AsyncIterable<STTResult> {\r\n const chunks: Buffer[] = []\r\n for await (const chunk of audio) chunks.push(chunk)\r\n const result = await this.transcribeBatch(Buffer.concat(chunks))\r\n yield result\r\n }\r\n\r\n /**\r\n * Transcribe a complete audio buffer via Whisper.\r\n *\r\n * @param audio WAV or PCM buffer\r\n */\r\n async transcribeBatch(audio: Buffer): Promise<STTResult> {\r\n const startMs = Date.now()\r\n const language = (this.config.language.split('-')[0] ?? 'en')\r\n\r\n try {\r\n logger.debug({ language, bytes: audio.length }, 'Whisper batch transcription')\r\n\r\n const openai = createOpenAI({ apiKey: this.config.apiKey })\r\n\r\n // Whisper API expects a File-like object\r\n const file = new File([audio], 'audio.wav', { type: 'audio/wav' })\r\n\r\n // Use raw OpenAI SDK for audio (Vercel AI SDK doesn't expose Whisper directly)\r\n const formData = new FormData()\r\n formData.append('file', file)\r\n formData.append('model', this.config.model)\r\n formData.append('language', language)\r\n if (this.config.wordTimestamps) {\r\n formData.append('timestamp_granularities[]', 'word')\r\n formData.append('response_format', 'verbose_json')\r\n }\r\n\r\n const response = await fetch('https://api.openai.com/v1/audio/transcriptions', {\r\n method: 'POST',\r\n headers: { Authorization: `Bearer ${this.config.apiKey}` },\r\n body: formData,\r\n })\r\n\r\n if (!response.ok) {\r\n throw new Error(`Whisper API error: ${response.status} ${response.statusText}`)\r\n }\r\n\r\n const data = await response.json() as { text: string; words?: Array<{ word: string; start: number; end: number }> }\r\n\r\n return {\r\n transcript: data.text,\r\n isFinal: true,\r\n confidence: 0.95, // Whisper doesn't return confidence\r\n language: this.config.language,\r\n languageSwitchDetected: false,\r\n words: this.config.wordTimestamps && data.words\r\n ? data.words.map((w) => ({\r\n word: w.word,\r\n startMs: w.start * 1000,\r\n endMs: w.end * 1000,\r\n confidence: 0.95,\r\n }))\r\n : undefined,\r\n latencyMs: Date.now() - startMs,\r\n }\r\n } catch (err) {\r\n if (err instanceof STTStreamError) throw err\r\n throw new STTStreamError('whisper', err)\r\n }\r\n }\r\n}","/**\r\n * @voice-kit/core — STT factory\r\n *\r\n * createSTT() is the ONLY public API for speech-to-text.\r\n * Never instantiate provider classes directly.\r\n */\r\n\r\nimport type { STTProvider, STTConfig } from '../types'\r\nimport { DeepgramSTTProvider } from './deepgram'\r\nimport { WhisperSTTProvider } from './whisper'\r\nimport { AssemblyAISTTProvider } from './assembly'\r\nimport { SarvamSTTProvider } from './sarvam'\r\n\r\n/**\r\n * Create an STT provider instance. This is the ONLY public API for STT.\r\n *\r\n * Provider selection guide:\r\n * - 'deepgram' → Default. Realtime streaming, best latency, supports en-IN + Indic\r\n * - 'sarvam' → Best accuracy for pure Indic languages (hi-IN, ta-IN, kn-IN, te-IN, mr-IN)\r\n * - 'assemblyai' → Best for long-form recordings (post-call analysis)\r\n * - 'whisper' → Fallback batch transcription, broad language support\r\n *\r\n * @example\r\n * ```ts\r\n * // Realtime English (India) — default\r\n * const stt = createSTT('deepgram', { language: 'en-IN' })\r\n *\r\n * // Realtime Hindi\r\n * const stt = createSTT('deepgram', { language: 'hi-IN' })\r\n *\r\n * // Best Indic accuracy\r\n * const stt = createSTT('sarvam', { language: 'ta-IN' })\r\n *\r\n * // Post-call recording\r\n * const stt = createSTT('assemblyai', { wordTimestamps: true })\r\n * ```\r\n */\r\nexport function createSTT(\r\n provider: 'deepgram' | 'whisper' | 'assemblyai' | 'sarvam',\r\n config?: STTConfig\r\n): STTProvider {\r\n const cfg = config ?? {}\r\n\r\n switch (provider) {\r\n case 'deepgram':\r\n return new DeepgramSTTProvider(cfg)\r\n case 'whisper':\r\n return new WhisperSTTProvider(cfg)\r\n case 'assemblyai':\r\n return new AssemblyAISTTProvider(cfg)\r\n case 'sarvam':\r\n return new SarvamSTTProvider(cfg)\r\n default: {\r\n const _exhaustive: never = provider\r\n throw new Error(`Unknown STT provider: ${String(_exhaustive)}`)\r\n }\r\n }\r\n}","/**\r\n * @voice-kit/core — Cartesia TTS Provider\r\n *\r\n * Ultra-low-latency streaming TTS via @cartesia/cartesia-js.\r\n * Target first chunk: < 90ms. Best for latency-critical applications.\r\n */\r\n\r\nimport Cartesia from '@cartesia/cartesia-js'\r\nimport { TTSConnectionError, TTSStreamError } from '../../errors'\r\nimport type { TTSProvider, TTSConfig } from '../../types'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:tts:cartesia' })\r\n\r\n/** Cartesia default voice: Barbershop Man — clear and neutral */\r\nconst DEFAULT_VOICE_ID = 'a0e99841-438c-4a64-b679-ae501e7d6091'\r\n\r\n/**\r\n * Cartesia ultra-low-latency TTS provider.\r\n * @internal — obtained via createTTS('cartesia', config)\r\n */\r\nexport class CartesiaTTSProvider implements TTSProvider {\r\n readonly name = 'cartesia'\r\n readonly outputSampleRate = 22_050 // Cartesia default\r\n readonly outputFormat = 'pcm' as const\r\n\r\n private readonly client: Cartesia\r\n private readonly config: Required<TTSConfig>\r\n\r\n constructor(config: TTSConfig) {\r\n const apiKey = config.apiKey ?? process.env['CARTESIA_API_KEY']\r\n if (!apiKey) throw new TTSConnectionError('cartesia', new Error('CARTESIA_API_KEY not set'))\r\n\r\n this.client = new Cartesia({ apiKey })\r\n this.config = {\r\n voiceId: config.voiceId ?? DEFAULT_VOICE_ID,\r\n sampleRate: config.sampleRate ?? 22_050,\r\n speed: config.speed ?? 1.0,\r\n pitch: config.pitch ?? 0,\r\n apiKey,\r\n modelId: config.modelId ?? 'sonic-english',\r\n emotion: config.emotion ?? '',\r\n targetLanguage: config.targetLanguage ?? 'en',\r\n }\r\n }\r\n\r\n /**\r\n * Stream audio from Cartesia. Typically delivers first chunk in < 90ms.\r\n *\r\n * @example\r\n * ```ts\r\n * const tts = createTTS('cartesia', { voiceId: 'your-voice-id' })\r\n * for await (const chunk of tts.synthesizeStream('Hello!')) {\r\n * sendToTelephony(chunk)\r\n * }\r\n * ```\r\n */\r\n async *synthesizeStream(text: string, config?: TTSConfig): AsyncIterable<Buffer> {\r\n const voiceId = config?.voiceId ?? this.config.voiceId\r\n const startMs = Date.now()\r\n\r\n logger.debug({ voiceId, chars: text.length }, 'Cartesia TTS stream start')\r\n\r\n try {\r\n const stream = await this.client.tts.generateSse({\r\n model_id: config?.modelId ?? this.config.modelId,\r\n transcript: text,\r\n voice: {\r\n mode: 'id',\r\n id: voiceId,\r\n ...(this.config.emotion && {\r\n __experimental_controls: {\r\n emotion: [this.config.emotion as `${string}:${string}`],\r\n },\r\n }),\r\n },\r\n output_format: {\r\n container: 'raw',\r\n encoding: 'pcm_s16le',\r\n sample_rate: toValidSampleRate(config?.sampleRate ?? this.config.sampleRate),\r\n },\r\n })\r\n\r\n let firstChunk = true\r\n for await (const event of stream as any) {\r\n // v3 Stainless Stream yields ServerSentEvent objects: { data: string }\r\n // Parse the JSON payload and extract the base64 audio chunk\r\n if (!event.data || event.data === '[DONE]') continue\r\n\r\n let payload: { chunk?: { audio?: string }, type?: string }\r\n try {\r\n payload = JSON.parse(event.data)\r\n } catch {\r\n continue\r\n }\r\n\r\n // Skip non-audio events (e.g. { type: \"timestamps\" })\r\n if (!payload.chunk?.audio) continue\r\n\r\n const buf = Buffer.from(payload.chunk.audio, 'base64')\r\n\r\n if (firstChunk) {\r\n firstChunk = false\r\n logger.debug({ ttfb: Date.now() - startMs, voiceId }, 'Cartesia first audio chunk')\r\n }\r\n\r\n yield buf\r\n }\r\n } catch (err) {\r\n throw new TTSStreamError('cartesia', err)\r\n }\r\n }\r\n\r\n /** Synthesize complete audio. */\r\n async synthesizeFull(text: string, config?: TTSConfig): Promise<Buffer> {\r\n const chunks: Buffer[] = []\r\n for await (const chunk of this.synthesizeStream(text, config)) {\r\n chunks.push(chunk)\r\n }\r\n return Buffer.concat(chunks)\r\n }\r\n}\r\n\r\nconst VALID_SAMPLE_RATES = [22050, 8000, 16000, 24000, 44100, 48000] as const\r\ntype ValidSampleRate = typeof VALID_SAMPLE_RATES[number]\r\n\r\nfunction toValidSampleRate(rate: number): ValidSampleRate {\r\n return (VALID_SAMPLE_RATES as readonly number[]).includes(rate)\r\n ? rate as ValidSampleRate\r\n : 8000\r\n}","/**\r\n * @voice-kit/core — ElevenLabs TTS Provider\r\n *\r\n * Streaming TTS using ElevenLabs SDK. Features:\r\n * - 100ms lookahead jitter buffer to smooth burst delivery\r\n * - Voice clone support\r\n * - Sub-300ms first chunk target\r\n */\r\n\r\nimport { ElevenLabsClient } from 'elevenlabs'\r\nimport { TTSConnectionError, TTSStreamError, TTSVoiceNotFoundError } from '../../errors'\r\nimport type { TTSProvider, TTSConfig } from '../../types'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:tts:elevenlabs' })\r\n\r\n/** Default voice: Rachel (neutral, clear, works well for en-IN) */\r\nconst DEFAULT_VOICE_ID = '21m00Tcm4TlvDq8ikWAM'\r\n\r\n/** Lookahead jitter buffer window in ms. Smooths burst packet delivery. */\r\nconst JITTER_BUFFER_MS = 100\r\n\r\n/**\r\n * ElevenLabs streaming TTS provider.\r\n * @internal — obtained via createTTS('elevenlabs', config)\r\n */\r\nexport class ElevenLabsTTSProvider implements TTSProvider {\r\n readonly name = 'elevenlabs'\r\n readonly outputSampleRate = 24_000 // ElevenLabs default: 24kHz\r\n readonly outputFormat = 'pcm' as const\r\n\r\n private readonly client: ElevenLabsClient\r\n private readonly config: Required<TTSConfig>\r\n\r\n constructor(config: TTSConfig) {\r\n const apiKey = config.apiKey ?? process.env['ELEVENLABS_API_KEY']\r\n if (!apiKey) throw new TTSConnectionError('elevenlabs', new Error('ELEVENLABS_API_KEY not set'))\r\n\r\n this.client = new ElevenLabsClient({ apiKey })\r\n this.config = {\r\n voiceId: config.voiceId ?? DEFAULT_VOICE_ID,\r\n sampleRate: config.sampleRate ?? 24_000,\r\n speed: config.speed ?? 1.0,\r\n pitch: config.pitch ?? 0,\r\n apiKey,\r\n modelId: config.modelId ?? 'eleven_turbo_v2_5',\r\n emotion: config.emotion ?? '',\r\n targetLanguage: config.targetLanguage ?? 'en-IN',\r\n }\r\n }\r\n\r\n /**\r\n * Stream synthesized audio from ElevenLabs.\r\n * First chunk target: < 300ms. Uses streaming API endpoint.\r\n *\r\n * A 100ms jitter buffer smooths burst packet delivery without adding\r\n * perceptible latency.\r\n *\r\n * @param text Text to synthesize (should be a sentence boundary chunk)\r\n * @param config Per-call config overrides\r\n *\r\n * @example\r\n * ```ts\r\n * const tts = createTTS('elevenlabs', { voiceId: 'your-voice-id' })\r\n * for await (const chunk of tts.synthesizeStream('Hello, how can I help?')) {\r\n * telephony.sendAudio(chunk)\r\n * }\r\n * ```\r\n */\r\n async *synthesizeStream(text: string, config?: TTSConfig): AsyncIterable<Buffer> {\r\n const voiceId = config?.voiceId ?? this.config.voiceId\r\n const modelId = config?.modelId ?? this.config.modelId\r\n const startMs = Date.now()\r\n\r\n logger.debug({ voiceId, modelId, chars: text.length }, 'ElevenLabs TTS stream start')\r\n\r\n try {\r\n const audioStream = await this.client.generate({\r\n voice: voiceId,\r\n text,\r\n model_id: modelId,\r\n voice_settings: {\r\n stability: 0.5,\r\n similarity_boost: 0.8,\r\n speed: config?.speed ?? this.config.speed,\r\n },\r\n output_format: 'pcm_24000',\r\n stream: true,\r\n })\r\n\r\n let firstChunk = true\r\n let jitterBuffer: Buffer[] = []\r\n let jitterTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n const flushJitterBuffer = function* () {\r\n for (const chunk of jitterBuffer) {\r\n yield chunk\r\n }\r\n jitterBuffer = []\r\n }\r\n\r\n for await (const chunk of audioStream) {\r\n const buf = chunk instanceof Buffer ? chunk : Buffer.from(chunk as ArrayBuffer)\r\n\r\n if (firstChunk) {\r\n firstChunk = false\r\n const ttfb = Date.now() - startMs\r\n logger.debug({ ttfb, voiceId }, 'ElevenLabs first audio chunk')\r\n }\r\n\r\n // Jitter buffer: collect for 100ms, then flush\r\n jitterBuffer.push(buf)\r\n\r\n if (jitterTimer === null) {\r\n jitterTimer = setTimeout(() => {\r\n // Flush is handled below in the generator — timer signals readiness\r\n }, JITTER_BUFFER_MS)\r\n }\r\n\r\n // Flush if buffer is large enough (avoid holding too much audio)\r\n const totalBytes = jitterBuffer.reduce((sum, b) => sum + b.length, 0)\r\n if (totalBytes >= 4_800) { // 100ms worth of 24kHz 16-bit PCM\r\n if (jitterTimer !== null) {\r\n clearTimeout(jitterTimer)\r\n jitterTimer = null\r\n }\r\n yield* flushJitterBuffer()\r\n }\r\n }\r\n\r\n // Final flush\r\n if (jitterTimer !== null) {\r\n clearTimeout(jitterTimer)\r\n }\r\n yield* flushJitterBuffer()\r\n\r\n logger.debug({ voiceId, totalMs: Date.now() - startMs }, 'ElevenLabs TTS stream complete')\r\n } catch (err) {\r\n if ((err as { statusCode?: number }).statusCode === 404) {\r\n throw new TTSVoiceNotFoundError('elevenlabs', voiceId)\r\n }\r\n throw new TTSStreamError('elevenlabs', err)\r\n }\r\n }\r\n\r\n /**\r\n * Synthesize full audio (for pre-caching greetings, IVR prompts).\r\n * Collects all streaming chunks into a single buffer.\r\n *\r\n * @param text Text to synthesize\r\n * @param config Per-call config overrides\r\n */\r\n async synthesizeFull(text: string, config?: TTSConfig): Promise<Buffer> {\r\n const chunks: Buffer[] = []\r\n for await (const chunk of this.synthesizeStream(text, config)) {\r\n chunks.push(chunk)\r\n }\r\n return Buffer.concat(chunks)\r\n }\r\n}","/**\r\n * @voice-kit/core — Sarvam AI TTS Provider\r\n *\r\n * Sarvam AI TTS for Hindi/Hinglish and regional Indian languages.\r\n * Supports natural-sounding Indian voices with regional accents.\r\n */\r\n\r\nimport axios, { type AxiosInstance } from 'axios'\r\nimport { TTSConnectionError, TTSStreamError } from '../../errors'\r\nimport type { TTSProvider, TTSConfig } from '../../types'\r\nimport pino from 'pino'\r\n\r\nconst logger = pino({ name: '@voice-kit/core:tts:sarvam' })\r\n\r\nconst SARVAM_API_BASE = 'https://api.sarvam.ai'\r\n\r\n/** Available Sarvam TTS voices per language. */\r\nconst SARVAM_VOICES: Record<string, string[]> = {\r\n 'hi-IN': ['meera', 'pavithra', 'maitreyi', 'arvind', 'amol', 'amartya'],\r\n 'kn-IN': ['pavithra', 'meera'],\r\n 'ta-IN': ['pavithra', 'meera'],\r\n 'te-IN': ['pavithra', 'meera'],\r\n 'mr-IN': ['pavithra', 'meera'],\r\n 'bn-IN': ['meera'],\r\n 'gu-IN': ['meera'],\r\n 'pa-IN': ['meera'],\r\n}\r\n\r\n/** Default voices per language. */\r\nconst DEFAULT_VOICES: Record<string, string> = {\r\n 'hi-IN': 'meera',\r\n 'kn-IN': 'pavithra',\r\n 'ta-IN': 'pavithra',\r\n 'te-IN': 'pavithra',\r\n 'mr-IN': 'meera',\r\n 'bn-IN': 'meera',\r\n 'gu-IN': 'meera',\r\n 'pa-IN': 'meera',\r\n}\r\n\r\ninterface SarvamTTSResponse {\r\n audios: string[] // base64 encoded audio segments\r\n}\r\n\r\n/**\r\n * Sarvam AI TTS provider for Indic languages.\r\n * @internal — obtained via createTTS('sarvam', config)\r\n */\r\nexport class SarvamTTSProvider implements TTSProvider {\r\n readonly name = 'sarvam'\r\n readonly outputSampleRate = 22_050 // Sarvam default\r\n readonly outputFormat = 'mp3' as const\r\n\r\n private readonly http: AxiosInstance\r\n private readonly config: Required<TTSConfig>\r\n\r\n constructor(config: TTSConfig) {\r\n const apiKey = config.apiKey ?? process.env['SARVAM_API_KEY']\r\n if (!apiKey) throw new TTSConnectionError('sarvam', new Error('SARVAM_API_KEY not set'))\r\n\r\n const targetLanguage = config.targetLanguage ?? 'hi-IN'\r\n const defaultVoice = DEFAULT_VOICES[targetLanguage] ?? 'meera'\r\n\r\n this.http = axios.create({\r\n baseURL: SARVAM_API_BASE,\r\n headers: {\r\n 'API-Subscription-Key': apiKey,\r\n 'Content-Type': 'application/json',\r\n },\r\n timeout: 15_000,\r\n })\r\n\r\n this.config = {\r\n voiceId: config.voiceId ?? defaultVoice,\r\n sampleRate: config.sampleRate ?? 22_050,\r\n speed: config.speed ?? 1.0,\r\n pitch: config.pitch ?? 0,\r\n apiKey,\r\n modelId: config.modelId ?? 'bulbul:v1',\r\n emotion: '',\r\n targetLanguage,\r\n }\r\n }\r\n\r\n /**\r\n * Synthesize text in an Indic language and stream audio chunks.\r\n * Sarvam returns full audio segments — we chunk them for streaming compatibility.\r\n *\r\n * @example\r\n * ```ts\r\n * const tts = createTTS('sarvam', { targetLanguage: 'hi-IN' })\r\n * for await (const chunk of tts.synthesizeStream('नमस्ते, मैं आपकी कैसे मदद कर सकता हूँ?')) {\r\n * telephony.sendAudio(chunk)\r\n * }\r\n * ```\r\n */\r\n async *synthesizeStream(text: string, config?: TTSConfig): AsyncIterable<Buffer> {\r\n const startMs = Date.now()\r\n const targetLanguage = config?.targetLanguage ?? this.config.targetLanguage\r\n const speaker = config?.voiceId ?? this.config.voiceId\r\n\r\n logger.debug({ targetLanguage, speaker, chars: text.length }, 'Sarvam TTS request')\r\n\r\n try {\r\n const response = await this.http.post<SarvamTTSResponse>('/text-to-speech', {\r\n inputs: [text],\r\n target_language_code: targetLanguage,\r\n speaker,\r\n model: config?.modelId ?? this.config.modelId,\r\n pitch: config?.pitch ?? this.config.pitch,\r\n pace: config?.speed ?? this.config.speed,\r\n loudness: 1.0,\r\n speech_sample_rate: config?.sampleRate ?? this.config.sampleRate,\r\n enable_preprocessing: true,\r\n })\r\n\r\n const audioSegments = response.data.audios\r\n if (!audioSegments || audioSegments.length === 0) {\r\n throw new TTSStreamError('sarvam', new Error('No audio returned from Sarvam TTS'))\r\n }\r\n\r\n logger.debug(\r\n { segments: audioSegments.length, latencyMs: Date.now() - startMs },\r\n 'Sarvam TTS response received'\r\n )\r\n\r\n // Decode base64 segments and stream as chunks\r\n for (const segment of audioSegments) {\r\n const buf = Buffer.from(segment, 'base64')\r\n\r\n // Stream in 4KB chunks for smooth playback\r\n const CHUNK_SIZE = 4_096\r\n let offset = 0\r\n while (offset < buf.length) {\r\n yield buf.subarray(offset, Math.min(offset + CHUNK_SIZE, buf.length))\r\n offset += CHUNK_SIZE\r\n }\r\n }\r\n } catch (err) {\r\n if (axios.isAxiosError(err)) {\r\n throw new TTSStreamError(\r\n 'sarvam',\r\n new Error(`Sarvam TTS API error: ${err.response?.status} ${JSON.stringify(err.response?.data)}`)\r\n )\r\n }\r\n throw new TTSStreamError('sarvam', err)\r\n }\r\n }\r\n\r\n /** Synthesize complete audio buffer. */\r\n async synthesizeFull(text: string, config?: TTSConfig): Promise<Buffer> {\r\n const chunks: Buffer[] = []\r\n for await (const chunk of this.synthesizeStream(text, config)) {\r\n chunks.push(chunk)\r\n }\r\n return Buffer.concat(chunks)\r\n }\r\n}","/**\r\n * @voice-kit/core — TTS factory\r\n *\r\n * createTTS() is the ONLY public API for text-to-speech.\r\n * Never instantiate provider classes directly.\r\n */\r\n\r\nimport type { TTSProvider, TTSConfig } from '../types'\r\nimport { ElevenLabsTTSProvider } from './elevenlabs'\r\nimport { CartesiaTTSProvider } from './cartesia'\r\nimport { SarvamTTSProvider } from './sarvam'\r\n\r\n/**\r\n * Create a TTS provider instance.\r\n *\r\n * Provider selection guide:\r\n * - 'elevenlabs' → Best voice quality, cloning support, en-IN\r\n * - 'cartesia' → Lowest latency (< 90ms TTFB), good for fast-paced agents\r\n * - 'sarvam' → Best for Indic languages (hi-IN, ta-IN, kn-IN, te-IN, mr-IN)\r\n *\r\n * @example\r\n * ```ts\r\n * // English with voice cloning\r\n * const tts = createTTS('elevenlabs', { voiceId: 'your-cloned-voice-id' })\r\n *\r\n * // Ultra-low latency English\r\n * const tts = createTTS('cartesia', { voiceId: 'your-voice-id' })\r\n *\r\n * // Hindi\r\n * const tts = createTTS('sarvam', { targetLanguage: 'hi-IN', voiceId: 'meera' })\r\n * ```\r\n */\r\nexport function createTTS(\r\n provider: 'elevenlabs' | 'cartesia' | 'sarvam',\r\n config?: TTSConfig\r\n): TTSProvider {\r\n const cfg = config ?? {}\r\n\r\n switch (provider) {\r\n case 'elevenlabs':\r\n return new ElevenLabsTTSProvider(cfg)\r\n case 'cartesia':\r\n return new CartesiaTTSProvider(cfg)\r\n case 'sarvam':\r\n return new SarvamTTSProvider(cfg)\r\n default: {\r\n const _exhaustive: never = provider\r\n throw new Error(`Unknown TTS provider: ${String(_exhaustive)}`)\r\n }\r\n }\r\n}"]}
|