@dxos/plugin-transcription 0.8.4-main.abd8ff62ef → 0.8.4-main.bc2380dfbc
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 +102 -5
- package/README.md +1 -1
- package/dist/lib/neutral/TranscriptionArticle-L6XANBH5.mjs +54 -0
- package/dist/lib/neutral/TranscriptionArticle-L6XANBH5.mjs.map +7 -0
- package/dist/lib/neutral/TranscriptionPlugin.mjs +34 -0
- package/dist/lib/neutral/TranscriptionPlugin.mjs.map +7 -0
- package/dist/lib/neutral/TranscriptionPlugin.node.mjs +25 -0
- package/dist/lib/neutral/TranscriptionPlugin.node.mjs.map +7 -0
- package/dist/lib/neutral/TranscriptionPlugin.workerd.mjs +21 -0
- package/dist/lib/neutral/TranscriptionPlugin.workerd.mjs.map +7 -0
- package/dist/lib/neutral/blueprint-definition-HOXDG5QP.mjs +15 -0
- package/dist/lib/neutral/blueprint-definition-HOXDG5QP.mjs.map +7 -0
- package/dist/lib/neutral/blueprints/index.mjs +8 -0
- package/dist/lib/neutral/capabilities/index.mjs +17 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/{browser/chunk-NQQK7UZQ.mjs → neutral/chunk-2O3ONPRZ.mjs} +94 -40
- package/dist/lib/neutral/chunk-2O3ONPRZ.mjs.map +7 -0
- package/dist/lib/{browser/chunk-L4HW35L6.mjs → neutral/chunk-5FXU36PN.mjs} +19 -10
- package/dist/lib/neutral/chunk-5FXU36PN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-GL4RS533.mjs +22 -0
- package/dist/lib/neutral/chunk-GL4RS533.mjs.map +7 -0
- package/dist/lib/{browser/index.mjs → neutral/chunk-ILSA3DU7.mjs} +32 -70
- package/dist/lib/neutral/chunk-ILSA3DU7.mjs.map +7 -0
- package/dist/lib/neutral/chunk-Y5EQAFFR.mjs +8 -0
- package/dist/lib/neutral/chunk-Y5EQAFFR.mjs.map +7 -0
- package/dist/lib/{browser/blueprints/index.mjs → neutral/chunk-ZR4BH4QQ.mjs} +4 -5
- package/dist/lib/neutral/chunk-ZR4BH4QQ.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/components/index.mjs +83 -18
- package/dist/lib/neutral/components/index.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +9 -0
- package/dist/lib/neutral/containers/index.mjs.map +7 -0
- package/dist/lib/{browser/create-ULR5DPJZ.mjs → neutral/create-RRWRIUSR.mjs} +4 -4
- package/dist/lib/neutral/create-RRWRIUSR.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/hooks/index.mjs +5 -3
- package/dist/lib/neutral/index.mjs +44 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +8 -0
- package/dist/lib/{browser/open-SFMPLZVW.mjs → neutral/open-CVMX5KXZ.mjs} +5 -5
- package/dist/lib/neutral/open-CVMX5KXZ.mjs.map +7 -0
- package/dist/lib/neutral/operation-handler-NXMOAXFP.mjs +13 -0
- package/dist/lib/neutral/operation-handler-NXMOAXFP.mjs.map +7 -0
- package/dist/lib/neutral/operations/index.mjs +8 -0
- package/dist/lib/neutral/plugin.mjs +16 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/neutral/react-surface-YMZRO242.mjs +26 -0
- package/dist/lib/neutral/react-surface-YMZRO242.mjs.map +7 -0
- package/dist/lib/{browser/summarize-BDFX4APN.mjs → neutral/summarize-LA7TRW7A.mjs} +5 -5
- package/dist/lib/neutral/summarize-LA7TRW7A.mjs.map +7 -0
- package/dist/lib/neutral/text-content-F4ASMITB.mjs +30 -0
- package/dist/lib/neutral/text-content-F4ASMITB.mjs.map +7 -0
- package/dist/lib/neutral/transcriber-ABHATBVH.mjs +59 -0
- package/dist/lib/neutral/transcriber-ABHATBVH.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +24 -0
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/lib/neutral/types/index.mjs +10 -0
- package/dist/lib/neutral/types/index.mjs.map +7 -0
- package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
- package/dist/types/src/TranscriptionPlugin.node.d.ts.map +1 -1
- package/dist/types/src/TranscriptionPlugin.workerd.d.ts +4 -0
- package/dist/types/src/TranscriptionPlugin.workerd.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +5 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/text-content.d.ts +8 -0
- package/dist/types/src/capabilities/text-content.d.ts.map +1 -0
- package/dist/types/src/components/Oracle/Oracle.d.ts +24 -0
- package/dist/types/src/components/Oracle/Oracle.d.ts.map +1 -0
- package/dist/types/src/components/Oracle/Oracle.stories.d.ts +32 -0
- package/dist/types/src/components/Oracle/Oracle.stories.d.ts.map +1 -0
- package/dist/types/src/components/Oracle/index.d.ts +2 -0
- package/dist/types/src/components/Oracle/index.d.ts.map +1 -0
- package/dist/types/src/components/Transcription/Transcription.d.ts +0 -5
- package/dist/types/src/components/Transcription/Transcription.d.ts.map +1 -1
- package/dist/types/src/components/Transcription/Transcription.stories.d.ts +13 -16
- package/dist/types/src/components/Transcription/Transcription.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.d.ts +6 -0
- package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.d.ts.map +1 -0
- package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.stories.d.ts +28 -0
- package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/TranscriptionArticle/index.d.ts +2 -0
- package/dist/types/src/containers/TranscriptionArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +1 -1
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/enrichment/conversation.test.d.ts +2 -0
- package/dist/types/src/enrichment/conversation.test.d.ts.map +1 -0
- package/dist/types/src/enrichment/operations.d.ts +200 -0
- package/dist/types/src/enrichment/operations.d.ts.map +1 -0
- package/dist/types/src/enrichment/parser.d.ts +26 -0
- package/dist/types/src/enrichment/parser.d.ts.map +1 -0
- package/dist/types/src/enrichment/stream-simulator.d.ts +38 -0
- package/dist/types/src/enrichment/stream-simulator.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +2 -1
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useFeedModelAdapter.d.ts +12 -0
- package/dist/types/src/hooks/useFeedModelAdapter.d.ts.map +1 -0
- package/dist/types/src/hooks/useTranscriptionRecording.d.ts +12 -0
- package/dist/types/src/hooks/useTranscriptionRecording.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +3 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/normalization/message-normalizer.d.ts +7 -5
- package/dist/types/src/normalization/message-normalizer.d.ts.map +1 -1
- package/dist/types/src/normalization/normalization.d.ts +180 -1
- package/dist/types/src/normalization/normalization.d.ts.map +1 -1
- package/dist/types/src/operations/create.d.ts +2 -2
- package/dist/types/src/operations/create.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts +0 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/open.d.ts +2 -2
- package/dist/types/src/operations/open.d.ts.map +1 -1
- package/dist/types/src/operations/summarize.d.ts +2 -2
- package/dist/types/src/operations/summarize.d.ts.map +1 -1
- package/dist/types/src/plugin.d.ts +4 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/stories/FileTranscription.stories.d.ts +5 -3
- package/dist/types/src/stories/FileTranscription.stories.d.ts.map +1 -1
- package/dist/types/src/stories/KeyWordRecognition.stories.d.ts.map +1 -1
- package/dist/types/src/stories/{MicrophoneTranscription.stories.d.ts → LiveTranscription.stories.d.ts} +4 -4
- package/dist/types/src/stories/LiveTranscription.stories.d.ts.map +1 -0
- package/dist/types/src/stories/TranscriptionStory.d.ts +11 -13
- package/dist/types/src/stories/TranscriptionStory.d.ts.map +1 -1
- package/dist/types/src/stories/common.d.ts +46 -0
- package/dist/types/src/stories/common.d.ts.map +1 -0
- package/dist/types/src/testing/testing.d.ts +5 -6
- package/dist/types/src/testing/testing.d.ts.map +1 -1
- package/dist/types/src/transcriber/transcriber.d.ts +4 -4
- package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
- package/dist/types/src/transcriber/transcription-manager.d.ts +6 -4
- package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +2 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/{operations/definitions.d.ts → types/TranscriptOperation.d.ts} +1 -1
- package/dist/types/src/types/TranscriptOperation.d.ts.map +1 -0
- package/dist/types/src/types/TranscriptionCapabilities.d.ts +17 -0
- package/dist/types/src/types/TranscriptionCapabilities.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +2 -2
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +125 -94
- package/src/TranscriptionPlugin.node.ts +3 -31
- package/src/TranscriptionPlugin.test.ts +3 -3
- package/src/TranscriptionPlugin.tsx +3 -31
- package/src/TranscriptionPlugin.workerd.ts +18 -0
- package/src/blueprints/transcription-blueprint.ts +1 -1
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/react-surface.tsx +2 -2
- package/src/capabilities/text-content.ts +33 -0
- package/src/capabilities/transcriber.ts +1 -1
- package/src/components/Oracle/Oracle.stories.tsx +147 -0
- package/src/components/Oracle/Oracle.tsx +141 -0
- package/src/components/Oracle/index.ts +5 -0
- package/src/components/Transcription/Transcription.stories.tsx +116 -150
- package/src/components/Transcription/Transcription.tsx +7 -13
- package/src/components/index.ts +1 -0
- package/src/containers/TranscriptionArticle/TranscriptionArticle.stories.tsx +61 -0
- package/src/containers/TranscriptionArticle/TranscriptionArticle.tsx +62 -0
- package/src/containers/TranscriptionArticle/index.ts +5 -0
- package/src/containers/index.ts +1 -1
- package/src/enrichment/conversation.test.ts +162 -0
- package/src/enrichment/conversation.txt +23 -0
- package/src/enrichment/operations.ts +268 -0
- package/src/enrichment/parser.ts +101 -0
- package/src/enrichment/stream-simulator.ts +125 -0
- package/src/hooks/index.ts +2 -1
- package/src/hooks/useFeedModelAdapter.ts +46 -0
- package/src/hooks/useTranscriptionRecording.ts +87 -0
- package/src/index.ts +3 -9
- package/src/normalization/message-normalizer.ts +25 -13
- package/src/normalization/normalization.test.ts +3 -37
- package/src/normalization/normalization.ts +6 -7
- package/src/operations/create.ts +2 -2
- package/src/operations/index.ts +0 -2
- package/src/operations/open.ts +2 -2
- package/src/operations/summarize.ts +3 -3
- package/src/plugin.ts +11 -0
- package/src/stories/FileTranscription.stories.tsx +49 -175
- package/src/stories/KeyWordRecognition.stories.tsx +7 -9
- package/src/stories/LiveTranscription.stories.tsx +153 -0
- package/src/stories/TranscriptionStory.tsx +32 -24
- package/src/stories/common.ts +233 -0
- package/src/testing/testing.ts +20 -27
- package/src/transcriber/transcriber.test.ts +9 -9
- package/src/transcriber/transcriber.ts +18 -14
- package/src/transcriber/transcription-manager.ts +14 -9
- package/src/translations.ts +3 -0
- package/src/{operations/definitions.ts → types/TranscriptOperation.ts} +2 -0
- package/src/types/TranscriptionCapabilities.ts +39 -0
- package/src/types/index.ts +2 -2
- package/dist/lib/browser/blueprints/index.mjs.map +0 -7
- package/dist/lib/browser/chunk-3L623EVL.mjs +0 -17
- package/dist/lib/browser/chunk-3L623EVL.mjs.map +0 -7
- package/dist/lib/browser/chunk-L4HW35L6.mjs.map +0 -7
- package/dist/lib/browser/chunk-NQQK7UZQ.mjs.map +0 -7
- package/dist/lib/browser/components/index.mjs.map +0 -7
- package/dist/lib/browser/create-ULR5DPJZ.mjs.map +0 -7
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/open-SFMPLZVW.mjs.map +0 -7
- package/dist/lib/browser/operations/index.mjs +0 -13
- package/dist/lib/browser/operations/index.mjs.map +0 -7
- package/dist/lib/browser/summarize-BDFX4APN.mjs.map +0 -7
- package/dist/lib/browser/types/index.mjs +0 -10
- package/dist/lib/node-esm/blueprints/index.mjs +0 -32
- package/dist/lib/node-esm/blueprints/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-7UIZWCD4.mjs +0 -112
- package/dist/lib/node-esm/chunk-7UIZWCD4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-C3AE2NYJ.mjs +0 -181
- package/dist/lib/node-esm/chunk-C3AE2NYJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
- package/dist/lib/node-esm/chunk-KO3IOD2O.mjs +0 -19
- package/dist/lib/node-esm/chunk-KO3IOD2O.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MQK4R6GT.mjs +0 -245
- package/dist/lib/node-esm/chunk-MQK4R6GT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-O533NBMK.mjs +0 -37
- package/dist/lib/node-esm/chunk-O533NBMK.mjs.map +0 -7
- package/dist/lib/node-esm/components/index.mjs +0 -208
- package/dist/lib/node-esm/components/index.mjs.map +0 -7
- package/dist/lib/node-esm/create-A5QHNWRF.mjs +0 -22
- package/dist/lib/node-esm/create-A5QHNWRF.mjs.map +0 -7
- package/dist/lib/node-esm/hooks/index.mjs +0 -18
- package/dist/lib/node-esm/index.mjs +0 -474
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/open-OI24QNTO.mjs +0 -28
- package/dist/lib/node-esm/open-OI24QNTO.mjs.map +0 -7
- package/dist/lib/node-esm/operations/index.mjs +0 -14
- package/dist/lib/node-esm/operations/index.mjs.map +0 -7
- package/dist/lib/node-esm/summarize-3UNN24I2.mjs +0 -79
- package/dist/lib/node-esm/summarize-3UNN24I2.mjs.map +0 -7
- package/dist/lib/node-esm/types/index.mjs +0 -11
- package/dist/types/src/containers/TranscriptionContainer/TranscriptionContainer.d.ts +0 -6
- package/dist/types/src/containers/TranscriptionContainer/TranscriptionContainer.d.ts.map +0 -1
- package/dist/types/src/containers/TranscriptionContainer/index.d.ts +0 -2
- package/dist/types/src/containers/TranscriptionContainer/index.d.ts.map +0 -1
- package/dist/types/src/hooks/useQueueModelAdapter.d.ts +0 -8
- package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +0 -1
- package/dist/types/src/operations/definitions.d.ts.map +0 -1
- package/dist/types/src/stories/MicrophoneTranscription.stories.d.ts.map +0 -1
- package/dist/types/src/stories/useIsSpeaking.d.ts +0 -3
- package/dist/types/src/stories/useIsSpeaking.d.ts.map +0 -1
- package/dist/types/src/types/capabilities.d.ts +0 -19
- package/dist/types/src/types/capabilities.d.ts.map +0 -1
- package/dist/types/src/types/defs.d.ts +0 -5
- package/dist/types/src/types/defs.d.ts.map +0 -1
- package/src/containers/TranscriptionContainer/TranscriptionContainer.tsx +0 -35
- package/src/containers/TranscriptionContainer/index.ts +0 -5
- package/src/hooks/useQueueModelAdapter.ts +0 -66
- package/src/stories/MicrophoneTranscription.stories.tsx +0 -264
- package/src/stories/useIsSpeaking.tsx +0 -40
- package/src/types/capabilities.ts +0 -39
- package/src/types/defs.ts +0 -9
- /package/dist/lib/{browser/hooks → neutral/blueprints}/index.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
- /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/chunk-KAEXRX3Y.mjs +0 -0
- /package/dist/lib/{browser → neutral}/chunk-KAEXRX3Y.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/chunk-MLRJWAQH.mjs +0 -0
- /package/dist/lib/{browser → neutral}/chunk-MLRJWAQH.mjs.map +0 -0
- /package/dist/lib/{browser/types → neutral/hooks}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/hooks → neutral}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/meta.mjs.map} +0 -0
- /package/dist/lib/{node-esm/types → neutral/operations}/index.mjs.map +0 -0
|
@@ -1,474 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
useAudioFile,
|
|
4
|
-
useAudioTrack,
|
|
5
|
-
useQueueModelAdapter,
|
|
6
|
-
useTranscriber,
|
|
7
|
-
useVoiceInput
|
|
8
|
-
} from "./chunk-MQK4R6GT.mjs";
|
|
9
|
-
import "./chunk-C3AE2NYJ.mjs";
|
|
10
|
-
import {
|
|
11
|
-
TranscriptionCapabilities
|
|
12
|
-
} from "./chunk-KO3IOD2O.mjs";
|
|
13
|
-
import {
|
|
14
|
-
mergeFloat64Arrays
|
|
15
|
-
} from "./chunk-O533NBMK.mjs";
|
|
16
|
-
import "./chunk-HSLMI22Q.mjs";
|
|
17
|
-
|
|
18
|
-
// src/index.ts
|
|
19
|
-
import { Plugin } from "@dxos/app-framework";
|
|
20
|
-
|
|
21
|
-
// src/meta.ts
|
|
22
|
-
import { trim } from "@dxos/util";
|
|
23
|
-
var meta = {
|
|
24
|
-
id: "org.dxos.plugin.transcription",
|
|
25
|
-
name: "Transcription",
|
|
26
|
-
description: trim`
|
|
27
|
-
Real-time voice-to-text transcription service for capturing spoken content.
|
|
28
|
-
Convert audio input into searchable text that integrates seamlessly with notes and documents.
|
|
29
|
-
`,
|
|
30
|
-
icon: "ph--microphone--regular",
|
|
31
|
-
iconHue: "sky",
|
|
32
|
-
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-transcription",
|
|
33
|
-
tags: [
|
|
34
|
-
"labs"
|
|
35
|
-
],
|
|
36
|
-
screenshots: []
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
// src/transcriber/media-stream-recorder.ts
|
|
40
|
-
import { MediaRecorder, register } from "extendable-media-recorder";
|
|
41
|
-
import { WaveFile } from "wavefile";
|
|
42
|
-
import { synchronized } from "@dxos/async";
|
|
43
|
-
import { invariant } from "@dxos/invariant";
|
|
44
|
-
import { log } from "@dxos/log";
|
|
45
|
-
import { trace } from "@dxos/tracing";
|
|
46
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/transcriber/media-stream-recorder.ts";
|
|
47
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
48
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
49
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
50
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
51
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
52
|
-
}
|
|
53
|
-
var initializingPromise;
|
|
54
|
-
var initializeExtendableMediaRecorder = async () => {
|
|
55
|
-
const { connect } = await import("extendable-media-recorder-wav-encoder");
|
|
56
|
-
await register(await connect());
|
|
57
|
-
};
|
|
58
|
-
var MediaStreamRecorder = class {
|
|
59
|
-
_mediaStreamTrack;
|
|
60
|
-
/**
|
|
61
|
-
* Default MediaRecorder implementation do not support wav encoding.
|
|
62
|
-
*/
|
|
63
|
-
_config;
|
|
64
|
-
_mediaRecorder = void 0;
|
|
65
|
-
_header = void 0;
|
|
66
|
-
_onChunk;
|
|
67
|
-
constructor({ mediaStreamTrack, config }) {
|
|
68
|
-
this._mediaStreamTrack = mediaStreamTrack;
|
|
69
|
-
this._config = config;
|
|
70
|
-
}
|
|
71
|
-
get wavConfig() {
|
|
72
|
-
const settings = this._mediaStreamTrack.getSettings();
|
|
73
|
-
return {
|
|
74
|
-
channels: settings.channelCount ?? 1,
|
|
75
|
-
sampleRate: settings.sampleRate ?? 16e3,
|
|
76
|
-
bitDepthCode: settings.sampleSize ? String(settings.sampleSize) : "16"
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
get mediaStreamTrack() {
|
|
80
|
-
return this._mediaStreamTrack;
|
|
81
|
-
}
|
|
82
|
-
setOnChunk(onChunk) {
|
|
83
|
-
this._onChunk = onChunk;
|
|
84
|
-
}
|
|
85
|
-
async start() {
|
|
86
|
-
await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) => log.info("initializeExtendableMediaRecorder", {
|
|
87
|
-
err
|
|
88
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 48, S: this }));
|
|
89
|
-
if (!this._mediaRecorder) {
|
|
90
|
-
const stream = new MediaStream([
|
|
91
|
-
this._mediaStreamTrack
|
|
92
|
-
]);
|
|
93
|
-
this._mediaRecorder = new MediaRecorder(stream, {
|
|
94
|
-
mimeType: "audio/wav"
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
if (this._mediaRecorder.state === "recording") {
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
invariant(this._onChunk, "MediaStreamRecorder: onChunk is not set", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 62, S: this, A: ["this._onChunk", "'MediaStreamRecorder: onChunk is not set'"] });
|
|
101
|
-
this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);
|
|
102
|
-
this._mediaRecorder.start(this._config.interval);
|
|
103
|
-
}
|
|
104
|
-
async stop() {
|
|
105
|
-
if (this._mediaRecorder?.state !== "recording") {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
this._mediaRecorder.stop();
|
|
109
|
-
}
|
|
110
|
-
async _ondataavailable(event) {
|
|
111
|
-
const blob = event.data;
|
|
112
|
-
const uint8Array = new Uint8Array(await blob.arrayBuffer());
|
|
113
|
-
const isHeader = uint8Array[0] === 82 && // R
|
|
114
|
-
uint8Array[1] === 73 && // I
|
|
115
|
-
uint8Array[2] === 70 && // F
|
|
116
|
-
uint8Array[3] === 70;
|
|
117
|
-
let wav;
|
|
118
|
-
if (isHeader) {
|
|
119
|
-
wav = new WaveFile(uint8Array);
|
|
120
|
-
this._header = uint8Array.slice(0, 44);
|
|
121
|
-
} else if (this._header) {
|
|
122
|
-
wav = new WaveFile(new Uint8Array([
|
|
123
|
-
...this._header,
|
|
124
|
-
...uint8Array
|
|
125
|
-
]));
|
|
126
|
-
} else {
|
|
127
|
-
log.warn("MediaStreamRecorder: no header", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 90, S: this });
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
this._onChunk({
|
|
131
|
-
timestamp: Date.now(),
|
|
132
|
-
data: wav.getSamples()
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
_ts_decorate([
|
|
137
|
-
synchronized
|
|
138
|
-
], MediaStreamRecorder.prototype, "_ondataavailable", null);
|
|
139
|
-
MediaStreamRecorder = _ts_decorate([
|
|
140
|
-
trace.resource()
|
|
141
|
-
], MediaStreamRecorder);
|
|
142
|
-
|
|
143
|
-
// src/transcriber/transcriber.ts
|
|
144
|
-
import { WaveFile as WaveFile2 } from "wavefile";
|
|
145
|
-
import { DeferredTask, Trigger } from "@dxos/async";
|
|
146
|
-
import { LifecycleState, Resource } from "@dxos/context";
|
|
147
|
-
import { log as log2 } from "@dxos/log";
|
|
148
|
-
import { trace as trace2 } from "@dxos/tracing";
|
|
149
|
-
import { TRANSCRIPTION_URL } from "#types";
|
|
150
|
-
var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/transcriber/transcriber.ts";
|
|
151
|
-
function _ts_decorate2(decorators, target, key, desc) {
|
|
152
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
153
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
154
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
155
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
156
|
-
}
|
|
157
|
-
var Transcriber = class extends Resource {
|
|
158
|
-
_audioChunks = [];
|
|
159
|
-
_lastUsedTimestamp = 0;
|
|
160
|
-
_openTrigger = new Trigger({
|
|
161
|
-
autoReset: true
|
|
162
|
-
});
|
|
163
|
-
_config;
|
|
164
|
-
_recorder;
|
|
165
|
-
_onSegments;
|
|
166
|
-
_transcribeFn;
|
|
167
|
-
_recording = false;
|
|
168
|
-
_transcribeTask = void 0;
|
|
169
|
-
constructor({ config, recorder, onSegments, transcribe }) {
|
|
170
|
-
super();
|
|
171
|
-
this._config = config;
|
|
172
|
-
this._recorder = recorder;
|
|
173
|
-
this._onSegments = onSegments;
|
|
174
|
-
this._transcribeFn = transcribe;
|
|
175
|
-
}
|
|
176
|
-
async _open(ctx) {
|
|
177
|
-
log2.info("opening", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 41, S: this });
|
|
178
|
-
this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));
|
|
179
|
-
await this._recorder.start();
|
|
180
|
-
this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());
|
|
181
|
-
this._openTrigger.wake();
|
|
182
|
-
}
|
|
183
|
-
async _close() {
|
|
184
|
-
log2.info("closing", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 48, S: this });
|
|
185
|
-
this._recording = false;
|
|
186
|
-
this._transcribeTask = void 0;
|
|
187
|
-
await this._recorder.stop();
|
|
188
|
-
}
|
|
189
|
-
startChunksRecording() {
|
|
190
|
-
log2.info("starting", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 54, S: this });
|
|
191
|
-
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
this._recording = true;
|
|
195
|
-
}
|
|
196
|
-
stopChunksRecording() {
|
|
197
|
-
if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
this._recording = false;
|
|
201
|
-
this._transcribeTask?.schedule();
|
|
202
|
-
log2.info("stopped", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 66, S: this });
|
|
203
|
-
}
|
|
204
|
-
_saveAudioChunk(chunk) {
|
|
205
|
-
log2("saving audio chunk", {
|
|
206
|
-
chunk
|
|
207
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 69, S: this });
|
|
208
|
-
this._audioChunks.push(chunk);
|
|
209
|
-
if (!this._recording && (!this._transcribeTask || !this._transcribeTask.scheduled) && this._audioChunks.length >= this._config.prefixBufferChunksAmount) {
|
|
210
|
-
this._audioChunks = this._dropOldChunks();
|
|
211
|
-
} else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {
|
|
212
|
-
this._transcribeTask?.schedule();
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
async _transcribe() {
|
|
216
|
-
log2("transcribing", {
|
|
217
|
-
chunks: this._audioChunks.length
|
|
218
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 81, S: this });
|
|
219
|
-
const chunks = this._audioChunks;
|
|
220
|
-
this._audioChunks = this._dropOldChunks();
|
|
221
|
-
if (chunks.length === 0) {
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
const audio = await this._mergeAudioChunks(chunks);
|
|
225
|
-
const segments = await this._fetchTranscription(audio);
|
|
226
|
-
if (!Array.isArray(segments) || segments.length === 0) {
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
const alignedSegments = this._alignSegments(segments, chunks);
|
|
230
|
-
if (alignedSegments.length > 0) {
|
|
231
|
-
await this._onSegments(alignedSegments);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
_dropOldChunks() {
|
|
235
|
-
return this._config.prefixBufferChunksAmount > 0 ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount) : [];
|
|
236
|
-
}
|
|
237
|
-
async _mergeAudioChunks(chunks) {
|
|
238
|
-
const file = new WaveFile2();
|
|
239
|
-
const wavConfig = this._recorder.wavConfig;
|
|
240
|
-
file.fromScratch(wavConfig.channels, wavConfig.sampleRate, wavConfig.bitDepthCode, mergeFloat64Arrays(chunks.map(({ data }) => data)));
|
|
241
|
-
return file.toBase64();
|
|
242
|
-
}
|
|
243
|
-
async _fetchTranscription(audio) {
|
|
244
|
-
if (audio.length === 0) {
|
|
245
|
-
throw new Error("No audio to send for transcribing");
|
|
246
|
-
}
|
|
247
|
-
let segments;
|
|
248
|
-
if (this._transcribeFn) {
|
|
249
|
-
segments = await this._transcribeFn(audio);
|
|
250
|
-
} else {
|
|
251
|
-
const endpoint = this._config.endpoint ?? TRANSCRIPTION_URL;
|
|
252
|
-
const response = await fetch(`${endpoint}/transcribe`, {
|
|
253
|
-
method: "POST",
|
|
254
|
-
body: JSON.stringify({
|
|
255
|
-
audio
|
|
256
|
-
}),
|
|
257
|
-
headers: {
|
|
258
|
-
"Content-Type": "application/json"
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
if (!response.ok) {
|
|
262
|
-
throw new Error(`Transcription failed: ${response.statusText}`);
|
|
263
|
-
}
|
|
264
|
-
({ segments } = await response.json());
|
|
265
|
-
}
|
|
266
|
-
if (!Array.isArray(segments)) {
|
|
267
|
-
throw new Error("Transcription response payload is invalid");
|
|
268
|
-
}
|
|
269
|
-
log2.info("transcription response", {
|
|
270
|
-
segments: segments.length
|
|
271
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 134, S: this });
|
|
272
|
-
return segments;
|
|
273
|
-
}
|
|
274
|
-
_alignSegments(segments, originalChunks) {
|
|
275
|
-
const result = alignWhisperSegments(segments, originalChunks, this._lastUsedTimestamp);
|
|
276
|
-
if (result.lastUsedTimestamp !== void 0) {
|
|
277
|
-
this._lastUsedTimestamp = result.lastUsedTimestamp;
|
|
278
|
-
}
|
|
279
|
-
return result.transcripts;
|
|
280
|
-
}
|
|
281
|
-
};
|
|
282
|
-
_ts_decorate2([
|
|
283
|
-
trace2.span({
|
|
284
|
-
showInBrowserTimeline: true
|
|
285
|
-
})
|
|
286
|
-
], Transcriber.prototype, "_mergeAudioChunks", null);
|
|
287
|
-
_ts_decorate2([
|
|
288
|
-
trace2.span({
|
|
289
|
-
showInBrowserTimeline: true
|
|
290
|
-
})
|
|
291
|
-
], Transcriber.prototype, "_fetchTranscription", null);
|
|
292
|
-
var alignWhisperSegments = (segments, originalChunks, lastUsedTimestamp) => {
|
|
293
|
-
if (originalChunks.length === 0) {
|
|
294
|
-
return {
|
|
295
|
-
transcripts: []
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
const zeroTimestamp = originalChunks[0].timestamp;
|
|
299
|
-
const filteredSegments = segments.filter((segment) => zeroTimestamp + segment.end * 1e3 >= lastUsedTimestamp).map((segment) => {
|
|
300
|
-
const words = segment.words.filter((word) => zeroTimestamp + word.start * 1e3 >= lastUsedTimestamp);
|
|
301
|
-
return {
|
|
302
|
-
...segment,
|
|
303
|
-
words,
|
|
304
|
-
text: words.map((word) => word.word).join(""),
|
|
305
|
-
start: words.at(0)?.start ?? segment.end
|
|
306
|
-
};
|
|
307
|
-
}).filter((segment) => segment.words.length > 0);
|
|
308
|
-
if (filteredSegments.length === 0) {
|
|
309
|
-
return {
|
|
310
|
-
transcripts: []
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
return {
|
|
314
|
-
transcripts: filteredSegments.map((segment) => ({
|
|
315
|
-
_tag: "transcript",
|
|
316
|
-
started: new Date(zeroTimestamp + segment.start * 1e3).toISOString(),
|
|
317
|
-
text: segment.text.trim()
|
|
318
|
-
})),
|
|
319
|
-
lastUsedTimestamp: zeroTimestamp + filteredSegments.at(-1).end * 1e3
|
|
320
|
-
};
|
|
321
|
-
};
|
|
322
|
-
|
|
323
|
-
// src/transcriber/transcription-manager.ts
|
|
324
|
-
import { Atom } from "@effect-atom/atom-react";
|
|
325
|
-
import { synchronized as synchronized2 } from "@dxos/async";
|
|
326
|
-
import { Resource as Resource2 } from "@dxos/context";
|
|
327
|
-
import { Obj } from "@dxos/echo";
|
|
328
|
-
import { Message } from "@dxos/types";
|
|
329
|
-
function _ts_decorate3(decorators, target, key, desc) {
|
|
330
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
331
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
332
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
333
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
334
|
-
}
|
|
335
|
-
var RECORD_INTERVAL = 200;
|
|
336
|
-
var PREFIXED_CHUNKS_AMOUNT = 10;
|
|
337
|
-
var TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;
|
|
338
|
-
var TranscriptionManager = class extends Resource2 {
|
|
339
|
-
_edgeClient;
|
|
340
|
-
_messageEnricher;
|
|
341
|
-
_registry;
|
|
342
|
-
_audioStreamTrack = void 0;
|
|
343
|
-
_identityDid = void 0;
|
|
344
|
-
_mediaRecorder = void 0;
|
|
345
|
-
_transcriber = void 0;
|
|
346
|
-
_queue = void 0;
|
|
347
|
-
_enabledAtom = Atom.make(false);
|
|
348
|
-
constructor(options) {
|
|
349
|
-
super();
|
|
350
|
-
this._edgeClient = options.edgeClient;
|
|
351
|
-
this._messageEnricher = options.messageEnricher;
|
|
352
|
-
this._registry = options.registry;
|
|
353
|
-
}
|
|
354
|
-
get enabled() {
|
|
355
|
-
return this._enabledAtom;
|
|
356
|
-
}
|
|
357
|
-
getEnabled() {
|
|
358
|
-
return this._registry.get(this._enabledAtom);
|
|
359
|
-
}
|
|
360
|
-
setQueue(queue) {
|
|
361
|
-
this._queue = queue;
|
|
362
|
-
return this;
|
|
363
|
-
}
|
|
364
|
-
setIdentityDid(did) {
|
|
365
|
-
if (this._identityDid !== did) {
|
|
366
|
-
this._identityDid = did;
|
|
367
|
-
}
|
|
368
|
-
return this;
|
|
369
|
-
}
|
|
370
|
-
setRecording(recording) {
|
|
371
|
-
if (!this.isOpen || !this.getEnabled()) {
|
|
372
|
-
return this;
|
|
373
|
-
}
|
|
374
|
-
if (recording) {
|
|
375
|
-
this._transcriber?.startChunksRecording();
|
|
376
|
-
} else {
|
|
377
|
-
this._transcriber?.stopChunksRecording();
|
|
378
|
-
}
|
|
379
|
-
return this;
|
|
380
|
-
}
|
|
381
|
-
async setEnabled(enabled) {
|
|
382
|
-
if (this.getEnabled() === enabled) {
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
this._registry.set(this._enabledAtom, enabled ?? false);
|
|
386
|
-
if (enabled) {
|
|
387
|
-
await this._maybeRestartTranscriber();
|
|
388
|
-
} else {
|
|
389
|
-
await this._stopTranscriber();
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
async setAudioTrack(track) {
|
|
393
|
-
if (this._audioStreamTrack === track) {
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
this._audioStreamTrack = track;
|
|
397
|
-
await this._maybeRestartTranscriber();
|
|
398
|
-
}
|
|
399
|
-
async _open() {
|
|
400
|
-
await this._maybeRestartTranscriber();
|
|
401
|
-
}
|
|
402
|
-
async _close() {
|
|
403
|
-
await this._stopTranscriber();
|
|
404
|
-
}
|
|
405
|
-
async _maybeRestartTranscriber() {
|
|
406
|
-
if (!this._audioStreamTrack || !this.getEnabled() || !this.isOpen) {
|
|
407
|
-
return;
|
|
408
|
-
}
|
|
409
|
-
let needReinit = false;
|
|
410
|
-
if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {
|
|
411
|
-
this._mediaRecorder = new MediaStreamRecorder({
|
|
412
|
-
mediaStreamTrack: this._audioStreamTrack,
|
|
413
|
-
config: {
|
|
414
|
-
interval: RECORD_INTERVAL
|
|
415
|
-
}
|
|
416
|
-
});
|
|
417
|
-
needReinit = true;
|
|
418
|
-
}
|
|
419
|
-
if (needReinit) {
|
|
420
|
-
await this._transcriber?.close();
|
|
421
|
-
this._transcriber = new Transcriber({
|
|
422
|
-
config: {
|
|
423
|
-
transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,
|
|
424
|
-
prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT
|
|
425
|
-
},
|
|
426
|
-
recorder: this._mediaRecorder,
|
|
427
|
-
onSegments: (segments) => this._onSegments(segments)
|
|
428
|
-
});
|
|
429
|
-
await this._transcriber?.open();
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
async _stopTranscriber() {
|
|
433
|
-
await this._transcriber?.close();
|
|
434
|
-
}
|
|
435
|
-
async _onSegments(segments) {
|
|
436
|
-
if (!this.isOpen || !this._queue) {
|
|
437
|
-
return;
|
|
438
|
-
}
|
|
439
|
-
let block = Obj.make(Message.Message, {
|
|
440
|
-
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
441
|
-
blocks: segments,
|
|
442
|
-
sender: {
|
|
443
|
-
identityDid: this._identityDid
|
|
444
|
-
}
|
|
445
|
-
});
|
|
446
|
-
if (this._messageEnricher) {
|
|
447
|
-
block = await this._messageEnricher(block);
|
|
448
|
-
}
|
|
449
|
-
await this._queue.append([
|
|
450
|
-
block
|
|
451
|
-
]);
|
|
452
|
-
}
|
|
453
|
-
};
|
|
454
|
-
_ts_decorate3([
|
|
455
|
-
synchronized2
|
|
456
|
-
], TranscriptionManager.prototype, "setAudioTrack", null);
|
|
457
|
-
|
|
458
|
-
// src/index.ts
|
|
459
|
-
var TranscriptionPlugin = Plugin.lazy(meta, () => import("#plugin"));
|
|
460
|
-
export {
|
|
461
|
-
MediaStreamRecorder,
|
|
462
|
-
Transcriber,
|
|
463
|
-
TranscriptionCapabilities,
|
|
464
|
-
TranscriptionManager,
|
|
465
|
-
TranscriptionPlugin,
|
|
466
|
-
alignWhisperSegments,
|
|
467
|
-
meta,
|
|
468
|
-
useAudioFile,
|
|
469
|
-
useAudioTrack,
|
|
470
|
-
useQueueModelAdapter,
|
|
471
|
-
useTranscriber,
|
|
472
|
-
useVoiceInput
|
|
473
|
-
};
|
|
474
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/index.ts", "../../../src/meta.ts", "../../../src/transcriber/media-stream-recorder.ts", "../../../src/transcriber/transcriber.ts", "../../../src/transcriber/transcription-manager.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport { meta } from './meta';\n\nexport const TranscriptionPlugin = Plugin.lazy(meta, () => import('#plugin'));\n\nexport { TranscriptionCapabilities } from './types';\n\n// TODO(wittjosiah): Hooks should not be exported from the plugin package at all.\n// Either refactor callers to not need them or factor them out to a shared package.\nexport * from './meta';\nexport * from './hooks';\nexport * from './transcriber';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: Plugin.Meta = {\n id: 'org.dxos.plugin.transcription',\n name: 'Transcription',\n description: trim`\n Real-time voice-to-text transcription service for capturing spoken content.\n Convert audio input into searchable text that integrates seamlessly with notes and documents.\n `,\n icon: 'ph--microphone--regular',\n iconHue: 'sky',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-transcription',\n tags: ['labs'],\n screenshots: [],\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 AudioChunk, type AudioRecorder, type WavConfig } 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\nexport type MediaStreamRecorderProps = {\n mediaStreamTrack: MediaStreamTrack;\n config: {\n interval: number;\n };\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 _config: MediaStreamRecorderProps['config'];\n private _mediaRecorder?: IMediaRecorder = undefined;\n private _header?: Uint8Array = undefined;\n private _onChunk?: (chunk: AudioChunk) => void;\n\n constructor({ mediaStreamTrack, config }: MediaStreamRecorderProps) {\n this._mediaStreamTrack = mediaStreamTrack;\n this._config = config;\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 get mediaStreamTrack() {\n return this._mediaStreamTrack;\n }\n\n setOnChunk(onChunk: (chunk: AudioChunk) => void): void {\n this._onChunk = onChunk;\n }\n\n async start(): Promise<void> {\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._config.interval);\n }\n\n async stop(): Promise<void> {\n if (this._mediaRecorder?.state !== 'recording') {\n return;\n }\n this._mediaRecorder.stop();\n }\n\n @synchronized\n private async _ondataavailable(event: IBlobEvent): Promise<void> {\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';\nimport { type ContentBlock } from '@dxos/types';\n\nimport { TRANSCRIPTION_URL } from '#types';\n\nimport { mergeFloat64Arrays } from '../util';\nimport { type AudioChunk, type AudioRecorder } from './audio-recorder';\n\nexport type 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\nexport type 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 /**\n * Override the transcription endpoint base URL.\n * Defaults to the DXOS calls service.\n */\n endpoint?: string;\n};\n\n/**\n * Function that converts a base64-encoded WAV payload into Whisper segments.\n * Allows callers to swap in alternative providers or mock the transport.\n */\nexport type TranscribeFn = (audio: string) => Promise<WhisperSegment[]>;\n\nexport type TranscriberProps = {\n config: TranscribeConfig;\n recorder: AudioRecorder;\n /**\n * Callback to handle the transcribed segments, after all segment transformers are applied.\n * @param segments - The transcribed segments.\n */\n onSegments: (segments: ContentBlock.Transcript[]) => Promise<void>;\n /**\n * Optional override of the transcription transport. When provided, supersedes `config.endpoint`.\n */\n transcribe?: TranscribeFn;\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: TranscriberProps['onSegments'];\n private readonly _transcribeFn?: TranscribeFn;\n\n private _recording = false;\n private _transcribeTask?: DeferredTask = undefined;\n\n constructor({ config, recorder, onSegments, transcribe }: TranscriberProps) {\n super();\n this._config = config;\n this._recorder = recorder;\n this._onSegments = onSegments;\n this._transcribeFn = transcribe;\n }\n\n protected override async _open(ctx: Context): Promise<void> {\n log.info('opening');\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(): Promise<void> {\n log.info('closing');\n this._recording = false;\n this._transcribeTask = undefined;\n await this._recorder.stop();\n }\n\n startChunksRecording(): void {\n log.info('starting');\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n\n this._recording = true;\n }\n\n stopChunksRecording(): void {\n if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {\n return;\n }\n\n this._recording = false;\n this._transcribeTask?.schedule();\n log.info('stopped');\n }\n\n private _saveAudioChunk(chunk: AudioChunk): void {\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(): Promise<void> {\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(): AudioChunk[] {\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[]): Promise<string> {\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): Promise<WhisperSegment[]> {\n if (audio.length === 0) {\n throw new Error('No audio to send for transcribing');\n }\n\n let segments: unknown;\n if (this._transcribeFn) {\n segments = await this._transcribeFn(audio);\n } else {\n const endpoint = this._config.endpoint ?? TRANSCRIPTION_URL;\n const response = await fetch(`${endpoint}/transcribe`, {\n method: 'POST',\n body: JSON.stringify({ audio }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Transcription failed: ${response.statusText}`);\n }\n\n ({ segments } = (await response.json()) as { segments?: unknown });\n }\n\n if (!Array.isArray(segments)) {\n throw new Error('Transcription response payload is invalid');\n }\n\n log.info('transcription response', { segments: segments.length });\n\n return segments as WhisperSegment[];\n }\n\n private _alignSegments(segments: WhisperSegment[], originalChunks: AudioChunk[]): ContentBlock.Transcript[] {\n const result = alignWhisperSegments(segments, originalChunks, this._lastUsedTimestamp);\n if (result.lastUsedTimestamp !== undefined) {\n this._lastUsedTimestamp = result.lastUsedTimestamp;\n }\n return result.transcripts;\n }\n}\n\n/**\n * Pure helper that filters and absolute-timestamps Whisper segments against a chunk timeline.\n * Exported for testing.\n *\n * @param segments - Raw segments returned by the Whisper service for `originalChunks`.\n * @param originalChunks - Chunks fed into the transcription request (used for the zero timestamp).\n * @param lastUsedTimestamp - Most recent absolute timestamp already emitted; segments whose end\n * falls strictly before this point are deduped out, as are individual words whose start does.\n */\nexport const alignWhisperSegments = (\n segments: WhisperSegment[],\n originalChunks: AudioChunk[],\n lastUsedTimestamp: number,\n): { transcripts: ContentBlock.Transcript[]; lastUsedTimestamp?: number } => {\n if (originalChunks.length === 0) {\n return { transcripts: [] };\n }\n\n const zeroTimestamp = originalChunks[0].timestamp;\n\n const filteredSegments = segments\n .filter((segment) => zeroTimestamp + segment.end * 1_000 >= lastUsedTimestamp)\n .map((segment) => {\n const words = segment.words.filter((word) => zeroTimestamp + word.start * 1_000 >= 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 { transcripts: [] };\n }\n\n return {\n transcripts: filteredSegments.map((segment) => ({\n _tag: 'transcript',\n started: new Date(zeroTimestamp + segment.start * 1_000).toISOString(),\n text: segment.text.trim(),\n })),\n lastUsedTimestamp: zeroTimestamp + filteredSegments.at(-1)!.end * 1_000,\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\n\nimport { synchronized } from '@dxos/async';\nimport { Resource } from '@dxos/context';\nimport { Obj } from '@dxos/echo';\nimport { type Queue } from '@dxos/echo-db';\nimport { type EdgeHttpClient } from '@dxos/react-edge-client';\nimport { type ContentBlock, Message } from '@dxos/types';\n\nimport { MediaStreamRecorder } from './media-stream-recorder';\nimport { Transcriber } from './transcriber';\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 TranscriptMessageEnricher = (message: Message.Message) => Promise<Message.Message>;\n\nexport type TranscriptionManagerOptions = {\n edgeClient: EdgeHttpClient;\n registry: Registry.Registry;\n\n /**\n * Enrich the message before it is written to the transcription queue.\n */\n messageEnricher?: TranscriptMessageEnricher;\n};\n\n/**\n * Manages transcription state for a meeting.\n */\nexport class TranscriptionManager extends Resource {\n private readonly _edgeClient: EdgeHttpClient;\n private readonly _messageEnricher?: TranscriptMessageEnricher;\n private readonly _registry: Registry.Registry;\n private _audioStreamTrack?: MediaStreamTrack = undefined;\n private _identityDid?: string = undefined;\n private _mediaRecorder?: MediaStreamRecorder = undefined;\n private _transcriber?: Transcriber = undefined;\n private _queue?: Queue<Message.Message> = undefined;\n private _enabledAtom = Atom.make(false);\n\n constructor(options: TranscriptionManagerOptions) {\n super();\n this._edgeClient = options.edgeClient;\n this._messageEnricher = options.messageEnricher;\n this._registry = options.registry;\n }\n\n get enabled(): Atom.Atom<boolean> {\n return this._enabledAtom;\n }\n\n getEnabled(): boolean {\n return this._registry.get(this._enabledAtom);\n }\n\n setQueue(queue: Queue<Message.Message>): this {\n this._queue = queue;\n return this;\n }\n\n setIdentityDid(did: string): this {\n if (this._identityDid !== did) {\n this._identityDid = did;\n }\n return this;\n }\n\n setRecording(recording?: boolean): this {\n if (!this.isOpen || !this.getEnabled()) {\n return this;\n }\n\n if (recording) {\n this._transcriber?.startChunksRecording();\n } else {\n this._transcriber?.stopChunksRecording();\n }\n return this;\n }\n\n async setEnabled(enabled: boolean): Promise<void> {\n if (this.getEnabled() === enabled) {\n return;\n }\n\n this._registry.set(this._enabledAtom, enabled ?? false);\n if (enabled) {\n await this._maybeRestartTranscriber();\n } else {\n await this._stopTranscriber();\n }\n }\n\n @synchronized\n async setAudioTrack(track?: MediaStreamTrack): Promise<void> {\n if (this._audioStreamTrack === track) {\n return;\n }\n\n this._audioStreamTrack = track;\n await this._maybeRestartTranscriber();\n }\n\n protected override async _open(): Promise<void> {\n await this._maybeRestartTranscriber();\n }\n\n protected override async _close(): Promise<void> {\n await this._stopTranscriber();\n }\n\n private async _maybeRestartTranscriber(): Promise<void> {\n if (!this._audioStreamTrack || !this.getEnabled() || !this.isOpen) {\n return;\n }\n\n // Reinitialize transcriber if queue or media stream track has changed.\n let needReinit = false;\n if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {\n this._mediaRecorder = new MediaStreamRecorder({\n mediaStreamTrack: this._audioStreamTrack,\n config: { interval: RECORD_INTERVAL },\n });\n needReinit = true;\n }\n if (needReinit) {\n await this._transcriber?.close();\n this._transcriber = new Transcriber({\n config: {\n transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,\n prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,\n },\n recorder: this._mediaRecorder,\n onSegments: (segments) => this._onSegments(segments),\n });\n\n await this._transcriber?.open();\n }\n }\n\n private async _stopTranscriber(): Promise<void> {\n await this._transcriber?.close();\n }\n\n private async _onSegments(segments: ContentBlock.Transcript[]): Promise<void> {\n if (!this.isOpen || !this._queue) {\n return;\n }\n\n let block = Obj.make(Message.Message, {\n created: new Date().toISOString(),\n blocks: segments,\n sender: { identityDid: this._identityDid },\n });\n\n if (this._messageEnricher) {\n block = await this._messageEnricher(block);\n }\n\n await this._queue.append([block]);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Plugin", "trim", "meta", "id", "name", "description", "icon", "iconHue", "source", "tags", "screenshots", "WaveFile", "synchronized", "invariant", "log", "trace", "initializingPromise", "register", "connect", "_mediaStreamTrack", "_mediaRecorder", "_header", "undefined", "_onChunk", "mediaStreamTrack", "_config", "config", "settings", "channels", "sampleRate", "bitDepthCode", "setOnChunk", "onChunk", "err", "stream", "MediaStream", "mimeType", "ondataavailable", "_ondataavailable", "event", "start", "interval", "data", "uint8Array", "wav", "isHeader", "slice", "timestamp", "getSamples", "resource", "DeferredTask", "Trigger", "LifecycleState", "log", "trace", "TRANSCRIPTION_URL", "mergeFloat64Arrays", "__dxlog_file", "_audioChunks", "_lastUsedTimestamp", "_openTrigger", "Trigger", "_config", "_recorder", "_onSegments", "_transcribeFn", "_recording", "_transcribeTask", "config", "log", "setOnChunk", "chunk", "_saveAudioChunk", "DeferredTask", "stop", "startChunksRecording", "_lifecycleState", "LifecycleState", "stopChunksRecording", "info", "_dropOldChunks", "length", "schedule", "chunks", "segments", "_fetchTranscription", "audio", "Array", "isArray", "alignedSegments", "WaveFile", "wavConfig", "file", "fromScratch", "channels", "toBase64", "response", "method", "body", "JSON", "headers", "Error", "_alignSegments", "result", "alignWhisperSegments", "lastUsedTimestamp", "undefined", "span", "showInBrowserTimeline", "originalChunks", "transcripts", "filteredSegments", "filter", "segment", "word", "zeroTimestamp", "start", "words", "text", "_tag", "started", "Atom", "synchronized", "Resource", "Obj", "Message", "RECORD_INTERVAL", "PREFIXED_CHUNKS_AMOUNT", "TRANSCRIBE_AFTER_CHUNKS_AMOUNT", "TranscriptionManager", "Resource", "_edgeClient", "_messageEnricher", "_registry", "_audioStreamTrack", "undefined", "_identityDid", "_mediaRecorder", "_transcriber", "_queue", "_enabledAtom", "Atom", "make", "options", "edgeClient", "messageEnricher", "registry", "enabled", "getEnabled", "get", "setQueue", "queue", "setIdentityDid", "did", "setRecording", "recording", "isOpen", "startChunksRecording", "stopChunksRecording", "setEnabled", "set", "_maybeRestartTranscriber", "_stopTranscriber", "setAudioTrack", "track", "_open", "_close", "needReinit", "mediaStreamTrack", "MediaStreamRecorder", "config", "interval", "close", "Transcriber", "transcribeAfterChunksAmount", "prefixBufferChunksAmount", "recorder", "onSegments", "segments", "_onSegments", "open", "block", "Obj", "Message", "created", "Date", "toISOString", "blocks", "sender", "identityDid", "append", "TranscriptionPlugin", "Plugin", "lazy", "meta"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"inputs":{"src/meta.ts":{"bytes":1977,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/types/capabilities.ts":{"bytes":2707,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true}],"format":"esm"},"src/types/defs.ts":{"bytes":748,"imports":[],"format":"esm"},"src/types/index.ts":{"bytes":468,"imports":[{"path":"src/types/capabilities.ts","kind":"import-statement","original":"./capabilities"},{"path":"src/types/defs.ts","kind":"import-statement","original":"./defs"}],"format":"esm"},"src/hooks/useAudioFile.ts":{"bytes":9101,"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}],"format":"esm"},"src/hooks/useAudioTrack.ts":{"bytes":3098,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/model/model.ts":{"bytes":23206,"imports":[{"path":"@codemirror/state","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}],"format":"esm"},"src/model/index.ts":{"bytes":369,"imports":[{"path":"src/model/model.ts","kind":"import-statement","original":"./model"}],"format":"esm"},"src/hooks/useQueueModelAdapter.ts":{"bytes":5439,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"src/model/index.ts","kind":"import-statement","original":"../model"}],"format":"esm"},"src/hooks/useTranscriber.ts":{"bytes":4042,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework/ui","kind":"import-statement","external":true},{"path":"#types","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useVoiceInput.ts":{"bytes":6891,"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":"src/hooks/useAudioTrack.ts","kind":"import-statement","original":"./useAudioTrack"},{"path":"src/hooks/useTranscriber.ts","kind":"import-statement","original":"./useTranscriber"}],"format":"esm"},"src/hooks/index.ts":{"bytes":816,"imports":[{"path":"src/hooks/useAudioFile.ts","kind":"import-statement","original":"./useAudioFile"},{"path":"src/hooks/useAudioTrack.ts","kind":"import-statement","original":"./useAudioTrack"},{"path":"src/hooks/useQueueModelAdapter.ts","kind":"import-statement","original":"./useQueueModelAdapter"},{"path":"src/hooks/useTranscriber.ts","kind":"import-statement","original":"./useTranscriber"},{"path":"src/hooks/useVoiceInput.ts","kind":"import-statement","original":"./useVoiceInput"}],"format":"esm"},"src/transcriber/audio-recorder.ts":{"bytes":3065,"imports":[],"format":"esm"},"src/transcriber/media-stream-recorder.ts":{"bytes":13053,"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"},"src/util/array.ts":{"bytes":1437,"imports":[],"format":"esm"},"src/util/get-time-str.ts":{"bytes":1188,"imports":[],"format":"esm"},"src/util/monitor-audio-level.ts":{"bytes":5778,"imports":[],"format":"esm"},"src/util/render-byline.ts":{"bytes":4334,"imports":[],"format":"esm"},"src/util/index.ts":{"bytes":689,"imports":[{"path":"src/util/array.ts","kind":"import-statement","original":"./array"},{"path":"src/util/get-time-str.ts","kind":"import-statement","original":"./get-time-str"},{"path":"src/util/monitor-audio-level.ts","kind":"import-statement","original":"./monitor-audio-level"},{"path":"src/util/render-byline.ts","kind":"import-statement","original":"./render-byline"}],"format":"esm"},"src/transcriber/transcriber.ts":{"bytes":28403,"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":"#types","kind":"import-statement","external":true},{"path":"src/util/index.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"src/transcriber/transcription-manager.ts":{"bytes":16699,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/types","kind":"import-statement","external":true},{"path":"src/transcriber/media-stream-recorder.ts","kind":"import-statement","original":"./media-stream-recorder"},{"path":"src/transcriber/transcriber.ts","kind":"import-statement","original":"./transcriber"}],"format":"esm"},"src/transcriber/index.ts":{"bytes":731,"imports":[{"path":"src/transcriber/audio-recorder.ts","kind":"import-statement","original":"./audio-recorder"},{"path":"src/transcriber/media-stream-recorder.ts","kind":"import-statement","original":"./media-stream-recorder"},{"path":"src/transcriber/transcriber.ts","kind":"import-statement","original":"./transcriber"},{"path":"src/transcriber/transcription-manager.ts","kind":"import-statement","original":"./transcription-manager"}],"format":"esm"},"src/index.ts":{"bytes":1775,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"src/types/index.ts","kind":"import-statement","original":"./types"},{"path":"src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"src/transcriber/index.ts","kind":"import-statement","original":"./transcriber"},{"path":"#plugin","kind":"dynamic-import","external":true}],"format":"esm"},"src/blueprints/transcription-blueprint.ts":{"bytes":2671,"imports":[{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"#operations","kind":"import-statement","external":true}],"format":"esm"},"src/blueprints/index.ts":{"bytes":567,"imports":[{"path":"src/blueprints/transcription-blueprint.ts","kind":"import-statement","original":"./transcription-blueprint"}],"format":"esm"},"src/components/Transcription/transcription-extension.ts":{"bytes":21377,"imports":[{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"date-fns/format","kind":"import-statement","external":true},{"path":"date-fns/intervalToDuration","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"src/model/index.ts","kind":"import-statement","original":"../../model"}],"format":"esm"},"src/components/Transcription/Transcription.tsx":{"bytes":6491,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/util/index.ts","kind":"import-statement","original":"../../util"},{"path":"src/components/Transcription/transcription-extension.ts","kind":"import-statement","original":"./transcription-extension"}],"format":"esm"},"src/components/Transcription/index.ts":{"bytes":389,"imports":[{"path":"src/components/Transcription/Transcription.tsx","kind":"import-statement","original":"./Transcription"}],"format":"esm"},"src/components/index.ts":{"bytes":389,"imports":[{"path":"src/components/Transcription/index.ts","kind":"import-statement","original":"./Transcription"}],"format":"esm"},"src/operations/definitions.ts":{"bytes":10490,"imports":[{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"@dxos/ai","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/types","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true}],"format":"esm"},"src/operations/create.ts":{"bytes":2095,"imports":[{"path":"effect/Effect","kind":"import-statement","external":true},{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/types","kind":"import-statement","external":true},{"path":"src/operations/definitions.ts","kind":"import-statement","original":"./definitions"}],"format":"esm"},"src/operations/open.ts":{"bytes":3191,"imports":[{"path":"effect/Effect","kind":"import-statement","external":true},{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/types","kind":"import-statement","external":true},{"path":"src/util/index.ts","kind":"import-statement","original":"../util"},{"path":"src/operations/definitions.ts","kind":"import-statement","original":"./definitions"}],"format":"esm"},"src/operations/summarize.ts":{"bytes":11563,"imports":[{"path":"effect/Array","kind":"import-statement","external":true},{"path":"effect/Effect","kind":"import-statement","external":true},{"path":"effect/Function","kind":"import-statement","external":true},{"path":"effect/Layer","kind":"import-statement","external":true},{"path":"effect/Option","kind":"import-statement","external":true},{"path":"@dxos/ai","kind":"import-statement","external":true},{"path":"@dxos/assistant","kind":"import-statement","external":true},{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/operations/definitions.ts","kind":"import-statement","original":"./definitions"}],"format":"esm"},"src/operations/index.ts":{"bytes":1258,"imports":[{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"src/operations/definitions.ts","kind":"import-statement","original":"./definitions"},{"path":"src/operations/create.ts","kind":"dynamic-import","original":"./create"},{"path":"src/operations/open.ts","kind":"dynamic-import","original":"./open"},{"path":"src/operations/summarize.ts","kind":"dynamic-import","original":"./summarize"}],"format":"esm"}},"outputs":{"dist/lib/node-esm/summarize-3UNN24I2.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":6031},"dist/lib/node-esm/summarize-3UNN24I2.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-7UIZWCD4.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-HSLMI22Q.mjs","kind":"import-statement"},{"path":"effect/Array","kind":"import-statement","external":true},{"path":"effect/Effect","kind":"import-statement","external":true},{"path":"effect/Function","kind":"import-statement","external":true},{"path":"effect/Layer","kind":"import-statement","external":true},{"path":"effect/Option","kind":"import-statement","external":true},{"path":"@dxos/ai","kind":"import-statement","external":true},{"path":"@dxos/assistant","kind":"import-statement","external":true},{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"src/operations/summarize.ts","inputs":{"src/operations/summarize.ts":{"bytesInOutput":3157}},"bytes":3455},"dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":29981},"dist/lib/node-esm/index.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-MQK4R6GT.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-C3AE2NYJ.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-KO3IOD2O.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-O533NBMK.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-HSLMI22Q.mjs","kind":"import-statement"},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/util","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":"#types","kind":"import-statement","external":true},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/types","kind":"import-statement","external":true},{"path":"#plugin","kind":"dynamic-import","external":true}],"exports":["MediaStreamRecorder","Transcriber","TranscriptionCapabilities","TranscriptionManager","TranscriptionPlugin","alignWhisperSegments","meta","useAudioFile","useAudioTrack","useQueueModelAdapter","useTranscriber","useVoiceInput"],"entryPoint":"src/index.ts","inputs":{"src/index.ts":{"bytesInOutput":116},"src/meta.ts":{"bytesInOutput":506},"src/transcriber/index.ts":{"bytesInOutput":0},"src/transcriber/media-stream-recorder.ts":{"bytesInOutput":3754},"src/transcriber/transcriber.ts":{"bytesInOutput":6646},"src/transcriber/transcription-manager.ts":{"bytesInOutput":3915}},"bytes":15810},"dist/lib/node-esm/blueprints/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1380},"dist/lib/node-esm/blueprints/index.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-HSLMI22Q.mjs","kind":"import-statement"},{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"#operations","kind":"import-statement","external":true}],"exports":["TranscriptionBlueprint"],"entryPoint":"src/blueprints/index.ts","inputs":{"src/blueprints/transcription-blueprint.ts":{"bytesInOutput":634},"src/blueprints/index.ts":{"bytesInOutput":0}},"bytes":911},"dist/lib/node-esm/components/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":14516},"dist/lib/node-esm/components/index.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-C3AE2NYJ.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-O533NBMK.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-HSLMI22Q.mjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-editor","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@codemirror/state","kind":"import-statement","external":true},{"path":"@codemirror/view","kind":"import-statement","external":true},{"path":"date-fns/format","kind":"import-statement","external":true},{"path":"date-fns/intervalToDuration","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true}],"exports":["Transcription","renderByline"],"entryPoint":"src/components/index.ts","inputs":{"src/components/Transcription/Transcription.tsx":{"bytesInOutput":1320},"src/components/Transcription/transcription-extension.ts":{"bytesInOutput":4798},"src/components/Transcription/index.ts":{"bytesInOutput":0},"src/components/index.ts":{"bytesInOutput":0}},"bytes":6598},"dist/lib/node-esm/hooks/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"dist/lib/node-esm/hooks/index.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-MQK4R6GT.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-C3AE2NYJ.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-HSLMI22Q.mjs","kind":"import-statement"}],"exports":["useAudioFile","useAudioTrack","useQueueModelAdapter","useTranscriber","useVoiceInput"],"entryPoint":"src/hooks/index.ts","inputs":{},"bytes":426},"dist/lib/node-esm/chunk-MQK4R6GT.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":14398},"dist/lib/node-esm/chunk-MQK4R6GT.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-C3AE2NYJ.mjs","kind":"import-statement"},{"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":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework/ui","kind":"import-statement","external":true},{"path":"#types","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}],"exports":["useAudioFile","useAudioTrack","useQueueModelAdapter","useTranscriber","useVoiceInput"],"inputs":{"src/hooks/useAudioFile.ts":{"bytesInOutput":2325},"src/hooks/index.ts":{"bytesInOutput":0},"src/hooks/useAudioTrack.ts":{"bytesInOutput":656},"src/hooks/useQueueModelAdapter.ts":{"bytesInOutput":1075},"src/hooks/useTranscriber.ts":{"bytesInOutput":905},"src/hooks/useVoiceInput.ts":{"bytesInOutput":1785}},"bytes":7209},"dist/lib/node-esm/chunk-C3AE2NYJ.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":10714},"dist/lib/node-esm/chunk-C3AE2NYJ.mjs":{"imports":[{"path":"@codemirror/state","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}],"exports":["DocumentAdapter","SerializationModel"],"inputs":{"src/model/model.ts":{"bytesInOutput":5119},"src/model/index.ts":{"bytesInOutput":0}},"bytes":5331},"dist/lib/node-esm/types/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"dist/lib/node-esm/types/index.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-KO3IOD2O.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-HSLMI22Q.mjs","kind":"import-statement"}],"exports":["TRANSCRIPTION_URL","TranscriptionCapabilities"],"entryPoint":"src/types/index.ts","inputs":{},"bytes":310},"dist/lib/node-esm/chunk-KO3IOD2O.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1902},"dist/lib/node-esm/chunk-KO3IOD2O.mjs":{"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true}],"exports":["TRANSCRIPTION_URL","TranscriptionCapabilities"],"inputs":{"src/types/capabilities.ts":{"bytesInOutput":431},"src/types/index.ts":{"bytesInOutput":0},"src/types/defs.ts":{"bytesInOutput":66}},"bytes":747},"dist/lib/node-esm/operations/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":637},"dist/lib/node-esm/operations/index.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-7UIZWCD4.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-HSLMI22Q.mjs","kind":"import-statement"},{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"dist/lib/node-esm/create-A5QHNWRF.mjs","kind":"dynamic-import"},{"path":"dist/lib/node-esm/open-OI24QNTO.mjs","kind":"dynamic-import"},{"path":"dist/lib/node-esm/summarize-3UNN24I2.mjs","kind":"dynamic-import"}],"exports":["TranscriptOperation","TranscriptionOperationHandlerSet"],"entryPoint":"src/operations/index.ts","inputs":{"src/operations/index.ts":{"bytesInOutput":239}},"bytes":582},"dist/lib/node-esm/create-A5QHNWRF.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1185},"dist/lib/node-esm/create-A5QHNWRF.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-7UIZWCD4.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-HSLMI22Q.mjs","kind":"import-statement"},{"path":"effect/Effect","kind":"import-statement","external":true},{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/types","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"src/operations/create.ts","inputs":{"src/operations/create.ts":{"bytesInOutput":386}},"bytes":672},"dist/lib/node-esm/open-OI24QNTO.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1793},"dist/lib/node-esm/open-OI24QNTO.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-O533NBMK.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-7UIZWCD4.mjs","kind":"import-statement"},{"path":"dist/lib/node-esm/chunk-HSLMI22Q.mjs","kind":"import-statement"},{"path":"effect/Effect","kind":"import-statement","external":true},{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/types","kind":"import-statement","external":true}],"exports":["default"],"entryPoint":"src/operations/open.ts","inputs":{"src/operations/open.ts":{"bytesInOutput":618}},"bytes":951},"dist/lib/node-esm/chunk-O533NBMK.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":2919},"dist/lib/node-esm/chunk-O533NBMK.mjs":{"imports":[],"exports":["mergeFloat64Arrays","renderByline"],"inputs":{"src/util/render-byline.ts":{"bytesInOutput":785},"src/util/array.ts":{"bytesInOutput":267},"src/util/index.ts":{"bytesInOutput":0}},"bytes":1290},"dist/lib/node-esm/chunk-7UIZWCD4.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5257},"dist/lib/node-esm/chunk-7UIZWCD4.mjs":{"imports":[{"path":"dist/lib/node-esm/chunk-HSLMI22Q.mjs","kind":"import-statement"},{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"@dxos/ai","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/compute","kind":"import-statement","external":true},{"path":"@dxos/echo","kind":"import-statement","external":true},{"path":"@dxos/types","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true}],"exports":["Create","Open","Summarize","definitions_exports"],"inputs":{"src/operations/definitions.ts":{"bytesInOutput":3034}},"bytes":3321},"dist/lib/node-esm/chunk-HSLMI22Q.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"dist/lib/node-esm/chunk-HSLMI22Q.mjs":{"imports":[],"exports":["__export"],"inputs":{},"bytes":327}}}
|