UNPKG

mastra-browser-core

Version:

The core foundation of the Mastra framework, providing essential components and interfaces for building AI-powered applications.

1 lines 17.2 kB
{"version":3,"sources":["../../src/voice/voice.ts","../../src/voice/composite-voice.ts"],"names":["__publicField","__decoratorStart","__decorateElement","__name","__runInitializers"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ToolsInput } from '../agent';\nimport { MastraBase } from '../base';\nimport { InstrumentClass } from '../telemetry';\n\nexport type VoiceEventType = 'speaking' | 'writing' | 'error' | string;\n\nexport interface VoiceEventMap {\n speaker: NodeJS.ReadableStream;\n speaking: { audio?: string };\n writing: { text: string; role: 'assistant' | 'user' };\n error: { message: string; code?: string; details?: unknown };\n [key: string]: unknown;\n}\n\ninterface BuiltInModelConfig {\n name: string;\n baseURL?: string;\n apiKey?: string;\n}\n\nexport interface VoiceConfig<T = unknown> {\n listeningModel?: BuiltInModelConfig;\n speechModel?: BuiltInModelConfig;\n speaker?: string;\n name?: string;\n realtimeConfig?: {\n model?: string;\n apiKey?: string;\n options?: T;\n };\n}\n\n@InstrumentClass({\n prefix: 'voice',\n excludeMethods: ['__setTools', '__setLogger', '__setTelemetry', '#log'],\n})\nexport abstract class MastraVoice<\n TOptions = unknown,\n TSpeakOptions = unknown,\n TListenOptions = unknown,\n TTools extends ToolsInput = ToolsInput,\n TEventArgs extends VoiceEventMap = VoiceEventMap,\n TSpeakerMetadata = unknown,\n> extends MastraBase {\n protected listeningModel?: BuiltInModelConfig;\n protected speechModel?: BuiltInModelConfig;\n protected speaker?: string;\n protected realtimeConfig?: {\n model?: string;\n apiKey?: string;\n options?: TOptions;\n };\n\n constructor({ listeningModel, speechModel, speaker, realtimeConfig, name }: VoiceConfig<TOptions> = {}) {\n super({\n component: 'VOICE',\n name,\n });\n this.listeningModel = listeningModel;\n this.speechModel = speechModel;\n this.speaker = speaker;\n this.realtimeConfig = realtimeConfig;\n }\n\n traced<T extends Function>(method: T, methodName: string): T {\n return (\n this.telemetry?.traceMethod(method, {\n spanName: `voice.${methodName}`,\n attributes: {\n 'voice.type': this.speechModel?.name || this.listeningModel?.name || 'unknown',\n },\n }) ?? method\n );\n }\n\n /**\n * Convert text to speech\n * @param input Text or text stream to convert to speech\n * @param options Speech options including speaker and provider-specific options\n * @returns Audio stream\n */\n /**\n * Convert text to speech\n * @param input Text or text stream to convert to speech\n * @param options Speech options including speaker and provider-specific options\n * @returns Audio stream or void if in chat mode\n */\n abstract speak(\n input: string | NodeJS.ReadableStream,\n options?: {\n speaker?: string;\n } & TSpeakOptions,\n ): Promise<NodeJS.ReadableStream | void>;\n\n /**\n * Convert speech to text\n * @param audioStream Audio stream to transcribe\n * @param options Provider-specific transcription options\n * @returns Text or text stream\n */\n /**\n * Convert speech to text\n * @param audioStream Audio stream to transcribe\n * @param options Provider-specific transcription options\n * @returns Text, text stream, or void if in chat mode\n */\n abstract listen(\n audioStream: NodeJS.ReadableStream | unknown, // Allow other audio input types for OpenAI realtime API\n options?: TListenOptions,\n ): Promise<string | NodeJS.ReadableStream | void>;\n\n updateConfig(_options: Record<string, unknown>): void {\n this.logger.warn('updateConfig not implemented by this voice provider');\n }\n\n /**\n * Initializes a WebSocket or WebRTC connection for real-time communication\n * @returns Promise that resolves when the connection is established\n */\n connect(_options?: Record<string, unknown>): Promise<void> {\n // Default implementation - voice providers can override if they support this feature\n this.logger.warn('connect not implemented by this voice provider');\n return Promise.resolve();\n }\n\n /**\n * Relay audio data to the voice provider for real-time processing\n * @param audioData Audio data to relay\n */\n send(_audioData: NodeJS.ReadableStream | Int16Array): Promise<void> {\n // Default implementation - voice providers can override if they support this feature\n this.logger.warn('relay not implemented by this voice provider');\n return Promise.resolve();\n }\n\n /**\n * Trigger voice providers to respond\n */\n answer(_options?: Record<string, unknown>): Promise<void> {\n this.logger.warn('answer not implemented by this voice provider');\n return Promise.resolve();\n }\n\n /**\n * Equip the voice provider with instructions\n * @param instructions Instructions to add\n */\n addInstructions(_instructions?: string): void {\n // Default implementation - voice providers can override if they support this feature\n this.logger.warn('addInstructions not implemented by this voice provider');\n }\n\n /**\n * Equip the voice provider with tools\n * @param tools Array of tools to add\n */\n addTools(_tools: TTools): void {\n // Default implementation - voice providers can override if they support this feature\n this.logger.warn('addTools not implemented by this voice provider');\n }\n\n /**\n * Disconnect from the WebSocket or WebRTC connection\n */\n close(): void {\n // Default implementation - voice providers can override if they support this feature\n this.logger.warn('close not implemented by this voice provider');\n }\n\n /**\n * Register an event listener\n * @param event Event name (e.g., 'speaking', 'writing', 'error')\n * @param callback Callback function that receives event data\n */\n on<E extends VoiceEventType>(\n _event: E,\n _callback: (data: E extends keyof TEventArgs ? TEventArgs[E] : unknown) => void,\n ): void {\n // Default implementation - voice providers can override if they support this feature\n this.logger.warn('on not implemented by this voice provider');\n }\n\n /**\n * Remove an event listener\n * @param event Event name (e.g., 'speaking', 'writing', 'error')\n * @param callback Callback function to remove\n */\n off<E extends VoiceEventType>(\n _event: E,\n _callback: (data: E extends keyof TEventArgs ? TEventArgs[E] : unknown) => void,\n ): void {\n // Default implementation - voice providers can override if they support this feature\n this.logger.warn('off not implemented by this voice provider');\n }\n\n /**\n * Get available speakers/voices\n * @returns Array of available voice IDs and their metadata\n */\n getSpeakers(): Promise<\n Array<\n {\n voiceId: string;\n } & TSpeakerMetadata\n >\n > {\n // Default implementation - voice providers can override if they support this feature\n this.logger.warn('getSpeakers not implemented by this voice provider');\n return Promise.resolve([]);\n }\n}\n","import type { ToolsInput } from '../agent';\nimport { MastraVoice } from '.';\nimport type { VoiceEventType, VoiceEventMap } from '.';\n\nexport class CompositeVoice extends MastraVoice<unknown, unknown, unknown, ToolsInput, VoiceEventMap> {\n protected speakProvider?: MastraVoice;\n protected listenProvider?: MastraVoice;\n protected realtimeProvider?: MastraVoice;\n\n constructor({\n speakProvider,\n listenProvider,\n realtimeProvider,\n }: {\n speakProvider?: MastraVoice;\n listenProvider?: MastraVoice;\n realtimeProvider?: MastraVoice;\n }) {\n super();\n this.speakProvider = speakProvider;\n this.listenProvider = listenProvider;\n this.realtimeProvider = realtimeProvider;\n }\n\n /**\n * Convert text to speech using the configured provider\n * @param input Text or text stream to convert to speech\n * @param options Speech options including speaker and provider-specific options\n * @returns Audio stream or void if in realtime mode\n */\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: { speaker?: string } & any,\n ): Promise<NodeJS.ReadableStream | void> {\n if (this.realtimeProvider) {\n return this.realtimeProvider.speak(input, options);\n } else if (this.speakProvider) {\n return this.speakProvider.speak(input, options);\n }\n\n throw new Error('No speak provider or realtime provider configured');\n }\n\n async listen(audioStream: NodeJS.ReadableStream, options?: any) {\n if (this.realtimeProvider) {\n return await this.realtimeProvider.listen(audioStream, options);\n } else if (this.listenProvider) {\n return await this.listenProvider.listen(audioStream, options);\n }\n\n throw new Error('No listen provider or realtime provider configured');\n }\n\n async getSpeakers() {\n if (this.realtimeProvider) {\n return this.realtimeProvider.getSpeakers();\n } else if (this.speakProvider) {\n return this.speakProvider.getSpeakers();\n }\n\n throw new Error('No speak provider or realtime provider configured');\n }\n\n updateConfig(options: Record<string, unknown>): void {\n if (!this.realtimeProvider) {\n return;\n }\n this.realtimeProvider.updateConfig(options);\n }\n\n /**\n * Initializes a WebSocket or WebRTC connection for real-time communication\n * @returns Promise that resolves when the connection is established\n */\n connect(options?: Record<string, unknown>): Promise<void> {\n if (!this.realtimeProvider) {\n throw new Error('No realtime provider configured');\n }\n return this.realtimeProvider.connect(options);\n }\n\n /**\n * Relay audio data to the voice provider for real-time processing\n * @param audioData Audio data to send\n */\n send(audioData: NodeJS.ReadableStream | Int16Array): Promise<void> {\n if (!this.realtimeProvider) {\n throw new Error('No realtime provider configured');\n }\n return this.realtimeProvider.send(audioData);\n }\n\n /**\n * Trigger voice providers to respond\n */\n answer(options?: Record<string, unknown>): Promise<void> {\n if (!this.realtimeProvider) {\n throw new Error('No realtime provider configured');\n }\n return this.realtimeProvider.answer(options);\n }\n\n /**\n * Equip the voice provider with instructions\n * @param instructions Instructions to add\n */\n addInstructions(instructions: string): void {\n if (!this.realtimeProvider) {\n return;\n }\n this.realtimeProvider.addInstructions(instructions);\n }\n\n /**\n * Equip the voice provider with tools\n * @param tools Array of tools to add\n */\n addTools(tools: ToolsInput): void {\n if (!this.realtimeProvider) {\n return;\n }\n this.realtimeProvider.addTools(tools);\n }\n\n /**\n * Disconnect from the WebSocket or WebRTC connection\n */\n close(): void {\n if (!this.realtimeProvider) {\n throw new Error('No realtime provider configured');\n }\n this.realtimeProvider.close();\n }\n\n /**\n * Register an event listener\n * @param event Event name (e.g., 'speaking', 'writing', 'error')\n * @param callback Callback function that receives event data\n */\n on<E extends VoiceEventType>(\n event: E,\n callback: (data: E extends keyof VoiceEventMap ? VoiceEventMap[E] : unknown) => void,\n ): void {\n if (!this.realtimeProvider) {\n throw new Error('No realtime provider configured');\n }\n this.realtimeProvider.on(event, callback);\n }\n\n /**\n * Remove an event listener\n * @param event Event name (e.g., 'speaking', 'writing', 'error')\n * @param callback Callback function to remove\n */\n off<E extends VoiceEventType>(\n event: E,\n callback: (data: E extends keyof VoiceEventMap ? VoiceEventMap[E] : unknown) => void,\n ): void {\n if (!this.realtimeProvider) {\n throw new Error('No realtime provider configured');\n }\n this.realtimeProvider.off(event, callback);\n }\n}\n"]}