@dxos/plugin-transformer 0.10.0 → 0.11.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/dist/lib/TransformerPlugin.mjs +16 -0
- package/dist/lib/TransformerPlugin.mjs.map +1 -0
- package/dist/lib/{neutral/chunk-2UJUBMOA.mjs → chunk-meta.mjs} +16 -25
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/components.mjs +171 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/hooks.mjs +349 -0
- package/dist/lib/hooks.mjs.map +1 -0
- package/dist/lib/index.mjs +2 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/plugin.mjs +8 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/translations.mjs +7 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +24 -24
- package/dist/lib/neutral/TransformerPlugin.mjs +0 -38
- package/dist/lib/neutral/TransformerPlugin.mjs.map +0 -7
- package/dist/lib/neutral/chunk-2UJUBMOA.mjs.map +0 -7
- package/dist/lib/neutral/components/index.mjs +0 -136
- package/dist/lib/neutral/components/index.mjs.map +0 -7
- package/dist/lib/neutral/hooks/index.mjs +0 -339
- package/dist/lib/neutral/hooks/index.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -7
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/meta.mjs +0 -7
- package/dist/lib/neutral/meta.mjs.map +0 -7
- package/dist/lib/neutral/plugin.mjs +0 -11
- package/dist/lib/neutral/plugin.mjs.map +0 -7
- package/dist/lib/neutral/translations.mjs +0 -15
- package/dist/lib/neutral/translations.mjs.map +0 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.mjs","names":[],"sources":["../../src/hooks/useAudioStream.ts","../../src/hooks/usePipeline.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\n\nexport type AudioStreamConfig = {\n active?: boolean;\n debug?: boolean;\n onAudioData?: (audioData: Float32Array) => Promise<void>;\n};\n\nexport type AudioStreamState = {\n stream: MediaStream | null;\n error: string | null;\n audioLevel: number;\n};\n\nexport const useAudioStream = ({ active, debug, onAudioData }: AudioStreamConfig) => {\n const [state, setState] = useState<AudioStreamState>({\n stream: null,\n error: null,\n audioLevel: 0,\n });\n\n // TODO(burdon): Convert to class.\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const animationFrameRef = useRef<number>(undefined);\n const workletNodeRef = useRef<AudioWorkletNode | null>(null);\n const isProcessingRef = useRef(false);\n const mediaStreamRef = useRef<MediaStream | null>(null);\n const audioBufferRef = useRef<Float32Array[]>([]);\n\n // Stats for visualization.\n const updateAudioLevel = useCallback(() => {\n if (analyserRef.current) {\n const dataArray = new Uint8Array(analyserRef.current.frequencyBinCount);\n analyserRef.current.getByteFrequencyData(dataArray);\n const average = dataArray.reduce((acc, val) => acc + val, 0) / dataArray.length;\n setState((prev) => ({ ...prev, audioLevel: average }));\n animationFrameRef.current = requestAnimationFrame(updateAudioLevel);\n }\n }, []);\n\n const cleanup = useCallback(() => {\n log('cleaning up audio resources');\n\n // Stop all tracks.\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach((track) => {\n track.stop();\n track.enabled = false;\n });\n mediaStreamRef.current = null;\n }\n\n // Disconnect and cleanup audio nodes.\n if (workletNodeRef.current) {\n workletNodeRef.current.disconnect();\n workletNodeRef.current = null;\n }\n if (analyserRef.current) {\n analyserRef.current.disconnect();\n analyserRef.current = null;\n }\n if (audioContextRef.current) {\n void audioContextRef.current.close();\n audioContextRef.current = null;\n }\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = undefined;\n }\n\n audioBufferRef.current = [];\n setState({\n stream: null,\n error: null,\n audioLevel: 0,\n });\n }, [debug]);\n\n useEffect(() => {\n let mounted = true;\n\n const startStream = async () => {\n try {\n if (active) {\n cleanup();\n log.info('initializing audio stream...');\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n channelCount: 1,\n sampleRate: 16_000,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n video: false,\n });\n\n if (!mounted || !active) {\n stream.getTracks().forEach((track) => {\n track.stop();\n track.enabled = false;\n });\n return;\n }\n\n mediaStreamRef.current = stream;\n\n // Create AudioContext for proper audio format.\n const context = new AudioContext({ sampleRate: 16_000 });\n\n // Add the audio worklet module.\n await context.audioWorklet.addModule(\n URL.createObjectURL(\n new Blob(\n [\n `class AudioProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this._buffer = [];\n this._samplesProcessed = 0;\n }\n\n process(inputs, outputs) {\n const input = inputs[0];\n const channel = input[0];\n \n if (channel) {\n this._buffer.push(new Float32Array(channel));\n this._samplesProcessed += channel.length;\n\n // Process every 2 seconds (32000 samples at 16kHz).\n if (this._samplesProcessed >= 32000) {\n const combinedLength = this._buffer.reduce((acc, curr) => acc + curr.length, 0);\n const combinedAudio = new Float32Array(combinedLength);\n let offset = 0;\n\n for (const buffer of this._buffer) {\n combinedAudio.set(buffer, offset);\n offset += buffer.length;\n }\n\n this.port.postMessage({ type: 'audio-data', data: combinedAudio });\n \n // Reset buffer and counter.\n this._buffer = [];\n this._samplesProcessed = 0;\n }\n }\n return true;\n }\n }\n\n registerProcessor('audio-processor', AudioProcessor);`,\n ],\n { type: 'application/javascript' },\n ),\n ),\n );\n\n const source = context.createMediaStreamSource(stream);\n const analyser = context.createAnalyser();\n analyserRef.current = analyser;\n\n // Create and connect the audio worklet node.\n const workletNode = new AudioWorkletNode(context, 'audio-processor');\n workletNodeRef.current = workletNode;\n\n workletNode.port.onmessage = async (event) => {\n if (!mounted || !active) {\n return;\n }\n\n if (event.data.type === 'audio-data') {\n isProcessingRef.current = true;\n try {\n log('processing audio', {\n sampleRate: context.sampleRate,\n length: event.data.data.length,\n min: Math.min(...event.data.data),\n max: Math.max(...event.data.data),\n });\n\n await onAudioData?.(event.data.data);\n } catch (err) {\n if (mounted) {\n setState((prev) => ({\n ...prev,\n error: 'Error processing audio: ' + (err as Error).message,\n }));\n }\n log.error('audio processing error', { err });\n } finally {\n isProcessingRef.current = false;\n }\n }\n };\n\n // Connect the audio nodes.\n source.connect(analyser);\n analyser.connect(workletNode);\n workletNode.connect(context.destination);\n\n if (debug) {\n analyser.fftSize = 256;\n updateAudioLevel();\n }\n\n audioContextRef.current = context;\n if (mounted && active) {\n setState({\n stream,\n error: null,\n audioLevel: 0,\n });\n }\n }\n } catch (err) {\n if (mounted) {\n setState((prev) => ({\n ...prev,\n error: 'Error accessing microphone: ' + (err as Error).message,\n stream: null,\n }));\n }\n log.error('microphone error', { err });\n cleanup();\n }\n };\n\n void startStream();\n\n return () => {\n mounted = false;\n cleanup();\n };\n }, [active, debug, onAudioData, updateAudioLevel, cleanup]);\n\n useEffect(() => {\n if (!active) {\n cleanup();\n }\n }, [active, cleanup]);\n\n return state;\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Pipeline, env, pipeline } from '@xenova/transformers';\nimport { useEffect, useRef, useState } from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\n// Configure cache and runtime settings.\nenv.cacheDir = './.cache';\nenv.allowLocalModels = true;\n\n// Configure ONNX runtime for WebGPU.\n(env.backends.onnx as any).wasm.numThreads = 1;\n(env.backends.onnx as any).provider = 'webgpu';\n(env.backends.onnx as any).webgpu = {\n profilingMode: true,\n};\n\nexport type PipelineConfig = {\n active?: boolean;\n debug?: boolean;\n model: string;\n};\n\nexport type PipelineState = {\n gpuInfo: string;\n isLoaded: boolean;\n isLoading: boolean;\n error: string | null;\n};\n\n// TODO(burdon): Document external API.\nexport type TranscriptionOptions = {\n sampling_rate: number;\n chunk_length_s: number;\n stride_length_s: number;\n return_timestamps: boolean;\n language: string;\n};\n\nexport const usePipeline = ({ active, model, debug }: PipelineConfig) => {\n const [state, setState] = useState<PipelineState>({\n gpuInfo: '',\n isLoaded: false,\n isLoading: false,\n error: null,\n });\n\n const pipelineRef = useRef<Pipeline | null>(null);\n\n // TODO(burdon): Factor out loading model. Separate tests.\n useEffect(() => {\n const loadModel = async () => {\n try {\n setState((prev) => ({ ...prev, isLoading: true, error: null }));\n\n // Check WebGPU support.\n if (!navigator.gpu) {\n log.warn('WebGPU is not supported, falling back to CPU');\n setState((prev) => ({ ...prev, gpuInfo: 'WebGPU not supported (using CPU)' }));\n } else {\n try {\n const adapter = await navigator.gpu.requestAdapter();\n if (!adapter) {\n throw new Error('No GPU adapter found');\n }\n\n // Get adapter info from the info property (modern WebGPU API).\n const adapterInfo = adapter.info;\n if (adapterInfo) {\n setState((prev) => ({\n ...prev,\n gpuInfo: `${adapterInfo.description || 'GPU'} (${adapterInfo.vendor || 'Unknown'})`,\n }));\n } else {\n setState((prev) => ({ ...prev, gpuInfo: 'GPU Available (details unknown)' }));\n }\n } catch (err) {\n log.warn('WebGPU initialization failed', { err });\n setState((prev) => ({ ...prev, gpuInfo: 'GPU initialization failed (using CPU)' }));\n }\n }\n\n const pipe = await pipeline('automatic-speech-recognition', model, {\n quantized: true,\n progress_callback: (progress: any) => {\n if (debug) {\n log(`loading model: ${Math.round(progress.progress * 100)}%`);\n }\n },\n });\n\n pipelineRef.current = pipe;\n setState((prev) => ({ ...prev, isLoaded: true, isLoading: false }));\n log.info('model loaded successfully');\n } catch (err) {\n log.error('error loading model', { err });\n setState((prev) => ({\n ...prev,\n isLoading: false,\n error: 'error loading model: ' + (err as Error).message,\n }));\n }\n };\n\n if (active) {\n void loadModel();\n }\n\n return () => {\n pipelineRef.current = null;\n setState((prev) => ({ ...prev, isLoaded: false }));\n };\n }, [active, debug, model]);\n\n const transcribe = async (audioData: Float32Array, options: TranscriptionOptions) => {\n invariant(pipelineRef.current, 'pipeline not initialized');\n const result = await pipelineRef.current(audioData, options);\n return result;\n };\n\n return {\n ...state,\n transcribe,\n };\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { t as meta } from "./chunk-meta.mjs";
|
|
2
|
+
import { Plugin } from "@dxos/app-framework";
|
|
3
|
+
//#region src/plugin.ts
|
|
4
|
+
var TransformerPlugin = Plugin.lazy(meta, () => import("#plugin"));
|
|
5
|
+
//#endregion
|
|
6
|
+
export { TransformerPlugin };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=plugin.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../src/plugin.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport { meta } from './meta';\n\nexport const TransformerPlugin = Plugin.lazy(meta, () => import('#plugin'));\n"],"mappings":";;;AAQA,IAAa,oBAAoB,OAAO,KAAK,YAAY,OAAO,UAAU"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translations.mjs","names":[],"sources":["../../src/translations.ts"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\n\nexport const translations = [\n {\n 'en-US': {\n [meta.profile.key]: {\n 'plugin.name': 'Transformers',\n },\n },\n },\n] as const satisfies Resource[];\n"],"mappings":";;AAQA,IAAa,eAAe,CAC1B,EACE,SAAS,GACN,KAAK,QAAQ,MAAM,EAClB,eAAe,eACjB,EACF,EACF,CACF"}
|