@livekit/agents-plugin-openai 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/index.cjs +55 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +13 -8
- package/dist/index.js.map +1 -1
- package/dist/llm.cjs +502 -0
- package/dist/llm.cjs.map +1 -0
- package/dist/llm.js +435 -424
- package/dist/llm.js.map +1 -1
- package/dist/models.cjs +17 -0
- package/dist/models.cjs.map +1 -0
- package/dist/models.js +0 -4
- package/dist/models.js.map +1 -1
- package/dist/realtime/api_proto.cjs +41 -0
- package/dist/realtime/api_proto.cjs.map +1 -0
- package/dist/realtime/api_proto.js +12 -8
- package/dist/realtime/api_proto.js.map +1 -1
- package/dist/realtime/index.cjs +25 -0
- package/dist/realtime/index.cjs.map +1 -0
- package/dist/realtime/index.js +2 -5
- package/dist/realtime/index.js.map +1 -1
- package/dist/realtime/realtime_model.cjs +878 -0
- package/dist/realtime/realtime_model.cjs.map +1 -0
- package/dist/realtime/realtime_model.js +828 -777
- package/dist/realtime/realtime_model.js.map +1 -1
- package/dist/stt.cjs +130 -0
- package/dist/stt.cjs.map +1 -0
- package/dist/stt.js +99 -102
- package/dist/stt.js.map +1 -1
- package/dist/tts.cjs +100 -0
- package/dist/tts.cjs.map +1 -0
- package/dist/tts.d.ts +1 -1
- package/dist/tts.d.ts.map +1 -1
- package/dist/tts.js +67 -65
- package/dist/tts.js.map +1 -1
- package/package.json +18 -8
- package/src/tts.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime_model.js","sourceRoot":"","sources":["../../src/realtime/realtime_model.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/realtime/realtime_model.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport {\n AsyncIterableQueue,\n Future,\n Queue,\n llm,\n log,\n mergeFrames,\n multimodal,\n} from '@livekit/agents';\nimport { AudioFrame } from '@livekit/rtc-node';\nimport { once } from 'node:events';\nimport { WebSocket } from 'ws';\nimport * as api_proto from './api_proto.js';\n\ninterface ModelOptions {\n modalities: ['text', 'audio'] | ['text'];\n instructions: string;\n voice: api_proto.Voice;\n inputAudioFormat: api_proto.AudioFormat;\n outputAudioFormat: api_proto.AudioFormat;\n inputAudioTranscription: api_proto.InputAudioTranscription | null;\n turnDetection: api_proto.TurnDetectionType | null;\n temperature: number;\n maxResponseOutputTokens: number;\n model: api_proto.Model;\n apiKey?: string;\n baseURL: string;\n isAzure: boolean;\n entraToken?: string;\n apiVersion?: string;\n}\n\nexport interface RealtimeResponse {\n id: string;\n status: api_proto.ResponseStatus;\n statusDetails: api_proto.ResponseStatusDetails | null;\n usage: api_proto.ModelUsage | null;\n output: RealtimeOutput[];\n doneFut: Future;\n}\n\nexport interface RealtimeOutput {\n responseId: string;\n itemId: string;\n outputIndex: number;\n role: api_proto.Role;\n type: 'message' | 'function_call';\n content: RealtimeContent[];\n doneFut: Future;\n}\n\nexport interface RealtimeContent {\n responseId: string;\n itemId: string;\n outputIndex: number;\n contentIndex: number;\n text: string;\n audio: AudioFrame[];\n textStream: AsyncIterableQueue<string>;\n audioStream: AsyncIterableQueue<AudioFrame>;\n toolCalls: RealtimeToolCall[];\n}\n\nexport interface RealtimeToolCall {\n name: string;\n arguments: string;\n toolCallID: string;\n}\n\nexport interface InputSpeechTranscriptionCompleted {\n itemId: string;\n transcript: string;\n}\n\nexport interface InputSpeechTranscriptionFailed {\n itemId: string;\n message: string;\n}\n\nexport interface InputSpeechStarted {\n itemId: string;\n}\n\nexport interface InputSpeechCommitted {\n itemId: string;\n}\n\nclass InputAudioBuffer {\n #session: RealtimeSession;\n\n constructor(session: RealtimeSession) {\n this.#session = session;\n }\n\n append(frame: AudioFrame) {\n this.#session.queueMsg({\n type: 'input_audio_buffer.append',\n audio: Buffer.from(frame.data.buffer).toString('base64'),\n });\n }\n\n clear() {\n this.#session.queueMsg({\n type: 'input_audio_buffer.clear',\n });\n }\n\n commit() {\n this.#session.queueMsg({\n type: 'input_audio_buffer.commit',\n });\n }\n}\n\nclass ConversationItem {\n #session: RealtimeSession;\n #logger = log();\n\n constructor(session: RealtimeSession) {\n this.#session = session;\n }\n\n truncate(itemId: string, contentIndex: number, audioEnd: number) {\n this.#session.queueMsg({\n type: 'conversation.item.truncate',\n item_id: itemId,\n content_index: contentIndex,\n audio_end_ms: audioEnd,\n });\n }\n\n delete(itemId: string) {\n this.#session.queueMsg({\n type: 'conversation.item.delete',\n item_id: itemId,\n });\n }\n\n create(message: llm.ChatMessage, previousItemId?: string): void {\n if (!message.content) {\n return;\n }\n\n let event: api_proto.ConversationItemCreateEvent;\n\n if (message.toolCallId) {\n if (typeof message.content !== 'string') {\n throw new TypeError('message.content must be a string');\n }\n\n event = {\n type: 'conversation.item.create',\n previous_item_id: previousItemId,\n item: {\n type: 'function_call_output',\n call_id: message.toolCallId,\n output: message.content,\n },\n };\n } else {\n let content = message.content;\n if (!Array.isArray(content)) {\n content = [content];\n }\n\n if (message.role === llm.ChatRole.USER) {\n const contents: (api_proto.InputTextContent | api_proto.InputAudioContent)[] = [];\n for (const c of content) {\n if (typeof c === 'string') {\n contents.push({\n type: 'input_text',\n text: c,\n });\n } else if (\n // typescript type guard for determining ChatAudio vs ChatImage\n ((c: llm.ChatAudio | llm.ChatImage): c is llm.ChatAudio => {\n return (c as llm.ChatAudio).frame !== undefined;\n })(c)\n ) {\n contents.push({\n type: 'input_audio',\n audio: Buffer.from(mergeFrames(c.frame).data.buffer).toString('base64'),\n });\n }\n }\n\n event = {\n type: 'conversation.item.create',\n previous_item_id: previousItemId,\n item: {\n type: 'message',\n role: 'user',\n content: contents,\n },\n };\n } else if (message.role === llm.ChatRole.ASSISTANT) {\n const contents: api_proto.TextContent[] = [];\n for (const c of content) {\n if (typeof c === 'string') {\n contents.push({\n type: 'text',\n text: c,\n });\n } else if (\n // typescript type guard for determining ChatAudio vs ChatImage\n ((c: llm.ChatAudio | llm.ChatImage): c is llm.ChatAudio => {\n return (c as llm.ChatAudio).frame !== undefined;\n })(c)\n ) {\n this.#logger.warn('audio content in assistant message is not supported');\n }\n }\n\n event = {\n type: 'conversation.item.create',\n previous_item_id: previousItemId,\n item: {\n type: 'message',\n role: 'assistant',\n content: contents,\n },\n };\n } else if (message.role === llm.ChatRole.SYSTEM) {\n const contents: api_proto.InputTextContent[] = [];\n for (const c of content) {\n if (typeof c === 'string') {\n contents.push({\n type: 'input_text',\n text: c,\n });\n } else if (\n // typescript type guard for determining ChatAudio vs ChatImage\n ((c: llm.ChatAudio | llm.ChatImage): c is llm.ChatAudio => {\n return (c as llm.ChatAudio).frame !== undefined;\n })(c)\n ) {\n this.#logger.warn('audio content in system message is not supported');\n }\n }\n\n event = {\n type: 'conversation.item.create',\n previous_item_id: previousItemId,\n item: {\n type: 'message',\n role: 'system',\n content: contents,\n },\n };\n } else {\n this.#logger\n .child({ message })\n .warn('chat message is not supported inside the realtime API');\n return;\n }\n }\n\n this.#session.queueMsg(event);\n }\n}\n\nclass Conversation {\n #session: RealtimeSession;\n\n constructor(session: RealtimeSession) {\n this.#session = session;\n }\n\n get item(): ConversationItem {\n return new ConversationItem(this.#session);\n }\n}\n\nclass Response {\n #session: RealtimeSession;\n\n constructor(session: RealtimeSession) {\n this.#session = session;\n }\n\n create() {\n this.#session.queueMsg({\n type: 'response.create',\n });\n }\n\n cancel() {\n this.#session.queueMsg({\n type: 'response.cancel',\n });\n }\n}\n\ninterface ContentPtr {\n response_id: string;\n output_index: number;\n content_index: number;\n}\n\nexport class RealtimeModel extends multimodal.RealtimeModel {\n sampleRate = api_proto.SAMPLE_RATE;\n numChannels = api_proto.NUM_CHANNELS;\n inFrameSize = api_proto.IN_FRAME_SIZE;\n outFrameSize = api_proto.OUT_FRAME_SIZE;\n\n #defaultOpts: ModelOptions;\n #sessions: RealtimeSession[] = [];\n\n static withAzure({\n baseURL,\n azureDeployment,\n apiVersion = '2024-10-01-preview',\n apiKey = undefined,\n entraToken = undefined,\n instructions = '',\n modalities = ['text', 'audio'],\n voice = 'alloy',\n inputAudioFormat = 'pcm16',\n outputAudioFormat = 'pcm16',\n inputAudioTranscription = { model: 'whisper-1' },\n turnDetection = { type: 'server_vad' },\n temperature = 0.8,\n maxResponseOutputTokens = Infinity,\n }: {\n baseURL: string;\n azureDeployment: string;\n apiVersion?: string;\n apiKey?: string;\n entraToken?: string;\n instructions?: string;\n modalities?: ['text', 'audio'] | ['text'];\n voice?: api_proto.Voice;\n inputAudioFormat?: api_proto.AudioFormat;\n outputAudioFormat?: api_proto.AudioFormat;\n inputAudioTranscription?: api_proto.InputAudioTranscription;\n turnDetection?: api_proto.TurnDetectionType;\n temperature?: number;\n maxResponseOutputTokens?: number;\n }) {\n return new RealtimeModel({\n isAzure: true,\n baseURL: new URL('openai', baseURL).toString(),\n model: azureDeployment,\n apiVersion,\n apiKey,\n entraToken,\n instructions,\n modalities,\n voice,\n inputAudioFormat,\n outputAudioFormat,\n inputAudioTranscription,\n turnDetection,\n temperature,\n maxResponseOutputTokens,\n });\n }\n\n constructor({\n modalities = ['text', 'audio'],\n instructions = '',\n voice = 'alloy',\n inputAudioFormat = 'pcm16',\n outputAudioFormat = 'pcm16',\n inputAudioTranscription = { model: 'whisper-1' },\n turnDetection = { type: 'server_vad' },\n temperature = 0.8,\n maxResponseOutputTokens = Infinity,\n model = 'gpt-4o-realtime-preview-2024-10-01',\n apiKey = process.env.OPENAI_API_KEY || '',\n baseURL = api_proto.BASE_URL,\n // used for microsoft\n isAzure = false,\n apiVersion = undefined,\n entraToken = undefined,\n }: {\n modalities?: ['text', 'audio'] | ['text'];\n instructions?: string;\n voice?: api_proto.Voice;\n inputAudioFormat?: api_proto.AudioFormat;\n outputAudioFormat?: api_proto.AudioFormat;\n inputAudioTranscription?: api_proto.InputAudioTranscription;\n turnDetection?: api_proto.TurnDetectionType;\n temperature?: number;\n maxResponseOutputTokens?: number;\n model?: api_proto.Model;\n apiKey?: string;\n baseURL?: string;\n isAzure?: boolean;\n apiVersion?: string;\n entraToken?: string;\n }) {\n super();\n\n if (apiKey === '') {\n throw new Error(\n 'OpenAI API key is required, either using the argument or by setting the OPENAI_API_KEY environmental variable',\n );\n }\n\n this.#defaultOpts = {\n modalities,\n instructions,\n voice,\n inputAudioFormat,\n outputAudioFormat,\n inputAudioTranscription,\n turnDetection,\n temperature,\n maxResponseOutputTokens,\n model,\n apiKey,\n baseURL,\n isAzure,\n apiVersion,\n entraToken,\n };\n }\n\n get sessions(): RealtimeSession[] {\n return this.#sessions;\n }\n\n session({\n fncCtx,\n chatCtx,\n modalities = this.#defaultOpts.modalities,\n instructions = this.#defaultOpts.instructions,\n voice = this.#defaultOpts.voice,\n inputAudioFormat = this.#defaultOpts.inputAudioFormat,\n outputAudioFormat = this.#defaultOpts.outputAudioFormat,\n inputAudioTranscription = this.#defaultOpts.inputAudioTranscription,\n turnDetection = this.#defaultOpts.turnDetection,\n temperature = this.#defaultOpts.temperature,\n maxResponseOutputTokens = this.#defaultOpts.maxResponseOutputTokens,\n }: {\n fncCtx?: llm.FunctionContext;\n chatCtx?: llm.ChatContext;\n modalities?: ['text', 'audio'] | ['text'];\n instructions?: string;\n voice?: api_proto.Voice;\n inputAudioFormat?: api_proto.AudioFormat;\n outputAudioFormat?: api_proto.AudioFormat;\n inputAudioTranscription?: api_proto.InputAudioTranscription | null;\n turnDetection?: api_proto.TurnDetectionType | null;\n temperature?: number;\n maxResponseOutputTokens?: number;\n }): RealtimeSession {\n const opts: ModelOptions = {\n modalities,\n instructions,\n voice,\n inputAudioFormat,\n outputAudioFormat,\n inputAudioTranscription,\n turnDetection,\n temperature,\n maxResponseOutputTokens,\n model: this.#defaultOpts.model,\n apiKey: this.#defaultOpts.apiKey,\n baseURL: this.#defaultOpts.baseURL,\n isAzure: this.#defaultOpts.isAzure,\n apiVersion: this.#defaultOpts.apiVersion,\n entraToken: this.#defaultOpts.entraToken,\n };\n\n const newSession = new RealtimeSession(opts, {\n chatCtx: chatCtx || new llm.ChatContext(),\n fncCtx,\n });\n this.#sessions.push(newSession);\n return newSession;\n }\n\n async close() {\n await Promise.allSettled(this.#sessions.map((session) => session.close()));\n }\n}\n\nexport class RealtimeSession extends multimodal.RealtimeSession {\n #chatCtx: llm.ChatContext | undefined = undefined;\n #fncCtx: llm.FunctionContext | undefined = undefined;\n #opts: ModelOptions;\n #pendingResponses: { [id: string]: RealtimeResponse } = {};\n #sessionId = 'not-connected';\n #ws: WebSocket | null = null;\n #expiresAt: number | null = null;\n #logger = log();\n #task: Promise<void>;\n #closing = true;\n #sendQueue = new Queue<api_proto.ClientEvent>();\n\n constructor(\n opts: ModelOptions,\n { fncCtx, chatCtx }: { fncCtx?: llm.FunctionContext; chatCtx?: llm.ChatContext },\n ) {\n super();\n\n this.#opts = opts;\n this.#chatCtx = chatCtx;\n this.#fncCtx = fncCtx;\n\n this.#task = this.#start();\n\n this.sessionUpdate({\n modalities: this.#opts.modalities,\n instructions: this.#opts.instructions,\n voice: this.#opts.voice,\n inputAudioFormat: this.#opts.inputAudioFormat,\n outputAudioFormat: this.#opts.outputAudioFormat,\n inputAudioTranscription: this.#opts.inputAudioTranscription,\n turnDetection: this.#opts.turnDetection,\n temperature: this.#opts.temperature,\n maxResponseOutputTokens: this.#opts.maxResponseOutputTokens,\n toolChoice: 'auto',\n });\n }\n\n get chatCtx(): llm.ChatContext | undefined {\n return this.#chatCtx;\n }\n\n get fncCtx(): llm.FunctionContext | undefined {\n return this.#fncCtx;\n }\n\n set fncCtx(ctx: llm.FunctionContext | undefined) {\n this.#fncCtx = ctx;\n }\n\n get conversation(): Conversation {\n return new Conversation(this);\n }\n\n get inputAudioBuffer(): InputAudioBuffer {\n return new InputAudioBuffer(this);\n }\n\n get response(): Response {\n return new Response(this);\n }\n\n get expiration(): number {\n if (!this.#expiresAt) {\n throw new Error('session not started');\n }\n return this.#expiresAt * 1000;\n }\n\n queueMsg(command: api_proto.ClientEvent): void {\n this.#sendQueue.put(command);\n }\n\n /// Truncates the data field of the event to the specified maxLength to avoid overwhelming logs\n /// with large amounts of base64 audio data.\n #loggableEvent(\n event: api_proto.ClientEvent | api_proto.ServerEvent,\n maxLength: number = 30,\n ): Record<string, unknown> {\n const untypedEvent: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(event)) {\n if (value !== undefined) {\n untypedEvent[key] = value;\n }\n }\n\n if (untypedEvent.audio && typeof untypedEvent.audio === 'string') {\n const truncatedData =\n untypedEvent.audio.slice(0, maxLength) + (untypedEvent.audio.length > maxLength ? '…' : '');\n return { ...untypedEvent, audio: truncatedData };\n }\n if (\n untypedEvent.delta &&\n typeof untypedEvent.delta === 'string' &&\n event.type === 'response.audio.delta'\n ) {\n const truncatedDelta =\n untypedEvent.delta.slice(0, maxLength) + (untypedEvent.delta.length > maxLength ? '…' : '');\n return { ...untypedEvent, delta: truncatedDelta };\n }\n return untypedEvent;\n }\n\n sessionUpdate({\n modalities = this.#opts.modalities,\n instructions = this.#opts.instructions,\n voice = this.#opts.voice,\n inputAudioFormat = this.#opts.inputAudioFormat,\n outputAudioFormat = this.#opts.outputAudioFormat,\n inputAudioTranscription = this.#opts.inputAudioTranscription,\n turnDetection = this.#opts.turnDetection,\n temperature = this.#opts.temperature,\n maxResponseOutputTokens = this.#opts.maxResponseOutputTokens,\n toolChoice = 'auto',\n }: {\n modalities: ['text', 'audio'] | ['text'];\n instructions?: string;\n voice?: api_proto.Voice;\n inputAudioFormat?: api_proto.AudioFormat;\n outputAudioFormat?: api_proto.AudioFormat;\n inputAudioTranscription?: api_proto.InputAudioTranscription | null;\n turnDetection?: api_proto.TurnDetectionType | null;\n temperature?: number;\n maxResponseOutputTokens?: number;\n toolChoice?: api_proto.ToolChoice;\n }) {\n this.#opts = {\n modalities,\n instructions,\n voice,\n inputAudioFormat,\n outputAudioFormat,\n inputAudioTranscription,\n turnDetection,\n temperature,\n maxResponseOutputTokens,\n model: this.#opts.model,\n apiKey: this.#opts.apiKey,\n baseURL: this.#opts.baseURL,\n isAzure: this.#opts.isAzure,\n apiVersion: this.#opts.apiVersion,\n entraToken: this.#opts.entraToken,\n };\n\n const tools = this.#fncCtx\n ? Object.entries(this.#fncCtx).map(([name, func]) => ({\n type: 'function' as const,\n name,\n description: func.description,\n parameters:\n // don't format parameters if they are raw openai params\n func.parameters.type == ('object' as const)\n ? func.parameters\n : llm.oaiParams(func.parameters),\n }))\n : [];\n\n const sessionUpdateEvent: api_proto.SessionUpdateEvent = {\n type: 'session.update',\n session: {\n modalities: this.#opts.modalities,\n instructions: this.#opts.instructions,\n voice: this.#opts.voice,\n input_audio_format: this.#opts.inputAudioFormat,\n output_audio_format: this.#opts.outputAudioFormat,\n input_audio_transcription: this.#opts.inputAudioTranscription,\n turn_detection: this.#opts.turnDetection,\n temperature: this.#opts.temperature,\n max_response_output_tokens:\n this.#opts.maxResponseOutputTokens === Infinity\n ? 'inf'\n : this.#opts.maxResponseOutputTokens,\n tools,\n tool_choice: toolChoice,\n },\n };\n\n if (this.#opts.isAzure && this.#opts.maxResponseOutputTokens === Infinity) {\n // microsoft doesn't support inf for max_response_output_tokens, but accepts no args\n sessionUpdateEvent.session.max_response_output_tokens = undefined;\n }\n\n this.queueMsg(sessionUpdateEvent);\n }\n\n #start(): Promise<void> {\n return new Promise(async (resolve, reject) => {\n const headers: Record<string, string> = {\n 'User-Agent': 'LiveKit-Agents-JS',\n };\n if (this.#opts.isAzure) {\n // Microsoft API has two ways of authentication\n // 1. Entra token set as `Bearer` token\n // 2. API key set as `api_key` header (also accepts query string)\n if (this.#opts.entraToken) {\n headers.Authorization = `Bearer ${this.#opts.entraToken}`;\n } else if (this.#opts.apiKey) {\n headers['api-key'] = this.#opts.apiKey;\n } else {\n reject(new Error('Microsoft API key or entraToken is required'));\n return;\n }\n } else {\n headers.Authorization = `Bearer ${this.#opts.apiKey}`;\n headers['OpenAI-Beta'] = 'realtime=v1';\n }\n const url = new URL([this.#opts.baseURL, 'realtime'].join('/'));\n if (url.protocol === 'https:') {\n url.protocol = 'wss:';\n }\n\n // Construct query parameters\n const queryParams: Record<string, string> = {};\n if (this.#opts.isAzure) {\n queryParams['api-version'] = '2024-10-01-preview';\n queryParams['deployment'] = this.#opts.model;\n } else {\n queryParams['model'] = this.#opts.model;\n }\n\n for (const [key, value] of Object.entries(queryParams)) {\n url.searchParams.set(key, value);\n }\n\n console.debug('Connecting to OpenAI Realtime API at ', url.toString());\n this.#ws = new WebSocket(url.toString(), {\n headers: headers,\n });\n\n this.#ws.onerror = (error) => {\n reject(new Error('OpenAI Realtime WebSocket error: ' + error.message));\n };\n\n await once(this.#ws, 'open');\n this.#closing = false;\n\n this.#ws.onmessage = (message) => {\n const event: api_proto.ServerEvent = JSON.parse(message.data as string);\n this.#logger.debug(`<- ${JSON.stringify(this.#loggableEvent(event))}`);\n switch (event.type) {\n case 'error':\n this.#handleError(event);\n break;\n case 'session.created':\n this.#handleSessionCreated(event);\n break;\n case 'session.updated':\n this.#handleSessionUpdated(event);\n break;\n case 'conversation.created':\n this.#handleConversationCreated(event);\n break;\n case 'input_audio_buffer.committed':\n this.#handleInputAudioBufferCommitted(event);\n break;\n case 'input_audio_buffer.cleared':\n this.#handleInputAudioBufferCleared(event);\n break;\n case 'input_audio_buffer.speech_started':\n this.#handleInputAudioBufferSpeechStarted(event);\n break;\n case 'input_audio_buffer.speech_stopped':\n this.#handleInputAudioBufferSpeechStopped(event);\n break;\n case 'conversation.item.created':\n this.#handleConversationItemCreated(event);\n break;\n case 'conversation.item.input_audio_transcription.completed':\n this.#handleConversationItemInputAudioTranscriptionCompleted(event);\n break;\n case 'conversation.item.input_audio_transcription.failed':\n this.#handleConversationItemInputAudioTranscriptionFailed(event);\n break;\n case 'conversation.item.truncated':\n this.#handleConversationItemTruncated(event);\n break;\n case 'conversation.item.deleted':\n this.#handleConversationItemDeleted(event);\n break;\n case 'response.created':\n this.#handleResponseCreated(event);\n break;\n case 'response.done':\n this.#handleResponseDone(event);\n break;\n case 'response.output_item.added':\n this.#handleResponseOutputItemAdded(event);\n break;\n case 'response.output_item.done':\n this.#handleResponseOutputItemDone(event);\n break;\n case 'response.content_part.added':\n this.#handleResponseContentPartAdded(event);\n break;\n case 'response.content_part.done':\n this.#handleResponseContentPartDone(event);\n break;\n case 'response.text.delta':\n this.#handleResponseTextDelta(event);\n break;\n case 'response.text.done':\n this.#handleResponseTextDone(event);\n break;\n case 'response.audio_transcript.delta':\n this.#handleResponseAudioTranscriptDelta(event);\n break;\n case 'response.audio_transcript.done':\n this.#handleResponseAudioTranscriptDone(event);\n break;\n case 'response.audio.delta':\n this.#handleResponseAudioDelta(event);\n break;\n case 'response.audio.done':\n this.#handleResponseAudioDone(event);\n break;\n case 'response.function_call_arguments.delta':\n this.#handleResponseFunctionCallArgumentsDelta(event);\n break;\n case 'response.function_call_arguments.done':\n this.#handleResponseFunctionCallArgumentsDone(event);\n break;\n case 'rate_limits.updated':\n this.#handleRateLimitsUpdated(event);\n break;\n }\n };\n\n const sendTask = async () => {\n while (this.#ws && !this.#closing && this.#ws.readyState === WebSocket.OPEN) {\n try {\n const event = await this.#sendQueue.get();\n if (event.type !== 'input_audio_buffer.append') {\n this.#logger.debug(`-> ${JSON.stringify(this.#loggableEvent(event))}`);\n }\n this.#ws.send(JSON.stringify(event));\n } catch (error) {\n this.#logger.error('Error sending event:', error);\n }\n }\n };\n\n sendTask();\n\n this.#ws.onclose = () => {\n if (this.#expiresAt && Date.now() >= this.#expiresAt * 1000) {\n this.#closing = true;\n }\n if (!this.#closing) {\n reject(new Error('OpenAI Realtime connection closed unexpectedly'));\n }\n this.#ws = null;\n resolve();\n };\n });\n }\n\n async close() {\n if (!this.#ws) return;\n this.#closing = true;\n this.#ws.close();\n await this.#task;\n }\n\n #getContent(ptr: ContentPtr): RealtimeContent {\n const response = this.#pendingResponses[ptr.response_id];\n const output = response!.output[ptr.output_index];\n const content = output!.content[ptr.content_index]!;\n return content;\n }\n\n #handleError(event: api_proto.ErrorEvent): void {\n this.#logger.error(`OpenAI Realtime error ${JSON.stringify(event.error)}`);\n }\n\n #handleSessionCreated(event: api_proto.SessionCreatedEvent): void {\n this.#sessionId = event.session.id;\n this.#expiresAt = event.session.expires_at;\n this.#logger = this.#logger.child({ sessionId: this.#sessionId });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n #handleSessionUpdated(event: api_proto.SessionUpdatedEvent): void {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n #handleConversationCreated(event: api_proto.ConversationCreatedEvent): void {}\n\n #handleInputAudioBufferCommitted(event: api_proto.InputAudioBufferCommittedEvent): void {\n this.emit('input_speech_committed', {\n itemId: event.item_id,\n } as InputSpeechCommitted);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n #handleInputAudioBufferCleared(event: api_proto.InputAudioBufferClearedEvent): void {}\n\n #handleInputAudioBufferSpeechStarted(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n event: api_proto.InputAudioBufferSpeechStartedEvent,\n ): void {\n this.emit('input_speech_started', {\n itemId: event.item_id,\n } as InputSpeechStarted);\n }\n\n #handleInputAudioBufferSpeechStopped(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n event: api_proto.InputAudioBufferSpeechStoppedEvent,\n ): void {\n this.emit('input_speech_stopped');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n #handleConversationItemCreated(event: api_proto.ConversationItemCreatedEvent): void {}\n\n #handleConversationItemInputAudioTranscriptionCompleted(\n event: api_proto.ConversationItemInputAudioTranscriptionCompletedEvent,\n ): void {\n const transcript = event.transcript;\n this.emit('input_speech_transcription_completed', {\n itemId: event.item_id,\n transcript: transcript,\n } as InputSpeechTranscriptionCompleted);\n }\n\n #handleConversationItemInputAudioTranscriptionFailed(\n event: api_proto.ConversationItemInputAudioTranscriptionFailedEvent,\n ): void {\n const error = event.error;\n this.#logger.error(`OpenAI Realtime failed to transcribe input audio: ${error.message}`);\n this.emit('input_speech_transcription_failed', {\n itemId: event.item_id,\n message: error.message,\n } as InputSpeechTranscriptionFailed);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n #handleConversationItemTruncated(event: api_proto.ConversationItemTruncatedEvent): void {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n #handleConversationItemDeleted(event: api_proto.ConversationItemDeletedEvent): void {}\n\n #handleResponseCreated(responseCreated: api_proto.ResponseCreatedEvent): void {\n const response = responseCreated.response;\n const doneFut = new Future();\n const newResponse: RealtimeResponse = {\n id: response.id,\n status: response.status,\n statusDetails: response.status_details,\n usage: null,\n output: [],\n doneFut: doneFut,\n };\n this.#pendingResponses[newResponse.id] = newResponse;\n this.emit('response_created', newResponse);\n }\n\n #handleResponseDone(event: api_proto.ResponseDoneEvent): void {\n const responseData = event.response;\n const responseId = responseData.id;\n const response = this.#pendingResponses[responseId]!;\n response.status = responseData.status;\n response.statusDetails = responseData.status_details;\n response.usage = responseData.usage ?? null;\n this.#pendingResponses[responseId] = response;\n response.doneFut.resolve();\n this.emit('response_done', response);\n }\n\n #handleResponseOutputItemAdded(event: api_proto.ResponseOutputItemAddedEvent): void {\n const responseId = event.response_id;\n const response = this.#pendingResponses[responseId];\n const itemData = event.item;\n\n if (itemData.type !== 'message' && itemData.type !== 'function_call') {\n throw new Error(`Unexpected item type: ${itemData.type}`);\n }\n\n let role: api_proto.Role;\n if (itemData.type === 'function_call') {\n role = 'assistant'; // function_call doesn't have a role field, defaulting it to assistant\n } else {\n role = itemData.role;\n }\n\n const newOutput: RealtimeOutput = {\n responseId: responseId,\n itemId: itemData.id,\n outputIndex: event.output_index,\n type: itemData.type,\n role: role,\n content: [],\n doneFut: new Future(),\n };\n response?.output.push(newOutput);\n this.emit('response_output_added', newOutput);\n }\n\n #handleResponseOutputItemDone(event: api_proto.ResponseOutputItemDoneEvent): void {\n const responseId = event.response_id;\n const response = this.#pendingResponses[responseId];\n const outputIndex = event.output_index;\n const output = response!.output[outputIndex];\n\n if (output?.type === 'function_call') {\n if (!this.#fncCtx) {\n this.#logger.error('function call received but no fncCtx is available');\n return;\n }\n\n // parse the arguments and call the function inside the fnc_ctx\n const item = event.item;\n if (item.type !== 'function_call') {\n throw new Error('Expected function_call item');\n }\n const func = this.#fncCtx[item.name];\n if (!func) {\n this.#logger.error(`no function with name ${item.name} in fncCtx`);\n return;\n }\n\n this.emit('function_call_started', {\n callId: item.call_id,\n });\n\n const parsedArgs = JSON.parse(item.arguments);\n\n this.#logger.debug(\n `[Function Call ${item.call_id}] Executing ${item.name} with arguments ${parsedArgs}`,\n );\n\n func.execute(parsedArgs).then(\n (content) => {\n this.#logger.debug(`[Function Call ${item.call_id}] ${item.name} returned ${content}`);\n this.emit('function_call_completed', {\n callId: item.call_id,\n });\n this.conversation.item.create(\n llm.ChatMessage.createToolFromFunctionResult({\n name: item.name,\n toolCallId: item.call_id,\n result: content,\n }),\n output.itemId,\n );\n this.response.create();\n },\n (error) => {\n this.#logger.error(`[Function Call ${item.call_id}] ${item.name} failed with ${error}`);\n // TODO: send it back up as failed?\n this.emit('function_call_failed', {\n callId: item.call_id,\n });\n },\n );\n }\n\n output?.doneFut.resolve();\n this.emit('response_output_done', output);\n }\n\n #handleResponseContentPartAdded(event: api_proto.ResponseContentPartAddedEvent): void {\n const responseId = event.response_id;\n const response = this.#pendingResponses[responseId];\n const outputIndex = event.output_index;\n const output = response!.output[outputIndex];\n\n const textStream = new AsyncIterableQueue<string>();\n const audioStream = new AsyncIterableQueue<AudioFrame>();\n\n const newContent: RealtimeContent = {\n responseId: responseId,\n itemId: event.item_id,\n outputIndex: outputIndex,\n contentIndex: event.content_index,\n text: '',\n audio: [],\n textStream: textStream,\n audioStream: audioStream,\n toolCalls: [],\n };\n output?.content.push(newContent);\n this.emit('response_content_added', newContent);\n }\n\n #handleResponseContentPartDone(event: api_proto.ResponseContentPartDoneEvent): void {\n const content = this.#getContent(event);\n this.emit('response_content_done', content);\n }\n\n #handleResponseTextDelta(event: api_proto.ResponseTextDeltaEvent): void {\n this.emit('response_text_delta', event);\n }\n\n #handleResponseTextDone(event: api_proto.ResponseTextDoneEvent): void {\n this.emit('response_text_done', event);\n }\n\n #handleResponseAudioTranscriptDelta(event: api_proto.ResponseAudioTranscriptDeltaEvent): void {\n const content = this.#getContent(event);\n const transcript = event.delta;\n content.text += transcript;\n\n content.textStream.put(transcript);\n }\n\n #handleResponseAudioTranscriptDone(event: api_proto.ResponseAudioTranscriptDoneEvent): void {\n const content = this.#getContent(event);\n content.textStream.close();\n }\n\n #handleResponseAudioDelta(event: api_proto.ResponseAudioDeltaEvent): void {\n const content = this.#getContent(event);\n const data = Buffer.from(event.delta, 'base64');\n const audio = new AudioFrame(\n new Int16Array(data.buffer),\n api_proto.SAMPLE_RATE,\n api_proto.NUM_CHANNELS,\n data.length / 2,\n );\n content.audio.push(audio);\n\n content.audioStream.put(audio);\n }\n\n #handleResponseAudioDone(event: api_proto.ResponseAudioDoneEvent): void {\n const content = this.#getContent(event);\n content.audioStream.close();\n }\n\n #handleResponseFunctionCallArgumentsDelta(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n event: api_proto.ResponseFunctionCallArgumentsDeltaEvent,\n ): void {}\n\n #handleResponseFunctionCallArgumentsDone(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n event: api_proto.ResponseFunctionCallArgumentsDoneEvent,\n ): void {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n #handleRateLimitsUpdated(event: api_proto.RateLimitsUpdatedEvent): void {}\n}\n"],"mappings":"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","names":["c"]}
|
package/dist/stt.cjs
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var stt_exports = {};
|
|
20
|
+
__export(stt_exports, {
|
|
21
|
+
STT: () => STT
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(stt_exports);
|
|
24
|
+
var import_agents = require("@livekit/agents");
|
|
25
|
+
var import_openai = require("openai");
|
|
26
|
+
const defaultSTTOptions = {
|
|
27
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
28
|
+
language: "en",
|
|
29
|
+
detectLanguage: false,
|
|
30
|
+
model: "whisper-1"
|
|
31
|
+
};
|
|
32
|
+
class STT extends import_agents.stt.STT {
|
|
33
|
+
#opts;
|
|
34
|
+
#client;
|
|
35
|
+
/**
|
|
36
|
+
* Create a new instance of OpenAI STT.
|
|
37
|
+
*
|
|
38
|
+
* @remarks
|
|
39
|
+
* `apiKey` must be set to your OpenAI API key, either using the argument or by setting the
|
|
40
|
+
* `OPENAI_API_KEY` environmental variable.
|
|
41
|
+
*/
|
|
42
|
+
constructor(opts = defaultSTTOptions) {
|
|
43
|
+
super({ streaming: false, interimResults: false });
|
|
44
|
+
this.#opts = { ...defaultSTTOptions, ...opts };
|
|
45
|
+
if (this.#opts.apiKey === void 0) {
|
|
46
|
+
throw new Error("OpenAI API key is required, whether as an argument or as $OPENAI_API_KEY");
|
|
47
|
+
}
|
|
48
|
+
this.#client = this.#opts.client || new import_openai.OpenAI({
|
|
49
|
+
baseURL: opts.baseURL,
|
|
50
|
+
apiKey: opts.apiKey
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create a new instance of Groq STT.
|
|
55
|
+
*
|
|
56
|
+
* @remarks
|
|
57
|
+
* `apiKey` must be set to your Groq API key, either using the argument or by setting the
|
|
58
|
+
* `GROQ_API_KEY` environmental variable.
|
|
59
|
+
*/
|
|
60
|
+
static withGroq(opts = {}) {
|
|
61
|
+
opts.apiKey = opts.apiKey || process.env.GROQ_API_KEY;
|
|
62
|
+
if (opts.apiKey === void 0) {
|
|
63
|
+
throw new Error("Groq API key is required, whether as an argument or as $GROQ_API_KEY");
|
|
64
|
+
}
|
|
65
|
+
return new STT({
|
|
66
|
+
model: "whisper-large-v3-turbo",
|
|
67
|
+
baseURL: "https://api.groq.com/openai/v1",
|
|
68
|
+
...opts
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
#sanitizeOptions(language) {
|
|
72
|
+
if (language) {
|
|
73
|
+
return { ...this.#opts, language };
|
|
74
|
+
} else {
|
|
75
|
+
return this.#opts;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
#createWav(frame) {
|
|
79
|
+
const bitsPerSample = 16;
|
|
80
|
+
const byteRate = frame.sampleRate * frame.channels * bitsPerSample / 8;
|
|
81
|
+
const blockAlign = frame.channels * bitsPerSample / 8;
|
|
82
|
+
const header = Buffer.alloc(44);
|
|
83
|
+
header.write("RIFF", 0);
|
|
84
|
+
header.writeUInt32LE(36 + frame.data.byteLength, 4);
|
|
85
|
+
header.write("WAVE", 8);
|
|
86
|
+
header.write("fmt ", 12);
|
|
87
|
+
header.writeUInt32LE(16, 16);
|
|
88
|
+
header.writeUInt16LE(1, 20);
|
|
89
|
+
header.writeUInt16LE(frame.channels, 22);
|
|
90
|
+
header.writeUInt32LE(frame.sampleRate, 24);
|
|
91
|
+
header.writeUInt32LE(byteRate, 28);
|
|
92
|
+
header.writeUInt16LE(blockAlign, 32);
|
|
93
|
+
header.writeUInt16LE(16, 34);
|
|
94
|
+
header.write("data", 36);
|
|
95
|
+
header.writeUInt32LE(frame.data.byteLength, 40);
|
|
96
|
+
return Buffer.concat([header, Buffer.from(frame.data.buffer)]);
|
|
97
|
+
}
|
|
98
|
+
async recognize(buffer, language) {
|
|
99
|
+
const config = this.#sanitizeOptions(language);
|
|
100
|
+
buffer = (0, import_agents.mergeFrames)(buffer);
|
|
101
|
+
const file = new File([this.#createWav(buffer)], "audio.wav", { type: "audio/wav" });
|
|
102
|
+
const resp = await this.#client.audio.transcriptions.create({
|
|
103
|
+
file,
|
|
104
|
+
model: this.#opts.model,
|
|
105
|
+
language: config.language,
|
|
106
|
+
response_format: "json"
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
type: import_agents.stt.SpeechEventType.FINAL_TRANSCRIPT,
|
|
110
|
+
alternatives: [
|
|
111
|
+
{
|
|
112
|
+
text: resp.text || "",
|
|
113
|
+
language: language || "",
|
|
114
|
+
startTime: 0,
|
|
115
|
+
endTime: 0,
|
|
116
|
+
confidence: 0
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/** This method throws an error; streaming is unsupported on OpenAI STT. */
|
|
122
|
+
stream() {
|
|
123
|
+
throw new Error("Streaming is not supported on OpenAI STT");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
127
|
+
0 && (module.exports = {
|
|
128
|
+
STT
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=stt.cjs.map
|
package/dist/stt.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stt.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { type AudioBuffer, mergeFrames, stt } from '@livekit/agents';\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport { OpenAI } from 'openai';\nimport type { GroqAudioModels, WhisperModels } from './models.js';\n\nexport interface STTOptions {\n apiKey?: string;\n language: string;\n detectLanguage: boolean;\n model: WhisperModels | string;\n baseURL?: string;\n client?: OpenAI;\n}\n\nconst defaultSTTOptions: STTOptions = {\n apiKey: process.env.OPENAI_API_KEY,\n language: 'en',\n detectLanguage: false,\n model: 'whisper-1',\n};\n\nexport class STT extends stt.STT {\n #opts: STTOptions;\n #client: OpenAI;\n\n /**\n * Create a new instance of OpenAI STT.\n *\n * @remarks\n * `apiKey` must be set to your OpenAI API key, either using the argument or by setting the\n * `OPENAI_API_KEY` environmental variable.\n */\n constructor(opts: Partial<STTOptions> = defaultSTTOptions) {\n super({ streaming: false, interimResults: false });\n\n this.#opts = { ...defaultSTTOptions, ...opts };\n if (this.#opts.apiKey === undefined) {\n throw new Error('OpenAI API key is required, whether as an argument or as $OPENAI_API_KEY');\n }\n\n this.#client =\n this.#opts.client ||\n new OpenAI({\n baseURL: opts.baseURL,\n apiKey: opts.apiKey,\n });\n }\n\n /**\n * Create a new instance of Groq STT.\n *\n * @remarks\n * `apiKey` must be set to your Groq API key, either using the argument or by setting the\n * `GROQ_API_KEY` environmental variable.\n */\n static withGroq(\n opts: Partial<{\n model: string | GroqAudioModels;\n apiKey?: string;\n baseURL?: string;\n client: OpenAI;\n language: string;\n detectLanguage: boolean;\n }> = {},\n ): STT {\n opts.apiKey = opts.apiKey || process.env.GROQ_API_KEY;\n if (opts.apiKey === undefined) {\n throw new Error('Groq API key is required, whether as an argument or as $GROQ_API_KEY');\n }\n\n return new STT({\n model: 'whisper-large-v3-turbo',\n baseURL: 'https://api.groq.com/openai/v1',\n ...opts,\n });\n }\n\n #sanitizeOptions(language?: string): STTOptions {\n if (language) {\n return { ...this.#opts, language };\n } else {\n return this.#opts;\n }\n }\n\n #createWav(frame: AudioFrame): Buffer {\n const bitsPerSample = 16;\n const byteRate = (frame.sampleRate * frame.channels * bitsPerSample) / 8;\n const blockAlign = (frame.channels * bitsPerSample) / 8;\n\n const header = Buffer.alloc(44);\n header.write('RIFF', 0);\n header.writeUInt32LE(36 + frame.data.byteLength, 4);\n header.write('WAVE', 8);\n header.write('fmt ', 12);\n header.writeUInt32LE(16, 16);\n header.writeUInt16LE(1, 20);\n header.writeUInt16LE(frame.channels, 22);\n header.writeUInt32LE(frame.sampleRate, 24);\n header.writeUInt32LE(byteRate, 28);\n header.writeUInt16LE(blockAlign, 32);\n header.writeUInt16LE(16, 34);\n header.write('data', 36);\n header.writeUInt32LE(frame.data.byteLength, 40);\n return Buffer.concat([header, Buffer.from(frame.data.buffer)]);\n }\n\n async recognize(buffer: AudioBuffer, language?: string): Promise<stt.SpeechEvent> {\n const config = this.#sanitizeOptions(language);\n buffer = mergeFrames(buffer);\n const file = new File([this.#createWav(buffer)], 'audio.wav', { type: 'audio/wav' });\n const resp = await this.#client.audio.transcriptions.create({\n file,\n model: this.#opts.model,\n language: config.language,\n response_format: 'json',\n });\n\n return {\n type: stt.SpeechEventType.FINAL_TRANSCRIPT,\n alternatives: [\n {\n text: resp.text || '',\n language: language || '',\n startTime: 0,\n endTime: 0,\n confidence: 0,\n },\n ],\n };\n }\n\n /** This method throws an error; streaming is unsupported on OpenAI STT. */\n stream(): stt.SpeechStream {\n throw new Error('Streaming is not supported on OpenAI STT');\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/stt.js
CHANGED
|
@@ -1,109 +1,106 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
import { mergeFrames, stt } from '@livekit/agents';
|
|
5
|
-
import { OpenAI } from 'openai';
|
|
1
|
+
import { mergeFrames, stt } from "@livekit/agents";
|
|
2
|
+
import { OpenAI } from "openai";
|
|
6
3
|
const defaultSTTOptions = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
5
|
+
language: "en",
|
|
6
|
+
detectLanguage: false,
|
|
7
|
+
model: "whisper-1"
|
|
11
8
|
};
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
this.#client =
|
|
29
|
-
this.#opts.client ||
|
|
30
|
-
new OpenAI({
|
|
31
|
-
baseURL: opts.baseURL,
|
|
32
|
-
apiKey: opts.apiKey,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Create a new instance of Groq STT.
|
|
37
|
-
*
|
|
38
|
-
* @remarks
|
|
39
|
-
* `apiKey` must be set to your Groq API key, either using the argument or by setting the
|
|
40
|
-
* `GROQ_API_KEY` environmental variable.
|
|
41
|
-
*/
|
|
42
|
-
static withGroq(opts = {}) {
|
|
43
|
-
opts.apiKey = opts.apiKey || process.env.GROQ_API_KEY;
|
|
44
|
-
if (opts.apiKey === undefined) {
|
|
45
|
-
throw new Error('Groq API key is required, whether as an argument or as $GROQ_API_KEY');
|
|
46
|
-
}
|
|
47
|
-
return new STT({
|
|
48
|
-
model: 'whisper-large-v3-turbo',
|
|
49
|
-
baseURL: 'https://api.groq.com/openai/v1',
|
|
50
|
-
...opts,
|
|
51
|
-
});
|
|
9
|
+
class STT extends stt.STT {
|
|
10
|
+
#opts;
|
|
11
|
+
#client;
|
|
12
|
+
/**
|
|
13
|
+
* Create a new instance of OpenAI STT.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* `apiKey` must be set to your OpenAI API key, either using the argument or by setting the
|
|
17
|
+
* `OPENAI_API_KEY` environmental variable.
|
|
18
|
+
*/
|
|
19
|
+
constructor(opts = defaultSTTOptions) {
|
|
20
|
+
super({ streaming: false, interimResults: false });
|
|
21
|
+
this.#opts = { ...defaultSTTOptions, ...opts };
|
|
22
|
+
if (this.#opts.apiKey === void 0) {
|
|
23
|
+
throw new Error("OpenAI API key is required, whether as an argument or as $OPENAI_API_KEY");
|
|
52
24
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
25
|
+
this.#client = this.#opts.client || new OpenAI({
|
|
26
|
+
baseURL: opts.baseURL,
|
|
27
|
+
apiKey: opts.apiKey
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a new instance of Groq STT.
|
|
32
|
+
*
|
|
33
|
+
* @remarks
|
|
34
|
+
* `apiKey` must be set to your Groq API key, either using the argument or by setting the
|
|
35
|
+
* `GROQ_API_KEY` environmental variable.
|
|
36
|
+
*/
|
|
37
|
+
static withGroq(opts = {}) {
|
|
38
|
+
opts.apiKey = opts.apiKey || process.env.GROQ_API_KEY;
|
|
39
|
+
if (opts.apiKey === void 0) {
|
|
40
|
+
throw new Error("Groq API key is required, whether as an argument or as $GROQ_API_KEY");
|
|
60
41
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
header.writeUInt16LE(frame.channels, 22);
|
|
73
|
-
header.writeUInt32LE(frame.sampleRate, 24);
|
|
74
|
-
header.writeUInt32LE(byteRate, 28);
|
|
75
|
-
header.writeUInt16LE(blockAlign, 32);
|
|
76
|
-
header.writeUInt16LE(16, 34);
|
|
77
|
-
header.write('data', 36);
|
|
78
|
-
header.writeUInt32LE(frame.data.byteLength, 40);
|
|
79
|
-
return Buffer.concat([header, Buffer.from(frame.data.buffer)]);
|
|
80
|
-
}
|
|
81
|
-
async recognize(buffer, language) {
|
|
82
|
-
const config = this.#sanitizeOptions(language);
|
|
83
|
-
buffer = mergeFrames(buffer);
|
|
84
|
-
const file = new File([this.#createWav(buffer)], 'audio.wav', { type: 'audio/wav' });
|
|
85
|
-
const resp = await this.#client.audio.transcriptions.create({
|
|
86
|
-
file,
|
|
87
|
-
model: this.#opts.model,
|
|
88
|
-
language: config.language,
|
|
89
|
-
response_format: 'json',
|
|
90
|
-
});
|
|
91
|
-
return {
|
|
92
|
-
type: stt.SpeechEventType.FINAL_TRANSCRIPT,
|
|
93
|
-
alternatives: [
|
|
94
|
-
{
|
|
95
|
-
text: resp.text || '',
|
|
96
|
-
language: language || '',
|
|
97
|
-
startTime: 0,
|
|
98
|
-
endTime: 0,
|
|
99
|
-
confidence: 0,
|
|
100
|
-
},
|
|
101
|
-
],
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
/** This method throws an error; streaming is unsupported on OpenAI STT. */
|
|
105
|
-
stream() {
|
|
106
|
-
throw new Error('Streaming is not supported on OpenAI STT');
|
|
42
|
+
return new STT({
|
|
43
|
+
model: "whisper-large-v3-turbo",
|
|
44
|
+
baseURL: "https://api.groq.com/openai/v1",
|
|
45
|
+
...opts
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
#sanitizeOptions(language) {
|
|
49
|
+
if (language) {
|
|
50
|
+
return { ...this.#opts, language };
|
|
51
|
+
} else {
|
|
52
|
+
return this.#opts;
|
|
107
53
|
}
|
|
54
|
+
}
|
|
55
|
+
#createWav(frame) {
|
|
56
|
+
const bitsPerSample = 16;
|
|
57
|
+
const byteRate = frame.sampleRate * frame.channels * bitsPerSample / 8;
|
|
58
|
+
const blockAlign = frame.channels * bitsPerSample / 8;
|
|
59
|
+
const header = Buffer.alloc(44);
|
|
60
|
+
header.write("RIFF", 0);
|
|
61
|
+
header.writeUInt32LE(36 + frame.data.byteLength, 4);
|
|
62
|
+
header.write("WAVE", 8);
|
|
63
|
+
header.write("fmt ", 12);
|
|
64
|
+
header.writeUInt32LE(16, 16);
|
|
65
|
+
header.writeUInt16LE(1, 20);
|
|
66
|
+
header.writeUInt16LE(frame.channels, 22);
|
|
67
|
+
header.writeUInt32LE(frame.sampleRate, 24);
|
|
68
|
+
header.writeUInt32LE(byteRate, 28);
|
|
69
|
+
header.writeUInt16LE(blockAlign, 32);
|
|
70
|
+
header.writeUInt16LE(16, 34);
|
|
71
|
+
header.write("data", 36);
|
|
72
|
+
header.writeUInt32LE(frame.data.byteLength, 40);
|
|
73
|
+
return Buffer.concat([header, Buffer.from(frame.data.buffer)]);
|
|
74
|
+
}
|
|
75
|
+
async recognize(buffer, language) {
|
|
76
|
+
const config = this.#sanitizeOptions(language);
|
|
77
|
+
buffer = mergeFrames(buffer);
|
|
78
|
+
const file = new File([this.#createWav(buffer)], "audio.wav", { type: "audio/wav" });
|
|
79
|
+
const resp = await this.#client.audio.transcriptions.create({
|
|
80
|
+
file,
|
|
81
|
+
model: this.#opts.model,
|
|
82
|
+
language: config.language,
|
|
83
|
+
response_format: "json"
|
|
84
|
+
});
|
|
85
|
+
return {
|
|
86
|
+
type: stt.SpeechEventType.FINAL_TRANSCRIPT,
|
|
87
|
+
alternatives: [
|
|
88
|
+
{
|
|
89
|
+
text: resp.text || "",
|
|
90
|
+
language: language || "",
|
|
91
|
+
startTime: 0,
|
|
92
|
+
endTime: 0,
|
|
93
|
+
confidence: 0
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** This method throws an error; streaming is unsupported on OpenAI STT. */
|
|
99
|
+
stream() {
|
|
100
|
+
throw new Error("Streaming is not supported on OpenAI STT");
|
|
101
|
+
}
|
|
108
102
|
}
|
|
103
|
+
export {
|
|
104
|
+
STT
|
|
105
|
+
};
|
|
109
106
|
//# sourceMappingURL=stt.js.map
|
package/dist/stt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/stt.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { type AudioBuffer, mergeFrames, stt } from '@livekit/agents';\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport { OpenAI } from 'openai';\nimport type { GroqAudioModels, WhisperModels } from './models.js';\n\nexport interface STTOptions {\n apiKey?: string;\n language: string;\n detectLanguage: boolean;\n model: WhisperModels | string;\n baseURL?: string;\n client?: OpenAI;\n}\n\nconst defaultSTTOptions: STTOptions = {\n apiKey: process.env.OPENAI_API_KEY,\n language: 'en',\n detectLanguage: false,\n model: 'whisper-1',\n};\n\nexport class STT extends stt.STT {\n #opts: STTOptions;\n #client: OpenAI;\n\n /**\n * Create a new instance of OpenAI STT.\n *\n * @remarks\n * `apiKey` must be set to your OpenAI API key, either using the argument or by setting the\n * `OPENAI_API_KEY` environmental variable.\n */\n constructor(opts: Partial<STTOptions> = defaultSTTOptions) {\n super({ streaming: false, interimResults: false });\n\n this.#opts = { ...defaultSTTOptions, ...opts };\n if (this.#opts.apiKey === undefined) {\n throw new Error('OpenAI API key is required, whether as an argument or as $OPENAI_API_KEY');\n }\n\n this.#client =\n this.#opts.client ||\n new OpenAI({\n baseURL: opts.baseURL,\n apiKey: opts.apiKey,\n });\n }\n\n /**\n * Create a new instance of Groq STT.\n *\n * @remarks\n * `apiKey` must be set to your Groq API key, either using the argument or by setting the\n * `GROQ_API_KEY` environmental variable.\n */\n static withGroq(\n opts: Partial<{\n model: string | GroqAudioModels;\n apiKey?: string;\n baseURL?: string;\n client: OpenAI;\n language: string;\n detectLanguage: boolean;\n }> = {},\n ): STT {\n opts.apiKey = opts.apiKey || process.env.GROQ_API_KEY;\n if (opts.apiKey === undefined) {\n throw new Error('Groq API key is required, whether as an argument or as $GROQ_API_KEY');\n }\n\n return new STT({\n model: 'whisper-large-v3-turbo',\n baseURL: 'https://api.groq.com/openai/v1',\n ...opts,\n });\n }\n\n #sanitizeOptions(language?: string): STTOptions {\n if (language) {\n return { ...this.#opts, language };\n } else {\n return this.#opts;\n }\n }\n\n #createWav(frame: AudioFrame): Buffer {\n const bitsPerSample = 16;\n const byteRate = (frame.sampleRate * frame.channels * bitsPerSample) / 8;\n const blockAlign = (frame.channels * bitsPerSample) / 8;\n\n const header = Buffer.alloc(44);\n header.write('RIFF', 0);\n header.writeUInt32LE(36 + frame.data.byteLength, 4);\n header.write('WAVE', 8);\n header.write('fmt ', 12);\n header.writeUInt32LE(16, 16);\n header.writeUInt16LE(1, 20);\n header.writeUInt16LE(frame.channels, 22);\n header.writeUInt32LE(frame.sampleRate, 24);\n header.writeUInt32LE(byteRate, 28);\n header.writeUInt16LE(blockAlign, 32);\n header.writeUInt16LE(16, 34);\n header.write('data', 36);\n header.writeUInt32LE(frame.data.byteLength, 40);\n return Buffer.concat([header, Buffer.from(frame.data.buffer)]);\n }\n\n async recognize(buffer: AudioBuffer, language?: string): Promise<stt.SpeechEvent> {\n const config = this.#sanitizeOptions(language);\n buffer = mergeFrames(buffer);\n const file = new File([this.#createWav(buffer)], 'audio.wav', { type: 'audio/wav' });\n const resp = await this.#client.audio.transcriptions.create({\n file,\n model: this.#opts.model,\n language: config.language,\n response_format: 'json',\n });\n\n return {\n type: stt.SpeechEventType.FINAL_TRANSCRIPT,\n alternatives: [\n {\n text: resp.text || '',\n language: language || '',\n startTime: 0,\n endTime: 0,\n confidence: 0,\n },\n ],\n };\n }\n\n /** This method throws an error; streaming is unsupported on OpenAI STT. */\n stream(): stt.SpeechStream {\n throw new Error('Streaming is not supported on OpenAI STT');\n }\n}\n"],"mappings":"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","names":[]}
|