@dxos/plugin-transcription 0.7.5-staging.2ff1350
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/LICENSE +8 -0
- package/README.md +15 -0
- package/dist/lib/browser/TranscriptContainer-7J3JHI6Q.mjs +10 -0
- package/dist/lib/browser/TranscriptContainer-7J3JHI6Q.mjs.map +7 -0
- package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs +7 -0
- package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs.map +7 -0
- package/dist/lib/browser/chunk-IHSLJZZ7.mjs +8 -0
- package/dist/lib/browser/chunk-IHSLJZZ7.mjs.map +7 -0
- package/dist/lib/browser/chunk-ORGZ2DWD.mjs +220 -0
- package/dist/lib/browser/chunk-ORGZ2DWD.mjs.map +7 -0
- package/dist/lib/browser/chunk-QIHUPVQD.mjs +80 -0
- package/dist/lib/browser/chunk-QIHUPVQD.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZMES3U2D.mjs +78 -0
- package/dist/lib/browser/chunk-ZMES3U2D.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +652 -0
- package/dist/lib/browser/index.mjs.map +7 -0
- package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs +32 -0
- package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -0
- package/dist/lib/browser/react-surface-JM2F2QZC.mjs +26 -0
- package/dist/lib/browser/react-surface-JM2F2QZC.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +17 -0
- package/dist/lib/browser/types/index.mjs.map +7 -0
- package/dist/lib/node/TranscriptContainer-FFAQVGMS.cjs +31 -0
- package/dist/lib/node/TranscriptContainer-FFAQVGMS.cjs.map +7 -0
- package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs +26 -0
- package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map +7 -0
- package/dist/lib/node/chunk-JBN3P6ZF.cjs +97 -0
- package/dist/lib/node/chunk-JBN3P6ZF.cjs.map +7 -0
- package/dist/lib/node/chunk-JYADA35W.cjs +246 -0
- package/dist/lib/node/chunk-JYADA35W.cjs.map +7 -0
- package/dist/lib/node/chunk-UIHEGU6Q.cjs +103 -0
- package/dist/lib/node/chunk-UIHEGU6Q.cjs.map +7 -0
- package/dist/lib/node/chunk-Z5MTY2TU.cjs +40 -0
- package/dist/lib/node/chunk-Z5MTY2TU.cjs.map +7 -0
- package/dist/lib/node/index.cjs +661 -0
- package/dist/lib/node/index.cjs.map +7 -0
- package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs +44 -0
- package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -0
- package/dist/lib/node/react-surface-Q676XPRP.cjs +49 -0
- package/dist/lib/node/react-surface-Q676XPRP.cjs.map +7 -0
- package/dist/lib/node/types/index.cjs +39 -0
- package/dist/lib/node/types/index.cjs.map +7 -0
- package/dist/lib/node-esm/TranscriptContainer-3BJ74CEQ.mjs +11 -0
- package/dist/lib/node-esm/TranscriptContainer-3BJ74CEQ.mjs.map +7 -0
- package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs +9 -0
- package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-EQUSN55D.mjs +221 -0
- package/dist/lib/node-esm/chunk-EQUSN55D.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-KEG3ME4O.mjs +82 -0
- package/dist/lib/node-esm/chunk-KEG3ME4O.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-V3YAZI67.mjs +10 -0
- package/dist/lib/node-esm/chunk-V3YAZI67.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XYU6B73V.mjs +80 -0
- package/dist/lib/node-esm/chunk-XYU6B73V.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +653 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs +33 -0
- package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/react-surface-XP3BJN4L.mjs +27 -0
- package/dist/lib/node-esm/react-surface-XP3BJN4L.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +18 -0
- package/dist/lib/node-esm/types/index.mjs.map +7 -0
- package/dist/types/src/TranscriptionPlugin.d.ts +2 -0
- package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts +180 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/capabilities.d.ts +4 -0
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +181 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts +4 -0
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
- package/dist/types/src/components/Transcript/Transcript.d.ts +7 -0
- package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -0
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts +9 -0
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -0
- package/dist/types/src/components/Transcript/index.d.ts +2 -0
- package/dist/types/src/components/Transcript/index.d.ts.map +1 -0
- package/dist/types/src/components/TranscriptContainer.d.ts +7 -0
- package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +6 -0
- package/dist/types/src/components/index.d.ts.map +1 -0
- package/dist/types/src/components/transcription.stories.d.ts +14 -0
- package/dist/types/src/components/transcription.stories.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +6 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -0
- package/dist/types/src/hooks/useAudioFile.d.ts +7 -0
- package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -0
- package/dist/types/src/hooks/useAudioTrack.d.ts +5 -0
- package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -0
- package/dist/types/src/hooks/useIsSpeaking.d.ts +2 -0
- package/dist/types/src/hooks/useIsSpeaking.d.ts.map +1 -0
- package/dist/types/src/hooks/useTranscriber.d.ts +10 -0
- package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -0
- package/dist/types/src/hooks/useVoiceInput.d.ts +11 -0
- package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +7 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +11 -0
- package/dist/types/src/meta.d.ts.map +1 -0
- package/dist/types/src/sanity.test.d.ts +2 -0
- package/dist/types/src/sanity.test.d.ts.map +1 -0
- package/dist/types/src/transcriber/audio-recorder.d.ts +47 -0
- package/dist/types/src/transcriber/audio-recorder.d.ts.map +1 -0
- package/dist/types/src/transcriber/index.d.ts +4 -0
- package/dist/types/src/transcriber/index.d.ts.map +1 -0
- package/dist/types/src/transcriber/media-stream-recorder.d.ts +26 -0
- package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -0
- package/dist/types/src/transcriber/transcriber.d.ts +46 -0
- package/dist/types/src/transcriber/transcriber.d.ts.map +1 -0
- package/dist/types/src/transcriber/transcriber.test.d.ts +2 -0
- package/dist/types/src/transcriber/transcriber.test.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +40 -0
- package/dist/types/src/translations.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +3 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/types/schema.d.ts +63 -0
- package/dist/types/src/types/schema.d.ts.map +1 -0
- package/dist/types/src/types/types.d.ts +28 -0
- package/dist/types/src/types/types.d.ts.map +1 -0
- package/dist/types/src/util/array.d.ts +2 -0
- package/dist/types/src/util/array.d.ts.map +1 -0
- package/dist/types/src/util/get-time-str.d.ts +2 -0
- package/dist/types/src/util/get-time-str.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +5 -0
- package/dist/types/src/util/index.d.ts.map +1 -0
- package/dist/types/src/util/monitor-audio-level.d.ts +6 -0
- package/dist/types/src/util/monitor-audio-level.d.ts.map +1 -0
- package/dist/types/src/util/random-queue-dxn.d.ts +3 -0
- package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +93 -0
- package/src/TranscriptionPlugin.tsx +57 -0
- package/src/capabilities/app-graph-builder.ts +7 -0
- package/src/capabilities/capabilities.ts +12 -0
- package/src/capabilities/index.ts +11 -0
- package/src/capabilities/intent-resolver.ts +24 -0
- package/src/capabilities/react-surface.tsx +21 -0
- package/src/components/Transcript/Transcript.stories.tsx +65 -0
- package/src/components/Transcript/Transcript.tsx +69 -0
- package/src/components/Transcript/index.ts +5 -0
- package/src/components/TranscriptContainer.tsx +146 -0
- package/src/components/index.ts +10 -0
- package/src/components/transcription.stories.tsx +198 -0
- package/src/hooks/index.ts +9 -0
- package/src/hooks/useAudioFile.ts +62 -0
- package/src/hooks/useAudioTrack.ts +35 -0
- package/src/hooks/useIsSpeaking.ts +77 -0
- package/src/hooks/useTranscriber.ts +62 -0
- package/src/hooks/useVoiceInput.ts +66 -0
- package/src/index.ts +11 -0
- package/src/meta.ts +17 -0
- package/src/sanity.test.ts +11 -0
- package/src/transcriber/audio-recorder.ts +56 -0
- package/src/transcriber/index.ts +7 -0
- package/src/transcriber/media-stream-recorder.ts +109 -0
- package/src/transcriber/transcriber.test.ts +230 -0
- package/src/transcriber/transcriber.ts +247 -0
- package/src/translations.ts +28 -0
- package/src/types/index.ts +6 -0
- package/src/types/schema.ts +60 -0
- package/src/types/types.ts +34 -0
- package/src/util/array.ts +14 -0
- package/src/util/get-time-str.ts +12 -0
- package/src/util/index.ts +8 -0
- package/src/util/monitor-audio-level.ts +58 -0
- package/src/util/random-queue-dxn.ts +9 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/index.ts", "../../../src/capabilities/capabilities.ts", "../../../src/hooks/useAudioFile.ts", "../../../src/hooks/useAudioTrack.ts", "../../../src/hooks/useIsSpeaking.ts", "../../../src/hooks/useTranscriber.ts", "../../../src/transcriber/media-stream-recorder.ts", "../../../src/transcriber/transcriber.ts", "../../../src/hooks/useVoiceInput.ts", "../../../src/TranscriptionPlugin.tsx", "../../../src/translations.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\n\nexport * from './capabilities';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineCapability } from '@dxos/app-framework';\n\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\n\nexport namespace TranscriptionCapabilities {\n // TODO(burdon): Currently this is just a marker; adapt useVoiceInput to use this.\n export const Transcription = defineCapability<null>(`${TRANSCRIPTION_PLUGIN}/capability/transcription`);\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { log } from '@dxos/log';\n\nexport type UseAudioState = {\n audio?: HTMLAudioElement;\n stream?: MediaStream;\n track?: MediaStreamTrack;\n};\n\nexport const useAudioFile = (audioUrl: string): UseAudioState => {\n const [{ audio, stream, track }, setStream] = useState<UseAudioState>({});\n useEffect(() => {\n const t = setTimeout(async () => {\n const response = await fetch(audioUrl);\n const blob = await response.blob();\n const audio = new Audio();\n audio.src = URL.createObjectURL(blob);\n await new Promise<void>((resolve, reject) => {\n audio.addEventListener(\n 'error',\n (err) => {\n log.error('error', { err });\n reject(err);\n },\n { once: true },\n );\n audio.addEventListener(\n 'canplay',\n () => {\n log.info('starting...');\n resolve();\n },\n { once: true },\n );\n audio.load();\n });\n\n const ctx = new AudioContext();\n\n const destination = ctx.createMediaStreamDestination();\n destination.channelCount = 1;\n\n const source = ctx.createMediaElementSource(audio);\n source.connect(destination);\n\n setStream({\n audio,\n stream: destination.stream,\n track: destination.stream.getAudioTracks()[0],\n });\n });\n\n return () => clearTimeout(t);\n }, [audioUrl]);\n\n return { audio, stream, track };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\n/**\n *\n */\n// TODO(burdon): Reconcile with react-ui-sfx and plugin-calls.\nexport const useAudioTrack = (active?: boolean): MediaStreamTrack | undefined => {\n const [track, setTrack] = useState<MediaStreamTrack>();\n useEffect(() => {\n if (!active) {\n track?.stop();\n setTrack(undefined);\n return;\n }\n\n const initAudio = async () => {\n const audio = new Audio();\n audio.srcObject = await navigator.mediaDevices.getUserMedia({ audio: true });\n const [track] = audio.srcObject.getAudioTracks();\n if (track) {\n setTrack(track);\n }\n };\n\n if (active) {\n void initAudio();\n }\n }, [active]);\n\n return track;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useRef, useState } from 'react';\n\nimport { monitorAudioLevel } from '../util';\n\nexport const useIsSpeaking = (mediaStreamTrack?: MediaStreamTrack) => {\n const [isSpeaking, setIsSpeaking] = useState(false);\n\n // The audio level is monitored very rapidly, and we don't want\n // react involved in tracking the state because it causes way\n // too many re-renders. To work around this, we use the isSpeakingRef\n // to track the state and then sync it using another effect.\n const isSpeakingRef = useRef(isSpeaking);\n\n // this effect syncs the state on a 50ms interval\n useEffect(() => {\n if (!mediaStreamTrack) {\n setIsSpeaking(false);\n return;\n }\n\n isSpeakingRef.current = isSpeaking;\n const interval = window.setInterval(() => {\n // state is already in sync do nothing\n if (isSpeaking === isSpeakingRef.current) {\n return;\n }\n\n // sync state\n setIsSpeaking(isSpeakingRef.current);\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [isSpeaking, isSpeakingRef, mediaStreamTrack]);\n\n useEffect(() => {\n if (!mediaStreamTrack) {\n return;\n }\n\n let timeout = -1;\n const cleanup = monitorAudioLevel({\n mediaStreamTrack,\n onMeasure: (vol) => {\n // Once the user has been determined to be speaking, we want\n // to lower the threshold because speech patterns don't always\n // kick up above 0.05\n const audioLevelAboveThreshold = vol > (isSpeakingRef.current ? 0.02 : 0.05);\n if (audioLevelAboveThreshold) {\n // user is still speaking, clear timeout & reset.\n clearTimeout(timeout);\n timeout = -1;\n // track state.\n isSpeakingRef.current = true;\n } else if (timeout === -1) {\n // user is not speaking and timeout is not set.\n timeout = window.setTimeout(() => {\n isSpeakingRef.current = false;\n // reset timeout\n timeout = -1;\n }, 1_000);\n }\n },\n });\n\n return () => {\n cleanup();\n };\n }, [isSpeaking, mediaStreamTrack]);\n\n return isSpeaking;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { MediaStreamRecorder, Transcriber, type TranscriberParams } from '../transcriber';\n\n// TODO(burdon): Move to config?\n\n/**\n * Length of the chunk in ms.\n */\nconst RECORD_INTERVAL = 200;\n\n/**\n * Number of chunks to save before the user starts speaking.\n */\nconst PREFIXED_CHUNKS_AMOUNT = 10;\n\n/**\n * Number of chunks to transcribe automatically after.\n * Combined should be mess than 25MB or whisper would fail.\n */\nconst TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;\n\nexport type UseTranscriberProps = {\n audioStreamTrack?: MediaStreamTrack;\n onSegments?: TranscriberParams['onSegments'];\n};\n\n/**\n * Records audio while user is speaking and transcribes it after user is done speaking.\n */\nexport const useTranscriber = ({ audioStreamTrack, onSegments }: UseTranscriberProps) => {\n // Initialize audio transcription.\n const transcriber = useMemo<Transcriber | undefined>(() => {\n if (!onSegments || !audioStreamTrack) {\n return undefined;\n }\n\n return new Transcriber({\n config: {\n transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,\n prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,\n },\n recorder: new MediaStreamRecorder({\n mediaStreamTrack: audioStreamTrack,\n interval: RECORD_INTERVAL,\n }),\n onSegments,\n });\n }, [audioStreamTrack, onSegments]);\n\n useEffect(() => {\n return () => {\n void transcriber?.close();\n };\n }, [transcriber]);\n\n return transcriber;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type IBlobEvent, type IMediaRecorder, MediaRecorder, register } from 'extendable-media-recorder';\nimport { WaveFile } from 'wavefile';\n\nimport { synchronized } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type WavConfig, type AudioChunk, type AudioRecorder } from './audio-recorder';\n\nlet initializingPromise: Promise<void> | undefined;\n\nconst initializeExtendableMediaRecorder = async () => {\n const { connect } = await import('extendable-media-recorder-wav-encoder');\n await register(await connect());\n};\n\n/**\n * Recorder that uses the MediaContext API and AudioNode API to record audio.\n *\n * It records MediaStream using https://www.npmjs.com/package/extendable-media-recorder.\n */\n@trace.resource()\nexport class MediaStreamRecorder implements AudioRecorder {\n private readonly _mediaStreamTrack: MediaStreamTrack;\n /**\n * Default MediaRecorder implementation do not support wav encoding.\n */\n private readonly _interval: number;\n private _mediaRecorder?: IMediaRecorder = undefined;\n private _header?: Uint8Array = undefined;\n private _onChunk?: (chunk: AudioChunk) => void;\n\n constructor({ mediaStreamTrack, interval }: { mediaStreamTrack: MediaStreamTrack; interval: number }) {\n this._mediaStreamTrack = mediaStreamTrack;\n this._interval = interval;\n }\n\n get wavConfig(): WavConfig {\n const settings = this._mediaStreamTrack.getSettings();\n return {\n channels: settings.channelCount ?? 1,\n sampleRate: settings.sampleRate ?? 16000,\n bitDepthCode: settings.sampleSize ? String(settings.sampleSize) : '16',\n };\n }\n\n setOnChunk(onChunk: (chunk: AudioChunk) => void): void {\n this._onChunk = onChunk;\n }\n\n async start() {\n await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) =>\n log.info('initializeExtendableMediaRecorder', { err }),\n );\n\n if (!this._mediaRecorder) {\n const stream = new MediaStream([this._mediaStreamTrack]);\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' });\n }\n\n if (this._mediaRecorder.state === 'recording') {\n return;\n }\n invariant(this._onChunk, 'MediaStreamRecorder: onChunk is not set');\n this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);\n this._mediaRecorder.start(this._interval);\n }\n\n async stop() {\n if (this._mediaRecorder?.state !== 'recording') {\n return;\n }\n this._mediaRecorder.stop();\n }\n\n @synchronized\n private async _ondataavailable(event: IBlobEvent) {\n const blob = event.data;\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\n\n // First chunk from the MediaRecorder has a header.\n const isHeader =\n uint8Array[0] === 0x52 && // R\n uint8Array[1] === 0x49 && // I\n uint8Array[2] === 0x46 && // F\n uint8Array[3] === 0x46; // F\n let wav: WaveFile;\n\n if (isHeader) {\n wav = new WaveFile(uint8Array);\n this._header = uint8Array.slice(0, 44);\n } else if (this._header) {\n wav = new WaveFile(new Uint8Array([...this._header, ...uint8Array]));\n } else {\n log.warn('MediaStreamRecorder: no header');\n return;\n }\n\n this._onChunk!({\n timestamp: Date.now(),\n data: wav.getSamples(),\n });\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { WaveFile } from 'wavefile';\n\nimport { DeferredTask, Trigger } from '@dxos/async';\nimport { type Context, LifecycleState, Resource } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type AudioRecorder, type AudioChunk } from './audio-recorder';\nimport { TRANSCRIPTION_URL, type TranscriptSegment } from '../types';\nimport { mergeFloat64Arrays } from '../util';\n\ntype WhisperWord = {\n word: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n};\n\ntype WhisperSegment = {\n text: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n\n /**\n * Probability of no speech in the segment.\n */\n no_speech_prob: number;\n\n words: WhisperWord[];\n};\n\nexport type TranscribeConfig = {\n /**\n * Number of chunks to transcribe automatically after.\n */\n transcribeAfterChunksAmount: number;\n\n /**\n * Number of chunks to save before the user starts speaking.\n * This is needed to catch the beginning of the user's speech.\n */\n prefixBufferChunksAmount: number;\n};\n\nexport type TranscriberParams = {\n config: TranscribeConfig;\n recorder: AudioRecorder;\n onSegments: (segments: TranscriptSegment[]) => Promise<void>;\n};\n\n/**\n * Handles transcription of audio chunks.\n * If user is not speaking, the last `minChunksAmount` chunks are saved and transcribed.\n * If user is speaking, the chunks are added to the buffer until the user is done talking.\n */\nexport class Transcriber extends Resource {\n private _audioChunks: AudioChunk[] = [];\n private _lastUsedTimestamp = 0;\n\n private readonly _openTrigger = new Trigger({ autoReset: true });\n\n private readonly _config: TranscribeConfig;\n private readonly _recorder: AudioRecorder;\n private readonly _onSegments: TranscriberParams['onSegments'];\n\n private _recording = false;\n private _transcribeTask?: DeferredTask = undefined;\n\n constructor({ config, recorder, onSegments }: TranscriberParams) {\n super();\n this._config = config;\n this._recorder = recorder;\n this._onSegments = onSegments;\n }\n\n protected override async _open(ctx: Context) {\n this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));\n await this._recorder.start();\n this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());\n this._openTrigger.wake();\n }\n\n protected override async _close() {\n this._recording = false;\n this._transcribeTask = undefined;\n await this._recorder.stop();\n }\n\n startChunksRecording() {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n this._recording = true;\n }\n\n stopChunksRecording() {\n if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {\n return;\n }\n this._recording = false;\n this._transcribeTask?.schedule();\n }\n\n private _saveAudioChunk(chunk: AudioChunk) {\n log('saving audio chunk', { chunk });\n this._audioChunks.push(chunk);\n\n // Clean the buffer if the user is not speaking and the transcription task is not scheduled.\n if (\n !this._recording &&\n (!this._transcribeTask || !this._transcribeTask.scheduled) &&\n this._audioChunks.length >= this._config.prefixBufferChunksAmount\n ) {\n this._audioChunks = this._dropOldChunks();\n } else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {\n this._transcribeTask?.schedule();\n }\n }\n\n private async _transcribe() {\n log('transcribing', { chunks: this._audioChunks.length });\n const chunks = this._audioChunks;\n this._audioChunks = this._dropOldChunks();\n if (chunks.length === 0) {\n return;\n }\n\n const audio = await this._mergeAudioChunks(chunks);\n const segments = await this._fetchTranscription(audio);\n if (!Array.isArray(segments) || segments.length === 0) {\n return;\n }\n\n const alignedSegments = this._alignSegments(segments, chunks);\n if (alignedSegments.length > 0) {\n await this._onSegments(alignedSegments);\n }\n }\n\n private _dropOldChunks() {\n return this._config.prefixBufferChunksAmount > 0\n ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount)\n : [];\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _mergeAudioChunks(chunks: AudioChunk[]) {\n const file = new WaveFile();\n const wavConfig = this._recorder.wavConfig;\n\n file.fromScratch(\n wavConfig.channels,\n wavConfig.sampleRate,\n wavConfig.bitDepthCode,\n mergeFloat64Arrays(chunks.map(({ data }) => data)),\n );\n\n return file.toBase64();\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _fetchTranscription(audio: string) {\n if (audio.length === 0) {\n this._audioChunks = [];\n throw new Error('No audio to send for transcribing');\n }\n\n const response = await fetch(`${TRANSCRIPTION_URL}/transcribe`, {\n method: 'POST',\n body: JSON.stringify({ audio }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n this._audioChunks = [];\n throw new Error('Failed to transcribe');\n }\n\n const {\n segments,\n }: {\n segments: WhisperSegment[];\n } = await response.json();\n\n log.info('transcription response', {\n segments,\n string: segments.map((segments) => segments.text).join(' '),\n });\n\n return segments;\n }\n\n private _alignSegments(segments: WhisperSegment[], originalChunks: AudioChunk[]): TranscriptSegment[] {\n // Absolute zero for all relative timestamps in the segments.\n const zeroTimestamp = originalChunks.at(0)!.timestamp;\n\n const filteredSegments = segments\n // Use segments that end after the last used timestamp.\n // Segments could overlap, so we need to filter words that starts after the last used timestamp.\n .filter((segment) => zeroTimestamp + segment.end * 1_000 >= this._lastUsedTimestamp)\n // Use words that starts after the last used timestamp.\n .map((segment) => {\n const words = segment.words.filter((word) => zeroTimestamp + word.start * 1_000 >= this._lastUsedTimestamp);\n return {\n ...segment,\n words,\n text: words.map((word) => word.word).join(''),\n start: words.at(0)?.start ?? segment.end,\n };\n })\n .filter((segment) => segment.words.length > 0);\n\n if (filteredSegments.length === 0) {\n return [];\n }\n\n // Update last timestamp.\n this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1)!.end * 1_000;\n\n // Add absolute timestamp to each segment.\n return filteredSegments.map((segment) => ({\n started: new Date(zeroTimestamp + segment.start * 1_000),\n text: segment.text,\n }));\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useState, useEffect, useCallback } from 'react';\n\nimport { scheduleMicroTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { useSoundEffect } from '@dxos/react-ui-sfx';\n\nimport { useAudioTrack } from './useAudioTrack';\nimport { useTranscriber } from './useTranscriber';\nimport { type TranscriberParams } from '../transcriber';\n\nexport type UseVoiceInputProps = {\n active?: boolean;\n onUpdate: (text: string) => void;\n};\n\n/**\n * Hook for voice input.\n */\nexport const useVoiceInput = ({ active, onUpdate }: UseVoiceInputProps) => {\n const soundStart = useSoundEffect('StartRecording');\n const soundStop = useSoundEffect('StopRecording');\n\n const handleSegments = useCallback<TranscriberParams['onSegments']>(async (segments) => {\n const text = segments.map((str) => str.text.trim().replace(/[^\\w\\s]/g, '')).join(' ');\n onUpdate(text);\n }, []);\n\n // Audio/transcription.\n const [recording, setRecording] = useState(false);\n const track = useAudioTrack(active);\n const transcriber = useTranscriber({\n audioStreamTrack: track,\n onSegments: handleSegments,\n });\n\n // Start/stop transcription.\n useEffect(() => {\n const ctx = new Context();\n scheduleMicroTask(ctx, async () => {\n if (active && transcriber) {\n await transcriber.open();\n log.info('starting...');\n setRecording(true);\n void soundStart.play();\n transcriber.startChunksRecording();\n } else if (!active && transcriber?.isOpen) {\n transcriber?.stopChunksRecording();\n await transcriber?.close();\n log.info('stopped');\n setRecording(false);\n void soundStop.play();\n }\n });\n\n return () => {\n void ctx.dispose();\n };\n }, [active, transcriber]);\n\n return { recording };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Capabilities, Events, contributes, defineModule, definePlugin } from '@dxos/app-framework';\nimport { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';\n\nimport { AppGraphBuilder, IntentResolver, ReactSurface, TranscriptionCapabilities } from './capabilities';\nimport { meta, TRANSCRIPTION_PLUGIN } from './meta';\nimport translations from './translations';\nimport { TranscriptType } from './types';\n\nexport const TranscriptionPlugin = () =>\n definePlugin(meta, [\n defineModule({\n id: `${meta.id}/module/translations`,\n activatesOn: Events.SetupTranslations,\n activate: () => contributes(Capabilities.Translations, translations),\n }),\n defineModule({\n id: `${meta.id}/module/transcription`,\n activatesOn: Events.Startup,\n activate: () => contributes(TranscriptionCapabilities.Transcription, null),\n }),\n defineModule({\n id: `${meta.id}/module/metadata`,\n activatesOn: Events.SetupMetadata,\n activate: () =>\n contributes(Capabilities.Metadata, {\n id: TranscriptType.typename,\n metadata: {\n placeholder: ['transcript title placeholder', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--subtitles--regular',\n },\n }),\n }),\n defineModule({\n id: `${meta.id}/module/schema`,\n activatesOn: ClientEvents.SetupSchema,\n activate: () => [contributes(ClientCapabilities.Schema, [TranscriptType])],\n }),\n defineModule({\n id: `${meta.id}/module/react-surface`,\n activatesOn: Events.SetupReactSurface,\n activate: ReactSurface,\n }),\n defineModule({\n id: `${meta.id}/module/intent-resolver`,\n activatesOn: Events.SetupIntentResolver,\n activate: IntentResolver,\n }),\n defineModule({\n id: `${meta.id}/module/app-graph-builder`,\n activatesOn: Events.SetupAppGraph,\n activate: AppGraphBuilder,\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { TRANSCRIPTION_PLUGIN } from './meta';\nimport { TranscriptType } from './types';\n\nexport default [\n {\n 'en-US': {\n [TranscriptType.typename]: {\n 'typename label': 'Transcript',\n },\n [TRANSCRIPTION_PLUGIN]: {\n 'plugin name': 'Transcription',\n 'calls label': 'Transcript',\n 'calls panel label': 'Transcription',\n 'create calls label': 'Create transcription',\n 'delete calls label': 'Delete',\n\n 'delete button': 'Delete',\n 'bookmark button': 'Bookmark',\n 'summary button': 'Create summary',\n 'summarizing label': 'Summarizing...',\n },\n },\n },\n];\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["lazy", "defineCapability", "TranscriptionCapabilities", "Transcription", "defineCapability", "TRANSCRIPTION_PLUGIN", "AppGraphBuilder", "lazy", "IntentResolver", "ReactSurface", "useEffect", "useState", "log", "useAudioFile", "audioUrl", "audio", "stream", "track", "setStream", "t", "setTimeout", "response", "fetch", "blob", "Audio", "src", "URL", "createObjectURL", "Promise", "resolve", "reject", "addEventListener", "err", "error", "once", "info", "load", "ctx", "AudioContext", "destination", "createMediaStreamDestination", "channelCount", "source", "createMediaElementSource", "connect", "getAudioTracks", "clearTimeout", "useEffect", "useState", "useAudioTrack", "active", "track", "setTrack", "useState", "useEffect", "stop", "undefined", "initAudio", "audio", "Audio", "srcObject", "navigator", "mediaDevices", "getUserMedia", "getAudioTracks", "useEffect", "useRef", "useState", "useIsSpeaking", "mediaStreamTrack", "isSpeaking", "setIsSpeaking", "useState", "isSpeakingRef", "useRef", "useEffect", "current", "interval", "window", "setInterval", "clearInterval", "timeout", "cleanup", "monitorAudioLevel", "onMeasure", "vol", "audioLevelAboveThreshold", "clearTimeout", "setTimeout", "useEffect", "useMemo", "MediaRecorder", "register", "WaveFile", "synchronized", "invariant", "log", "trace", "initializingPromise", "initializeExtendableMediaRecorder", "connect", "MediaStreamRecorder", "constructor", "mediaStreamTrack", "interval", "_mediaRecorder", "undefined", "_header", "_mediaStreamTrack", "_interval", "wavConfig", "settings", "getSettings", "channels", "channelCount", "sampleRate", "bitDepthCode", "sampleSize", "String", "setOnChunk", "onChunk", "_onChunk", "start", "catch", "err", "info", "stream", "MediaStream", "mimeType", "state", "ondataavailable", "event", "_ondataavailable", "stop", "blob", "data", "uint8Array", "Uint8Array", "arrayBuffer", "isHeader", "wav", "slice", "warn", "timestamp", "Date", "now", "getSamples", "resource", "WaveFile", "DeferredTask", "Trigger", "LifecycleState", "Resource", "log", "trace", "Transcriber", "Resource", "constructor", "config", "recorder", "onSegments", "_audioChunks", "_lastUsedTimestamp", "_openTrigger", "Trigger", "autoReset", "_recording", "_transcribeTask", "undefined", "_config", "_recorder", "_onSegments", "_open", "ctx", "setOnChunk", "chunk", "_saveAudioChunk", "start", "DeferredTask", "_transcribe", "wake", "_close", "stop", "startChunksRecording", "_lifecycleState", "LifecycleState", "OPEN", "stopChunksRecording", "schedule", "log", "push", "scheduled", "length", "prefixBufferChunksAmount", "_dropOldChunks", "transcribeAfterChunksAmount", "chunks", "audio", "_mergeAudioChunks", "segments", "_fetchTranscription", "Array", "isArray", "alignedSegments", "_alignSegments", "slice", "file", "WaveFile", "wavConfig", "fromScratch", "channels", "sampleRate", "bitDepthCode", "mergeFloat64Arrays", "map", "data", "toBase64", "Error", "response", "fetch", "TRANSCRIPTION_URL", "method", "body", "JSON", "stringify", "headers", "ok", "json", "info", "string", "text", "join", "originalChunks", "zeroTimestamp", "at", "timestamp", "filteredSegments", "filter", "segment", "end", "words", "word", "started", "Date", "trace", "span", "showInBrowserTimeline", "RECORD_INTERVAL", "PREFIXED_CHUNKS_AMOUNT", "TRANSCRIBE_AFTER_CHUNKS_AMOUNT", "useTranscriber", "audioStreamTrack", "onSegments", "transcriber", "useMemo", "undefined", "Transcriber", "config", "transcribeAfterChunksAmount", "prefixBufferChunksAmount", "recorder", "MediaStreamRecorder", "mediaStreamTrack", "interval", "useEffect", "close", "useState", "useEffect", "useCallback", "scheduleMicroTask", "Context", "log", "useSoundEffect", "useVoiceInput", "active", "onUpdate", "soundStart", "useSoundEffect", "soundStop", "handleSegments", "useCallback", "segments", "text", "map", "str", "trim", "replace", "join", "recording", "setRecording", "useState", "track", "useAudioTrack", "transcriber", "useTranscriber", "audioStreamTrack", "onSegments", "useEffect", "ctx", "Context", "scheduleMicroTask", "open", "log", "info", "play", "startChunksRecording", "isOpen", "stopChunksRecording", "close", "dispose", "Capabilities", "Events", "contributes", "defineModule", "definePlugin", "ClientCapabilities", "ClientEvents", "TranscriptType", "typename", "TRANSCRIPTION_PLUGIN", "TranscriptionPlugin", "definePlugin", "meta", "defineModule", "id", "activatesOn", "Events", "SetupTranslations", "activate", "contributes", "Capabilities", "Translations", "translations", "Startup", "TranscriptionCapabilities", "Transcription", "SetupMetadata", "Metadata", "TranscriptType", "typename", "metadata", "placeholder", "ns", "TRANSCRIPTION_PLUGIN", "icon", "ClientEvents", "SetupSchema", "ClientCapabilities", "Schema", "SetupReactSurface", "ReactSurface", "SetupIntentResolver", "IntentResolver", "SetupAppGraph", "AppGraphBuilder"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getTimeStr,
|
|
3
|
+
randomQueueDxn
|
|
4
|
+
} from "./chunk-ZMES3U2D.mjs";
|
|
5
|
+
import {
|
|
6
|
+
TranscriptType,
|
|
7
|
+
TranscriptionAction
|
|
8
|
+
} from "./chunk-QIHUPVQD.mjs";
|
|
9
|
+
|
|
10
|
+
// packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts
|
|
11
|
+
import { Capabilities, contributes, createResolver } from "@dxos/app-framework";
|
|
12
|
+
import { create } from "@dxos/live-object";
|
|
13
|
+
var intent_resolver_default = (context) => contributes(Capabilities.IntentResolver, [
|
|
14
|
+
createResolver({
|
|
15
|
+
intent: TranscriptionAction.Create,
|
|
16
|
+
resolve: ({ name }) => {
|
|
17
|
+
const transcript = create(TranscriptType, {
|
|
18
|
+
queue: randomQueueDxn().toString(),
|
|
19
|
+
name: name ?? `Transcript ${getTimeStr(Date.now())}`
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
data: {
|
|
23
|
+
object: transcript
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
]);
|
|
29
|
+
export {
|
|
30
|
+
intent_resolver_default as default
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=intent-resolver-EAR2TFK2.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/intent-resolver.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createResolver, type PluginsContext } from '@dxos/app-framework';\nimport { create } from '@dxos/live-object';\n\nimport { TranscriptionAction, TranscriptType } from '../types';\nimport { getTimeStr, randomQueueDxn } from '../util';\n\nexport default (context: PluginsContext) =>\n contributes(Capabilities.IntentResolver, [\n createResolver({\n intent: TranscriptionAction.Create,\n resolve: ({ name }) => {\n const transcript = create(TranscriptType, {\n queue: randomQueueDxn().toString(), // TODO(burdon): Associate with space.\n name: name ?? `Transcript ${getTimeStr(Date.now())}`,\n });\n\n return { data: { object: transcript } };\n },\n }),\n ]);\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;AAIA,SAASA,cAAcC,aAAaC,sBAA2C;AAC/E,SAASC,cAAc;AAKvB,IAAA,0BAAe,CAACC,YACdC,YAAYC,aAAaC,gBAAgB;EACvCC,eAAe;IACbC,QAAQC,oBAAoBC;IAC5BC,SAAS,CAAC,EAAEC,KAAI,MAAE;AAChB,YAAMC,aAAaC,OAAOC,gBAAgB;QACxCC,OAAOC,eAAAA,EAAiBC,SAAQ;QAChCN,MAAMA,QAAQ,cAAcO,WAAWC,KAAKC,IAAG,CAAA,CAAA;MACjD,CAAA;AAEA,aAAO;QAAEC,MAAM;UAAEC,QAAQV;QAAW;MAAE;IACxC;EACF,CAAA;CACD;",
|
|
6
|
+
"names": ["Capabilities", "contributes", "createResolver", "create", "context", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "TranscriptionAction", "Create", "resolve", "name", "transcript", "create", "TranscriptType", "queue", "randomQueueDxn", "toString", "getTimeStr", "Date", "now", "data", "object"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"inputs":{"packages/plugins/experimental/plugin-transcription/src/meta.ts":{"bytes":1793,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/capabilities.ts":{"bytes":1709,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts":{"bytes":1075,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/types/schema.ts":{"bytes":5111,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/types/types.ts":{"bytes":3851,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/types/schema.ts","kind":"import-statement","original":"./schema"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/types/index.ts":{"bytes":607,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/types/schema.ts","kind":"import-statement","original":"./schema"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/array.ts":{"bytes":1600,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts":{"bytes":1354,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/monitor-audio-level.ts":{"bytes":5995,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts":{"bytes":1462,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/util/index.ts":{"bytes":851,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/util/array.ts","kind":"import-statement","original":"./array"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts","kind":"import-statement","original":"./get-time-str"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/monitor-audio-level.ts","kind":"import-statement","original":"./monitor-audio-level"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts","kind":"import-statement","original":"./random-queue-dxn"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts":{"bytes":3274,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx":{"bytes":7670,"imports":[{"path":"date-fns/formatDistanceToNow","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts":{"bytes":550,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx","kind":"import-statement","original":"./Transcript"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx":{"bytes":20662,"imports":[{"path":"effect","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/assistant","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"@dxos/plugin-space/types","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-edge-client","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-components","kind":"import-statement","external":true},{"path":"@dxos/react-ui-stack","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts","kind":"import-statement","original":"./Transcript"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/components/index.ts":{"bytes":1062,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts","kind":"import-statement","original":"./Transcript"},{"path":"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx","kind":"import-statement","original":"./TranscriptContainer"},{"path":"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx","kind":"dynamic-import","original":"./TranscriptContainer"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx":{"bytes":2737,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/components/index.ts","kind":"import-statement","original":"../components"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"../meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts":{"bytes":1473,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/capabilities.ts","kind":"import-statement","original":"./capabilities"},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts","kind":"dynamic-import","original":"./app-graph-builder"},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts","kind":"dynamic-import","original":"./intent-resolver"},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx","kind":"dynamic-import","original":"./react-surface"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts":{"bytes":6346,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts":{"bytes":3162,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useIsSpeaking.ts":{"bytes":7780,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/audio-recorder.ts":{"bytes":3252,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts":{"bytes":13121,"imports":[{"path":"extendable-media-recorder","kind":"import-statement","external":true},{"path":"wavefile","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"extendable-media-recorder-wav-encoder","kind":"dynamic-import","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts":{"bytes":24141,"imports":[{"path":"wavefile","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"../types"},{"path":"packages/plugins/experimental/plugin-transcription/src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts":{"bytes":772,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/audio-recorder.ts","kind":"import-statement","original":"./audio-recorder"},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts","kind":"import-statement","original":"./media-stream-recorder"},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts","kind":"import-statement","original":"./transcriber"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts":{"bytes":5265,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts","kind":"import-statement","original":"../transcriber"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts":{"bytes":7280,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui-sfx","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts","kind":"import-statement","original":"./useAudioTrack"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts","kind":"import-statement","original":"./useTranscriber"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/hooks/index.ts":{"bytes":957,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts","kind":"import-statement","original":"./useAudioFile"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts","kind":"import-statement","original":"./useAudioTrack"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useIsSpeaking.ts","kind":"import-statement","original":"./useIsSpeaking"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts","kind":"import-statement","original":"./useTranscriber"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts","kind":"import-statement","original":"./useVoiceInput"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/translations.ts":{"bytes":2603,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx":{"bytes":7960,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-client","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts","kind":"import-statement","original":"./capabilities"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/translations.ts","kind":"import-statement","original":"./translations"},{"path":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-transcription/src/index.ts":{"bytes":1011,"imports":[{"path":"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts","kind":"import-statement","original":"./capabilities"},{"path":"packages/plugins/experimental/plugin-transcription/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/plugins/experimental/plugin-transcription/src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"packages/plugins/experimental/plugin-transcription/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts","kind":"import-statement","original":"./transcriber"},{"path":"packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx","kind":"import-statement","original":"./TranscriptionPlugin"}],"format":"esm"}},"outputs":{"packages/plugins/experimental/plugin-transcription/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":38189},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-ZMES3U2D.mjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-IHSLJZZ7.mjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-ORGZ2DWD.mjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-QIHUPVQD.mjs","kind":"import-statement"},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs","kind":"dynamic-import"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/intent-resolver-EAR2TFK2.mjs","kind":"dynamic-import"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/react-surface-JM2F2QZC.mjs","kind":"dynamic-import"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"extendable-media-recorder","kind":"import-statement","external":true},{"path":"wavefile","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"extendable-media-recorder-wav-encoder","kind":"dynamic-import","external":true},{"path":"wavefile","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/tracing","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui-sfx","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-client","kind":"import-statement","external":true}],"exports":["AppGraphBuilder","IntentResolver","MediaStreamRecorder","ReactSurface","TRANSCRIPTION_PLUGIN","Transcriber","Transcript","TranscriptContainer","TranscriptionCapabilities","TranscriptionContainer","TranscriptionPlugin","meta","useAudioFile","useAudioTrack","useIsSpeaking","useTranscriber","useVoiceInput"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/index.ts","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts":{"bytesInOutput":268},"packages/plugins/experimental/plugin-transcription/src/capabilities/capabilities.ts":{"bytesInOutput":309},"packages/plugins/experimental/plugin-transcription/src/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts":{"bytesInOutput":1681},"packages/plugins/experimental/plugin-transcription/src/hooks/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/hooks/useAudioTrack.ts":{"bytesInOutput":628},"packages/plugins/experimental/plugin-transcription/src/hooks/useIsSpeaking.ts":{"bytesInOutput":1387},"packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts":{"bytesInOutput":848},"packages/plugins/experimental/plugin-transcription/src/transcriber/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts":{"bytesInOutput":3707},"packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts":{"bytesInOutput":5593},"packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts":{"bytesInOutput":1882},"packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx":{"bytesInOutput":1623},"packages/plugins/experimental/plugin-transcription/src/translations.ts":{"bytesInOutput":565}},"bytes":20359},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/types/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/types/index.mjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-QIHUPVQD.mjs","kind":"import-statement"}],"exports":["TRANSCRIPTION_URL","TranscriptBlock","TranscriptSchema","TranscriptType","TranscriptionAction","isTranscript"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/types/index.ts","inputs":{},"bytes":320},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":536},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs":{"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/app-graph-builder.ts":{"bytesInOutput":157}},"bytes":356},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/intent-resolver-EAR2TFK2.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1617},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/intent-resolver-EAR2TFK2.mjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-ZMES3U2D.mjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-QIHUPVQD.mjs","kind":"import-statement"},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/intent-resolver.ts":{"bytesInOutput":558}},"bytes":903},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-ZMES3U2D.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5084},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-ZMES3U2D.mjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"exports":["getTimeStr","mergeFloat64Arrays","monitorAudioLevel","randomQueueDxn"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/util/get-time-str.ts":{"bytesInOutput":195},"packages/plugins/experimental/plugin-transcription/src/util/random-queue-dxn.ts":{"bytesInOutput":231},"packages/plugins/experimental/plugin-transcription/src/util/array.ts":{"bytesInOutput":267},"packages/plugins/experimental/plugin-transcription/src/util/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/util/monitor-audio-level.ts":{"bytesInOutput":1264}},"bytes":2411},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/TranscriptContainer-7J3JHI6Q.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/TranscriptContainer-7J3JHI6Q.mjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-ORGZ2DWD.mjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-QIHUPVQD.mjs","kind":"import-statement"}],"exports":["TranscriptionContainer","default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx","inputs":{},"bytes":264},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/react-surface-JM2F2QZC.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1326},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/react-surface-JM2F2QZC.mjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-IHSLJZZ7.mjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-ORGZ2DWD.mjs","kind":"import-statement"},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-QIHUPVQD.mjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx","inputs":{"packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx":{"bytesInOutput":445}},"bytes":809},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-IHSLJZZ7.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":453},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-IHSLJZZ7.mjs":{"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/TranscriptContainer-7J3JHI6Q.mjs","kind":"dynamic-import"}],"exports":["TranscriptContainer"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/components/index.ts":{"bytesInOutput":114}},"bytes":271},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-ORGZ2DWD.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":14369},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-ORGZ2DWD.mjs":{"imports":[{"path":"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-QIHUPVQD.mjs","kind":"import-statement"},{"path":"effect","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/artifact","kind":"import-statement","external":true},{"path":"@dxos/assistant","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"@dxos/plugin-space/types","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-edge-client","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-components","kind":"import-statement","external":true},{"path":"@dxos/react-ui-stack","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"date-fns/formatDistanceToNow","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true}],"exports":["Transcript","TranscriptContainer_default","TranscriptionContainer"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/components/TranscriptContainer.tsx":{"bytesInOutput":5491},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/Transcript.tsx":{"bytesInOutput":2030},"packages/plugins/experimental/plugin-transcription/src/components/Transcript/index.ts":{"bytesInOutput":0}},"bytes":8014},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-QIHUPVQD.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5170},"packages/plugins/experimental/plugin-transcription/dist/lib/browser/chunk-QIHUPVQD.mjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true}],"exports":["TRANSCRIPTION_PLUGIN","TRANSCRIPTION_URL","TranscriptBlock","TranscriptSchema","TranscriptType","TranscriptionAction","isTranscript","meta"],"inputs":{"packages/plugins/experimental/plugin-transcription/src/types/schema.ts":{"bytesInOutput":844},"packages/plugins/experimental/plugin-transcription/src/types/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-transcription/src/types/types.ts":{"bytesInOutput":730},"packages/plugins/experimental/plugin-transcription/src/meta.ts":{"bytesInOutput":358}},"bytes":2426}}}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import "./chunk-IHSLJZZ7.mjs";
|
|
2
|
+
import {
|
|
3
|
+
TranscriptionContainer
|
|
4
|
+
} from "./chunk-ORGZ2DWD.mjs";
|
|
5
|
+
import {
|
|
6
|
+
TRANSCRIPTION_PLUGIN,
|
|
7
|
+
isTranscript
|
|
8
|
+
} from "./chunk-QIHUPVQD.mjs";
|
|
9
|
+
|
|
10
|
+
// packages/plugins/experimental/plugin-transcription/src/capabilities/react-surface.tsx
|
|
11
|
+
import React from "react";
|
|
12
|
+
import { Capabilities, contributes, createSurface } from "@dxos/app-framework";
|
|
13
|
+
var react_surface_default = () => contributes(Capabilities.ReactSurface, [
|
|
14
|
+
createSurface({
|
|
15
|
+
id: TRANSCRIPTION_PLUGIN,
|
|
16
|
+
role: "article",
|
|
17
|
+
filter: (data) => isTranscript(data.subject),
|
|
18
|
+
component: ({ data, role }) => /* @__PURE__ */ React.createElement(TranscriptionContainer, {
|
|
19
|
+
transcript: data.subject
|
|
20
|
+
})
|
|
21
|
+
})
|
|
22
|
+
]);
|
|
23
|
+
export {
|
|
24
|
+
react_surface_default as default
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=react-surface-JM2F2QZC.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/react-surface.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface } from '@dxos/app-framework';\n\nimport { TranscriptionContainer } from '../components';\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { isTranscript, type TranscriptType } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: TRANSCRIPTION_PLUGIN,\n role: 'article',\n filter: (data): data is { subject: TranscriptType } => isTranscript(data.subject),\n component: ({ data, role }) => <TranscriptionContainer transcript={data.subject} />,\n }),\n ]);\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;AAIA,OAAOA,WAAW;AAElB,SAASC,cAAcC,aAAaC,qBAAqB;AAMzD,IAAA,wBAAe,MACbC,YAAYC,aAAaC,cAAc;EACrCC,cAAc;IACZC,IAAIC;IACJC,MAAM;IACNC,QAAQ,CAACC,SAA8CC,aAAaD,KAAKE,OAAO;IAChFC,WAAW,CAAC,EAAEH,MAAMF,KAAI,MAAO,sBAAA,cAACM,wBAAAA;MAAuBC,YAAYL,KAAKE;;EAC1E,CAAA;CACD;",
|
|
6
|
+
"names": ["React", "Capabilities", "contributes", "createSurface", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "TRANSCRIPTION_PLUGIN", "role", "filter", "data", "isTranscript", "subject", "component", "TranscriptionContainer", "transcript"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TRANSCRIPTION_URL,
|
|
3
|
+
TranscriptBlock,
|
|
4
|
+
TranscriptSchema,
|
|
5
|
+
TranscriptType,
|
|
6
|
+
TranscriptionAction,
|
|
7
|
+
isTranscript
|
|
8
|
+
} from "../chunk-QIHUPVQD.mjs";
|
|
9
|
+
export {
|
|
10
|
+
TRANSCRIPTION_URL,
|
|
11
|
+
TranscriptBlock,
|
|
12
|
+
TranscriptSchema,
|
|
13
|
+
TranscriptType,
|
|
14
|
+
TranscriptionAction,
|
|
15
|
+
isTranscript
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,31 @@
|
|
|
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 TranscriptContainer_FFAQVGMS_exports = {};
|
|
20
|
+
__export(TranscriptContainer_FFAQVGMS_exports, {
|
|
21
|
+
TranscriptionContainer: () => import_chunk_JYADA35W.TranscriptionContainer,
|
|
22
|
+
default: () => import_chunk_JYADA35W.TranscriptContainer_default
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(TranscriptContainer_FFAQVGMS_exports);
|
|
25
|
+
var import_chunk_JYADA35W = require("./chunk-JYADA35W.cjs");
|
|
26
|
+
var import_chunk_UIHEGU6Q = require("./chunk-UIHEGU6Q.cjs");
|
|
27
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
+
0 && (module.exports = {
|
|
29
|
+
TranscriptionContainer
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=TranscriptContainer-FFAQVGMS.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["TranscriptContainer-FFAQVGMS.cjs"],
|
|
4
|
+
"sourcesContent": ["import {\n TranscriptContainer_default,\n TranscriptionContainer\n} from \"./chunk-JYADA35W.cjs\";\nimport \"./chunk-UIHEGU6Q.cjs\";\nexport {\n TranscriptionContainer,\n TranscriptContainer_default as default\n};\n//# sourceMappingURL=TranscriptContainer-FFAQVGMS.cjs.map\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAGO;AACP,4BAAO;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
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 app_graph_builder_YFBX3OTP_exports = {};
|
|
20
|
+
__export(app_graph_builder_YFBX3OTP_exports, {
|
|
21
|
+
default: () => app_graph_builder_default
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(app_graph_builder_YFBX3OTP_exports);
|
|
24
|
+
var import_app_framework = require("@dxos/app-framework");
|
|
25
|
+
var app_graph_builder_default = (context) => (0, import_app_framework.contributes)(import_app_framework.Capabilities.AppGraphBuilder, []);
|
|
26
|
+
//# sourceMappingURL=app-graph-builder-YFBX3OTP.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/app-graph-builder.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, type PluginsContext } from '@dxos/app-framework';\n\nexport default (context: PluginsContext) => contributes(Capabilities.AppGraphBuilder, []);\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAIA,2BAA+D;AAE/D,IAAA,4BAAe,CAACA,gBAA4BC,kCAAYC,kCAAaC,iBAAiB,CAAA,CAAE;",
|
|
6
|
+
"names": ["context", "contributes", "Capabilities", "AppGraphBuilder"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
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 chunk_JBN3P6ZF_exports = {};
|
|
20
|
+
__export(chunk_JBN3P6ZF_exports, {
|
|
21
|
+
getTimeStr: () => getTimeStr,
|
|
22
|
+
mergeFloat64Arrays: () => mergeFloat64Arrays,
|
|
23
|
+
monitorAudioLevel: () => monitorAudioLevel,
|
|
24
|
+
randomQueueDxn: () => randomQueueDxn
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(chunk_JBN3P6ZF_exports);
|
|
27
|
+
var import_echo_schema = require("@dxos/echo-schema");
|
|
28
|
+
var import_keys = require("@dxos/keys");
|
|
29
|
+
var getTimeStr = (timestamp) => new Date(timestamp ?? Date.now()).toLocaleTimeString("en-US", {
|
|
30
|
+
timeZone: "UTC",
|
|
31
|
+
hour12: true,
|
|
32
|
+
hour: "numeric",
|
|
33
|
+
minute: "2-digit",
|
|
34
|
+
second: "2-digit"
|
|
35
|
+
});
|
|
36
|
+
var randomQueueDxn = () => new import_keys.DXN(import_keys.DXN.kind.QUEUE, [
|
|
37
|
+
import_keys.QueueSubspaceTags.DATA,
|
|
38
|
+
import_keys.SpaceId.random(),
|
|
39
|
+
import_echo_schema.ObjectId.random()
|
|
40
|
+
]);
|
|
41
|
+
var mergeFloat64Arrays = (arrays) => {
|
|
42
|
+
const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));
|
|
43
|
+
let offset = 0;
|
|
44
|
+
for (const array of arrays) {
|
|
45
|
+
newArray.set(array, offset);
|
|
46
|
+
offset += array.length;
|
|
47
|
+
}
|
|
48
|
+
return newArray;
|
|
49
|
+
};
|
|
50
|
+
var monitorAudioLevel = ({ mediaStreamTrack, onMeasure, intervalMs = 1e3 / 10 }) => {
|
|
51
|
+
let timeout = -1;
|
|
52
|
+
let interval = -1;
|
|
53
|
+
const audioContext = new AudioContext();
|
|
54
|
+
const stream = new MediaStream();
|
|
55
|
+
stream.addTrack(mediaStreamTrack);
|
|
56
|
+
const mediaStreamAudioSourceNode = audioContext.createMediaStreamSource(stream);
|
|
57
|
+
const analyserNode = audioContext.createAnalyser();
|
|
58
|
+
mediaStreamAudioSourceNode.connect(analyserNode);
|
|
59
|
+
analyserNode.fftSize = 32;
|
|
60
|
+
const pcmData = new Float32Array(analyserNode.fftSize);
|
|
61
|
+
let peak = 0;
|
|
62
|
+
interval = window.setInterval(() => {
|
|
63
|
+
onMeasure(peak);
|
|
64
|
+
peak = 0;
|
|
65
|
+
}, intervalMs);
|
|
66
|
+
const tick = () => {
|
|
67
|
+
timeout = window.setTimeout(() => {
|
|
68
|
+
analyserNode.getFloatTimeDomainData(pcmData);
|
|
69
|
+
let sumSquares = 0;
|
|
70
|
+
for (const amplitude of pcmData) {
|
|
71
|
+
sumSquares += amplitude * amplitude;
|
|
72
|
+
}
|
|
73
|
+
const current = Math.sqrt(sumSquares / pcmData.length);
|
|
74
|
+
if (current > peak) {
|
|
75
|
+
peak = current;
|
|
76
|
+
}
|
|
77
|
+
tick();
|
|
78
|
+
}, intervalMs);
|
|
79
|
+
};
|
|
80
|
+
tick();
|
|
81
|
+
return () => {
|
|
82
|
+
mediaStreamAudioSourceNode.disconnect();
|
|
83
|
+
analyserNode.disconnect();
|
|
84
|
+
void audioContext.close();
|
|
85
|
+
clearInterval(interval);
|
|
86
|
+
clearTimeout(timeout);
|
|
87
|
+
stream.removeTrack(mediaStreamTrack);
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
91
|
+
0 && (module.exports = {
|
|
92
|
+
getTimeStr,
|
|
93
|
+
mergeFloat64Arrays,
|
|
94
|
+
monitorAudioLevel,
|
|
95
|
+
randomQueueDxn
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=chunk-JBN3P6ZF.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/util/get-time-str.ts", "../../../src/util/random-queue-dxn.ts", "../../../src/util/array.ts", "../../../src/util/monitor-audio-level.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nexport const getTimeStr = (timestamp?: number) =>\n new Date(timestamp ?? Date.now()).toLocaleTimeString('en-US', {\n timeZone: 'UTC',\n hour12: true,\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ObjectId } from '@dxos/echo-schema';\nimport { DXN, QueueSubspaceTags, SpaceId } from '@dxos/keys';\n\nexport const randomQueueDxn = () =>\n new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, SpaceId.random(), ObjectId.random()]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nexport const mergeFloat64Arrays = (arrays: Float64Array[]) => {\n const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));\n let offset = 0;\n for (const array of arrays) {\n newArray.set(array, offset);\n offset += array.length;\n }\n\n return newArray;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nexport const monitorAudioLevel = ({\n mediaStreamTrack,\n onMeasure,\n intervalMs = 1000 / 10, // 12 fps.\n}: {\n mediaStreamTrack: MediaStreamTrack;\n onMeasure: (value: number) => void;\n intervalMs?: number;\n}) => {\n let timeout = -1;\n let interval = -1;\n const audioContext = new AudioContext();\n const stream = new MediaStream();\n stream.addTrack(mediaStreamTrack);\n const mediaStreamAudioSourceNode = audioContext.createMediaStreamSource(stream);\n const analyserNode = audioContext.createAnalyser();\n mediaStreamAudioSourceNode.connect(analyserNode);\n // Since we just need a rough approximation and will be measuring\n // frequently, we want to drop this down from the default of 2048.\n analyserNode.fftSize = 32;\n\n const pcmData = new Float32Array(analyserNode.fftSize);\n let peak = 0;\n\n interval = window.setInterval(() => {\n onMeasure(peak);\n peak = 0;\n }, intervalMs);\n\n const tick = () => {\n timeout = window.setTimeout(() => {\n analyserNode.getFloatTimeDomainData(pcmData);\n let sumSquares = 0.0;\n for (const amplitude of pcmData) {\n sumSquares += amplitude * amplitude;\n }\n const current = Math.sqrt(sumSquares / pcmData.length);\n if (current > peak) {\n peak = current;\n }\n tick();\n }, intervalMs);\n };\n tick();\n\n return () => {\n mediaStreamAudioSourceNode.disconnect();\n analyserNode.disconnect();\n void audioContext.close();\n clearInterval(interval);\n clearTimeout(timeout);\n stream.removeTrack(mediaStreamTrack);\n };\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;ACIA,yBAAyB;AACzB,kBAAgD;ADDzC,IAAMA,aAAa,CAACC,cACzB,IAAIC,KAAKD,aAAaC,KAAKC,IAAG,CAAA,EAAIC,mBAAmB,SAAS;EAC5DC,UAAU;EACVC,QAAQ;EACRC,MAAM;EACNC,QAAQ;EACRC,QAAQ;AACV,CAAA;ACJK,IAAMC,iBAAiB,MAC5B,IAAIC,gBAAIA,gBAAIC,KAAKC,OAAO;EAACC,8BAAkBC;EAAMC,oBAAQC,OAAM;EAAIC,4BAASD,OAAM;CAAG;ACJhF,IAAME,qBAAqB,CAACC,WAAAA;AACjC,QAAMC,WAAW,IAAIC,aAAaF,OAAOG,OAAO,CAACC,KAAKC,UAAUA,MAAMC,SAASF,KAAK,CAAA,CAAA;AACpF,MAAIG,SAAS;AACb,aAAWF,SAASL,QAAQ;AAC1BC,aAASO,IAAIH,OAAOE,MAAAA;AACpBA,cAAUF,MAAMC;EAClB;AAEA,SAAOL;AACT;ACTO,IAAMQ,oBAAoB,CAAC,EAChCC,kBACAC,WACAC,aAAa,MAAO,GAAE,MAKvB;AACC,MAAIC,UAAU;AACd,MAAIC,WAAW;AACf,QAAMC,eAAe,IAAIC,aAAAA;AACzB,QAAMC,SAAS,IAAIC,YAAAA;AACnBD,SAAOE,SAAST,gBAAAA;AAChB,QAAMU,6BAA6BL,aAAaM,wBAAwBJ,MAAAA;AACxE,QAAMK,eAAeP,aAAaQ,eAAc;AAChDH,6BAA2BI,QAAQF,YAAAA;AAGnCA,eAAaG,UAAU;AAEvB,QAAMC,UAAU,IAAIC,aAAaL,aAAaG,OAAO;AACrD,MAAIG,OAAO;AAEXd,aAAWe,OAAOC,YAAY,MAAA;AAC5BnB,cAAUiB,IAAAA;AACVA,WAAO;EACT,GAAGhB,UAAAA;AAEH,QAAMmB,OAAO,MAAA;AACXlB,cAAUgB,OAAOG,WAAW,MAAA;AAC1BV,mBAAaW,uBAAuBP,OAAAA;AACpC,UAAIQ,aAAa;AACjB,iBAAWC,aAAaT,SAAS;AAC/BQ,sBAAcC,YAAYA;MAC5B;AACA,YAAMC,UAAUC,KAAKC,KAAKJ,aAAaR,QAAQpB,MAAM;AACrD,UAAI8B,UAAUR,MAAM;AAClBA,eAAOQ;MACT;AACAL,WAAAA;IACF,GAAGnB,UAAAA;EACL;AACAmB,OAAAA;AAEA,SAAO,MAAA;AACLX,+BAA2BmB,WAAU;AACrCjB,iBAAaiB,WAAU;AACvB,SAAKxB,aAAayB,MAAK;AACvBC,kBAAc3B,QAAAA;AACd4B,iBAAa7B,OAAAA;AACbI,WAAO0B,YAAYjC,gBAAAA;EACrB;AACF;",
|
|
6
|
+
"names": ["getTimeStr", "timestamp", "Date", "now", "toLocaleTimeString", "timeZone", "hour12", "hour", "minute", "second", "randomQueueDxn", "DXN", "kind", "QUEUE", "QueueSubspaceTags", "DATA", "SpaceId", "random", "ObjectId", "mergeFloat64Arrays", "arrays", "newArray", "Float64Array", "reduce", "acc", "array", "length", "offset", "set", "monitorAudioLevel", "mediaStreamTrack", "onMeasure", "intervalMs", "timeout", "interval", "audioContext", "AudioContext", "stream", "MediaStream", "addTrack", "mediaStreamAudioSourceNode", "createMediaStreamSource", "analyserNode", "createAnalyser", "connect", "fftSize", "pcmData", "Float32Array", "peak", "window", "setInterval", "tick", "setTimeout", "getFloatTimeDomainData", "sumSquares", "amplitude", "current", "Math", "sqrt", "disconnect", "close", "clearInterval", "clearTimeout", "removeTrack"]
|
|
7
|
+
}
|