@dxos/plugin-transcription 0.8.1-main.ba2dec9 → 0.8.1-staging.5be625a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{TranscriptContainer-N4KQHMY4.mjs → TranscriptContainer-TJXP6ICP.mjs} +3 -3
- package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs +39 -0
- package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs.map +7 -0
- package/dist/lib/browser/{chunk-BDVUIRBP.mjs → chunk-3NWYXRZS.mjs} +2 -2
- package/dist/lib/browser/chunk-MD4NQO6W.mjs +252 -0
- package/dist/lib/browser/chunk-MD4NQO6W.mjs.map +7 -0
- package/dist/lib/browser/chunk-N3VKF2J3.mjs +415 -0
- package/dist/lib/browser/chunk-N3VKF2J3.mjs.map +7 -0
- package/dist/lib/browser/chunk-YEVVZZTC.mjs +19 -0
- package/dist/lib/browser/chunk-YEVVZZTC.mjs.map +7 -0
- package/dist/lib/browser/{chunk-QIHUPVQD.mjs → chunk-YRW4MNRE.mjs} +23 -24
- package/dist/lib/browser/chunk-YRW4MNRE.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +56 -327
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs +73 -0
- package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-UPTZBHVB.mjs → react-surface-OM2EECBI.mjs} +15 -8
- package/dist/lib/{node-esm/react-surface-2WJQ67LB.mjs.map → browser/react-surface-OM2EECBI.mjs.map} +2 -2
- package/dist/lib/browser/types/index.mjs +2 -1
- package/dist/lib/node/{TranscriptContainer-4BWXOVML.cjs → TranscriptContainer-KNTN76RZ.cjs} +8 -8
- package/dist/lib/node/{TranscriptContainer-4BWXOVML.cjs.map → TranscriptContainer-KNTN76RZ.cjs.map} +2 -2
- package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs +52 -0
- package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs.map +7 -0
- package/dist/lib/node/chunk-EKSRBQX7.cjs +437 -0
- package/dist/lib/node/chunk-EKSRBQX7.cjs.map +7 -0
- package/dist/lib/node/{chunk-I35KHI2G.cjs → chunk-I6CUIAQH.cjs} +5 -5
- package/dist/lib/node/{app-graph-builder-YFBX3OTP.cjs → chunk-LEHTJHKP.cjs} +23 -7
- package/dist/lib/node/chunk-LEHTJHKP.cjs.map +7 -0
- package/dist/lib/node/chunk-T4W4AKGM.cjs +279 -0
- package/dist/lib/node/chunk-T4W4AKGM.cjs.map +7 -0
- package/dist/lib/node/{chunk-UIHEGU6Q.cjs → chunk-ZAE2IOZC.cjs} +25 -27
- package/dist/lib/node/chunk-ZAE2IOZC.cjs.map +7 -0
- package/dist/lib/node/index.cjs +78 -344
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs +84 -0
- package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-NCKXB7EQ.cjs → react-surface-ZENSCF6S.cjs} +18 -12
- package/dist/lib/node/{react-surface-NCKXB7EQ.cjs.map → react-surface-ZENSCF6S.cjs.map} +2 -2
- package/dist/lib/node/types/index.cjs +8 -7
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/{TranscriptContainer-6IKRASR6.mjs → TranscriptContainer-MOWZQSEO.mjs} +3 -3
- package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs +40 -0
- package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-4A6BWPRB.mjs +253 -0
- package/dist/lib/node-esm/chunk-4A6BWPRB.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-KEG3ME4O.mjs → chunk-DLXORY7Y.mjs} +22 -24
- package/dist/lib/node-esm/chunk-DLXORY7Y.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-2CPKXRN6.mjs → chunk-NFPDIQYG.mjs} +2 -2
- package/dist/lib/node-esm/chunk-SB5TLXBU.mjs +21 -0
- package/dist/lib/node-esm/chunk-SB5TLXBU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SWV74BYU.mjs +416 -0
- package/dist/lib/node-esm/chunk-SWV74BYU.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +56 -327
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs +74 -0
- package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-2WJQ67LB.mjs → react-surface-5CBEXLXJ.mjs} +15 -8
- package/dist/lib/{browser/react-surface-UPTZBHVB.mjs.map → node-esm/react-surface-5CBEXLXJ.mjs.map} +2 -2
- package/dist/lib/node-esm/types/index.mjs +2 -1
- package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/Transcript.d.ts +2 -0
- package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
- package/dist/types/src/components/TranscriptContainer.d.ts +1 -0
- package/dist/types/src/components/TranscriptContainer.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/components/transcription.stories.d.ts +1 -1
- package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -9
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/transcriber/index.d.ts +1 -0
- package/dist/types/src/transcriber/index.d.ts.map +1 -1
- package/dist/types/src/transcriber/summarize.d.ts +5 -0
- package/dist/types/src/transcriber/summarize.d.ts.map +1 -0
- package/dist/types/src/transcription-manager.d.ts +3 -0
- package/dist/types/src/transcription-manager.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +5 -6
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +9 -15
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +13 -6
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util/random-queue-dxn.d.ts +2 -2
- package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -1
- package/package.json +39 -36
- package/src/TranscriptionPlugin.tsx +1 -2
- package/src/capabilities/app-graph-builder.ts +25 -2
- package/src/capabilities/intent-resolver.ts +24 -2
- package/src/capabilities/react-surface.tsx +2 -2
- package/src/components/Transcript/Transcript.stories.tsx +46 -27
- package/src/components/Transcript/Transcript.tsx +205 -49
- package/src/components/TranscriptContainer.tsx +12 -143
- package/src/components/transcription.stories.tsx +11 -13
- package/src/meta.ts +2 -2
- package/src/transcriber/index.ts +1 -0
- package/src/transcriber/summarize.ts +77 -0
- package/src/transcription-manager.ts +11 -1
- package/src/translations.ts +2 -2
- package/src/types/schema.ts +5 -3
- package/src/types/types.ts +12 -2
- package/src/util/random-queue-dxn.ts +2 -2
- package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs +0 -7
- package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs.map +0 -7
- package/dist/lib/browser/chunk-GHTRJTEB.mjs +0 -35
- package/dist/lib/browser/chunk-GHTRJTEB.mjs.map +0 -7
- package/dist/lib/browser/chunk-QIHUPVQD.mjs.map +0 -7
- package/dist/lib/browser/chunk-YX447BJ4.mjs +0 -241
- package/dist/lib/browser/chunk-YX447BJ4.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-RW6DEJC2.mjs +0 -32
- package/dist/lib/browser/intent-resolver-RW6DEJC2.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map +0 -7
- package/dist/lib/node/chunk-ANSWGFMS.cjs +0 -267
- package/dist/lib/node/chunk-ANSWGFMS.cjs.map +0 -7
- package/dist/lib/node/chunk-HDRXDMK2.cjs +0 -55
- package/dist/lib/node/chunk-HDRXDMK2.cjs.map +0 -7
- package/dist/lib/node/chunk-UIHEGU6Q.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-KLBZ25XJ.cjs +0 -44
- package/dist/lib/node/intent-resolver-KLBZ25XJ.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs +0 -9
- package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KEG3ME4O.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LORUIVS4.mjs +0 -37
- package/dist/lib/node-esm/chunk-LORUIVS4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ZMK2QLW2.mjs +0 -242
- package/dist/lib/node-esm/chunk-ZMK2QLW2.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-4FMISUPW.mjs +0 -33
- package/dist/lib/node-esm/intent-resolver-4FMISUPW.mjs.map +0 -7
- /package/dist/lib/browser/{TranscriptContainer-N4KQHMY4.mjs.map → TranscriptContainer-TJXP6ICP.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-BDVUIRBP.mjs.map → chunk-3NWYXRZS.mjs.map} +0 -0
- /package/dist/lib/node/{chunk-I35KHI2G.cjs.map → chunk-I6CUIAQH.cjs.map} +0 -0
- /package/dist/lib/node-esm/{TranscriptContainer-6IKRASR6.mjs.map → TranscriptContainer-MOWZQSEO.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-2CPKXRN6.mjs.map → chunk-NFPDIQYG.mjs.map} +0 -0
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
MediaStreamRecorder,
|
|
3
|
+
Transcriber,
|
|
4
|
+
summarizeTranscript
|
|
5
|
+
} from "./chunk-N3VKF2J3.mjs";
|
|
4
6
|
import {
|
|
5
7
|
TranscriptContainer
|
|
6
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-3NWYXRZS.mjs";
|
|
9
|
+
import {
|
|
10
|
+
TranscriptBlock,
|
|
11
|
+
TranscriptType
|
|
12
|
+
} from "./chunk-YRW4MNRE.mjs";
|
|
7
13
|
import {
|
|
8
14
|
Transcript,
|
|
9
15
|
TranscriptionContainer
|
|
10
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-MD4NQO6W.mjs";
|
|
11
17
|
import {
|
|
12
18
|
TRANSCRIPTION_PLUGIN,
|
|
13
|
-
TRANSCRIPTION_URL,
|
|
14
|
-
TranscriptBlock,
|
|
15
|
-
TranscriptType,
|
|
16
19
|
meta
|
|
17
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-YEVVZZTC.mjs";
|
|
18
21
|
|
|
19
22
|
// packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts
|
|
20
23
|
import { lazy } from "@dxos/app-framework";
|
|
@@ -27,9 +30,9 @@ var TranscriptionCapabilities;
|
|
|
27
30
|
})(TranscriptionCapabilities || (TranscriptionCapabilities = {}));
|
|
28
31
|
|
|
29
32
|
// packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts
|
|
30
|
-
var AppGraphBuilder = lazy(() => import("./app-graph-builder-
|
|
31
|
-
var IntentResolver = lazy(() => import("./intent-resolver-
|
|
32
|
-
var ReactSurface = lazy(() => import("./react-surface-
|
|
33
|
+
var AppGraphBuilder = lazy(() => import("./app-graph-builder-ZIIDYMHP.mjs"));
|
|
34
|
+
var IntentResolver = lazy(() => import("./intent-resolver-AC6LFBE4.mjs"));
|
|
35
|
+
var ReactSurface = lazy(() => import("./react-surface-OM2EECBI.mjs"));
|
|
33
36
|
|
|
34
37
|
// packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts
|
|
35
38
|
import { useEffect, useState } from "react";
|
|
@@ -123,286 +126,6 @@ var useAudioTrack = (active) => {
|
|
|
123
126
|
|
|
124
127
|
// packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts
|
|
125
128
|
import { useEffect as useEffect3, useMemo } from "react";
|
|
126
|
-
|
|
127
|
-
// packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts
|
|
128
|
-
import { MediaRecorder, register } from "extendable-media-recorder";
|
|
129
|
-
import { WaveFile } from "wavefile";
|
|
130
|
-
import { synchronized } from "@dxos/async";
|
|
131
|
-
import { invariant } from "@dxos/invariant";
|
|
132
|
-
import { log as log2 } from "@dxos/log";
|
|
133
|
-
import { trace } from "@dxos/tracing";
|
|
134
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
135
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
136
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
137
|
-
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;
|
|
138
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
139
|
-
}
|
|
140
|
-
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts";
|
|
141
|
-
var initializingPromise;
|
|
142
|
-
var initializeExtendableMediaRecorder = async () => {
|
|
143
|
-
const { connect } = await import("extendable-media-recorder-wav-encoder");
|
|
144
|
-
await register(await connect());
|
|
145
|
-
};
|
|
146
|
-
var MediaStreamRecorder = class {
|
|
147
|
-
constructor({ mediaStreamTrack, interval }) {
|
|
148
|
-
this._mediaRecorder = void 0;
|
|
149
|
-
this._header = void 0;
|
|
150
|
-
this._mediaStreamTrack = mediaStreamTrack;
|
|
151
|
-
this._interval = interval;
|
|
152
|
-
}
|
|
153
|
-
get wavConfig() {
|
|
154
|
-
const settings = this._mediaStreamTrack.getSettings();
|
|
155
|
-
return {
|
|
156
|
-
channels: settings.channelCount ?? 1,
|
|
157
|
-
sampleRate: settings.sampleRate ?? 16e3,
|
|
158
|
-
bitDepthCode: settings.sampleSize ? String(settings.sampleSize) : "16"
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
get mediaStreamTrack() {
|
|
162
|
-
return this._mediaStreamTrack;
|
|
163
|
-
}
|
|
164
|
-
setOnChunk(onChunk) {
|
|
165
|
-
this._onChunk = onChunk;
|
|
166
|
-
}
|
|
167
|
-
async start() {
|
|
168
|
-
await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) => log2.info("initializeExtendableMediaRecorder", {
|
|
169
|
-
err
|
|
170
|
-
}, {
|
|
171
|
-
F: __dxlog_file2,
|
|
172
|
-
L: 62,
|
|
173
|
-
S: this,
|
|
174
|
-
C: (f, a) => f(...a)
|
|
175
|
-
}));
|
|
176
|
-
if (!this._mediaRecorder) {
|
|
177
|
-
const stream = new MediaStream([
|
|
178
|
-
this._mediaStreamTrack
|
|
179
|
-
]);
|
|
180
|
-
this._mediaRecorder = new MediaRecorder(stream, {
|
|
181
|
-
mimeType: "audio/wav"
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
if (this._mediaRecorder.state === "recording") {
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
invariant(this._onChunk, "MediaStreamRecorder: onChunk is not set", {
|
|
188
|
-
F: __dxlog_file2,
|
|
189
|
-
L: 73,
|
|
190
|
-
S: this,
|
|
191
|
-
A: [
|
|
192
|
-
"this._onChunk",
|
|
193
|
-
"'MediaStreamRecorder: onChunk is not set'"
|
|
194
|
-
]
|
|
195
|
-
});
|
|
196
|
-
this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);
|
|
197
|
-
this._mediaRecorder.start(this._interval);
|
|
198
|
-
}
|
|
199
|
-
async stop() {
|
|
200
|
-
if (this._mediaRecorder?.state !== "recording") {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
this._mediaRecorder.stop();
|
|
204
|
-
}
|
|
205
|
-
async _ondataavailable(event) {
|
|
206
|
-
const blob = event.data;
|
|
207
|
-
const uint8Array = new Uint8Array(await blob.arrayBuffer());
|
|
208
|
-
const isHeader = uint8Array[0] === 82 && // R
|
|
209
|
-
uint8Array[1] === 73 && // I
|
|
210
|
-
uint8Array[2] === 70 && // F
|
|
211
|
-
uint8Array[3] === 70;
|
|
212
|
-
let wav;
|
|
213
|
-
if (isHeader) {
|
|
214
|
-
wav = new WaveFile(uint8Array);
|
|
215
|
-
this._header = uint8Array.slice(0, 44);
|
|
216
|
-
} else if (this._header) {
|
|
217
|
-
wav = new WaveFile(new Uint8Array([
|
|
218
|
-
...this._header,
|
|
219
|
-
...uint8Array
|
|
220
|
-
]));
|
|
221
|
-
} else {
|
|
222
|
-
log2.warn("MediaStreamRecorder: no header", void 0, {
|
|
223
|
-
F: __dxlog_file2,
|
|
224
|
-
L: 104,
|
|
225
|
-
S: this,
|
|
226
|
-
C: (f, a) => f(...a)
|
|
227
|
-
});
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
this._onChunk({
|
|
231
|
-
timestamp: Date.now(),
|
|
232
|
-
data: wav.getSamples()
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
|
-
_ts_decorate([
|
|
237
|
-
synchronized
|
|
238
|
-
], MediaStreamRecorder.prototype, "_ondataavailable", null);
|
|
239
|
-
MediaStreamRecorder = _ts_decorate([
|
|
240
|
-
trace.resource()
|
|
241
|
-
], MediaStreamRecorder);
|
|
242
|
-
|
|
243
|
-
// packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts
|
|
244
|
-
import { WaveFile as WaveFile2 } from "wavefile";
|
|
245
|
-
import { DeferredTask, Trigger } from "@dxos/async";
|
|
246
|
-
import { LifecycleState, Resource } from "@dxos/context";
|
|
247
|
-
import { log as log3 } from "@dxos/log";
|
|
248
|
-
import { trace as trace2 } from "@dxos/tracing";
|
|
249
|
-
function _ts_decorate2(decorators, target, key, desc) {
|
|
250
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
251
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
252
|
-
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;
|
|
253
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
254
|
-
}
|
|
255
|
-
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts";
|
|
256
|
-
var Transcriber = class extends Resource {
|
|
257
|
-
constructor({ config, recorder, onSegments }) {
|
|
258
|
-
super();
|
|
259
|
-
this._audioChunks = [];
|
|
260
|
-
this._lastUsedTimestamp = 0;
|
|
261
|
-
this._openTrigger = new Trigger({
|
|
262
|
-
autoReset: true
|
|
263
|
-
});
|
|
264
|
-
this._recording = false;
|
|
265
|
-
this._transcribeTask = void 0;
|
|
266
|
-
this._config = config;
|
|
267
|
-
this._recorder = recorder;
|
|
268
|
-
this._onSegments = onSegments;
|
|
269
|
-
}
|
|
270
|
-
async _open(ctx) {
|
|
271
|
-
this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));
|
|
272
|
-
await this._recorder.start();
|
|
273
|
-
this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());
|
|
274
|
-
this._openTrigger.wake();
|
|
275
|
-
}
|
|
276
|
-
async _close() {
|
|
277
|
-
this._recording = false;
|
|
278
|
-
this._transcribeTask = void 0;
|
|
279
|
-
await this._recorder.stop();
|
|
280
|
-
}
|
|
281
|
-
startChunksRecording() {
|
|
282
|
-
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
this._recording = true;
|
|
286
|
-
}
|
|
287
|
-
stopChunksRecording() {
|
|
288
|
-
if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
this._recording = false;
|
|
292
|
-
this._transcribeTask?.schedule();
|
|
293
|
-
}
|
|
294
|
-
_saveAudioChunk(chunk) {
|
|
295
|
-
log3("saving audio chunk", {
|
|
296
|
-
chunk
|
|
297
|
-
}, {
|
|
298
|
-
F: __dxlog_file3,
|
|
299
|
-
L: 124,
|
|
300
|
-
S: this,
|
|
301
|
-
C: (f, a) => f(...a)
|
|
302
|
-
});
|
|
303
|
-
this._audioChunks.push(chunk);
|
|
304
|
-
if (!this._recording && (!this._transcribeTask || !this._transcribeTask.scheduled) && this._audioChunks.length >= this._config.prefixBufferChunksAmount) {
|
|
305
|
-
this._audioChunks = this._dropOldChunks();
|
|
306
|
-
} else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {
|
|
307
|
-
this._transcribeTask?.schedule();
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
async _transcribe() {
|
|
311
|
-
log3("transcribing", {
|
|
312
|
-
chunks: this._audioChunks.length
|
|
313
|
-
}, {
|
|
314
|
-
F: __dxlog_file3,
|
|
315
|
-
L: 140,
|
|
316
|
-
S: this,
|
|
317
|
-
C: (f, a) => f(...a)
|
|
318
|
-
});
|
|
319
|
-
const chunks = this._audioChunks;
|
|
320
|
-
this._audioChunks = this._dropOldChunks();
|
|
321
|
-
if (chunks.length === 0) {
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
const audio = await this._mergeAudioChunks(chunks);
|
|
325
|
-
const segments = await this._fetchTranscription(audio);
|
|
326
|
-
if (!Array.isArray(segments) || segments.length === 0) {
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
const alignedSegments = this._alignSegments(segments, chunks);
|
|
330
|
-
if (alignedSegments.length > 0) {
|
|
331
|
-
await this._onSegments(alignedSegments);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
_dropOldChunks() {
|
|
335
|
-
return this._config.prefixBufferChunksAmount > 0 ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount) : [];
|
|
336
|
-
}
|
|
337
|
-
async _mergeAudioChunks(chunks) {
|
|
338
|
-
const file = new WaveFile2();
|
|
339
|
-
const wavConfig = this._recorder.wavConfig;
|
|
340
|
-
file.fromScratch(wavConfig.channels, wavConfig.sampleRate, wavConfig.bitDepthCode, mergeFloat64Arrays(chunks.map(({ data }) => data)));
|
|
341
|
-
return file.toBase64();
|
|
342
|
-
}
|
|
343
|
-
async _fetchTranscription(audio) {
|
|
344
|
-
if (audio.length === 0) {
|
|
345
|
-
this._audioChunks = [];
|
|
346
|
-
throw new Error("No audio to send for transcribing");
|
|
347
|
-
}
|
|
348
|
-
const response = await fetch(`${TRANSCRIPTION_URL}/transcribe`, {
|
|
349
|
-
method: "POST",
|
|
350
|
-
body: JSON.stringify({
|
|
351
|
-
audio
|
|
352
|
-
}),
|
|
353
|
-
headers: {
|
|
354
|
-
"Content-Type": "application/json"
|
|
355
|
-
}
|
|
356
|
-
});
|
|
357
|
-
if (!response.ok) {
|
|
358
|
-
this._audioChunks = [];
|
|
359
|
-
throw new Error("Failed to transcribe");
|
|
360
|
-
}
|
|
361
|
-
const { segments } = await response.json();
|
|
362
|
-
log3.info("transcription response", {
|
|
363
|
-
segments,
|
|
364
|
-
string: segments.map((segments2) => segments2.text).join(" ")
|
|
365
|
-
}, {
|
|
366
|
-
F: __dxlog_file3,
|
|
367
|
-
L: 206,
|
|
368
|
-
S: this,
|
|
369
|
-
C: (f, a) => f(...a)
|
|
370
|
-
});
|
|
371
|
-
return segments;
|
|
372
|
-
}
|
|
373
|
-
_alignSegments(segments, originalChunks) {
|
|
374
|
-
const zeroTimestamp = originalChunks.at(0).timestamp;
|
|
375
|
-
const filteredSegments = segments.filter((segment) => zeroTimestamp + segment.end * 1e3 >= this._lastUsedTimestamp).map((segment) => {
|
|
376
|
-
const words = segment.words.filter((word) => zeroTimestamp + word.start * 1e3 >= this._lastUsedTimestamp);
|
|
377
|
-
return {
|
|
378
|
-
...segment,
|
|
379
|
-
words,
|
|
380
|
-
text: words.map((word) => word.word).join(""),
|
|
381
|
-
start: words.at(0)?.start ?? segment.end
|
|
382
|
-
};
|
|
383
|
-
}).filter((segment) => segment.words.length > 0);
|
|
384
|
-
if (filteredSegments.length === 0) {
|
|
385
|
-
return [];
|
|
386
|
-
}
|
|
387
|
-
this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1).end * 1e3;
|
|
388
|
-
return filteredSegments.map((segment) => ({
|
|
389
|
-
started: new Date(zeroTimestamp + segment.start * 1e3),
|
|
390
|
-
text: segment.text
|
|
391
|
-
}));
|
|
392
|
-
}
|
|
393
|
-
};
|
|
394
|
-
_ts_decorate2([
|
|
395
|
-
trace2.span({
|
|
396
|
-
showInBrowserTimeline: true
|
|
397
|
-
})
|
|
398
|
-
], Transcriber.prototype, "_mergeAudioChunks", null);
|
|
399
|
-
_ts_decorate2([
|
|
400
|
-
trace2.span({
|
|
401
|
-
showInBrowserTimeline: true
|
|
402
|
-
})
|
|
403
|
-
], Transcriber.prototype, "_fetchTranscription", null);
|
|
404
|
-
|
|
405
|
-
// packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts
|
|
406
129
|
var RECORD_INTERVAL = 200;
|
|
407
130
|
var PREFIXED_CHUNKS_AMOUNT = 10;
|
|
408
131
|
var TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;
|
|
@@ -440,9 +163,9 @@ var useTranscriber = ({ audioStreamTrack, onSegments }) => {
|
|
|
440
163
|
import { useState as useState3, useEffect as useEffect4, useCallback } from "react";
|
|
441
164
|
import { scheduleMicroTask } from "@dxos/async";
|
|
442
165
|
import { Context } from "@dxos/context";
|
|
443
|
-
import { log as
|
|
166
|
+
import { log as log2 } from "@dxos/log";
|
|
444
167
|
import { useSoundEffect } from "@dxos/react-ui-sfx";
|
|
445
|
-
var
|
|
168
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts";
|
|
446
169
|
var useVoiceInput = ({ active, onUpdate }) => {
|
|
447
170
|
const soundStart = useSoundEffect("StartRecording");
|
|
448
171
|
const soundStop = useSoundEffect("StopRecording");
|
|
@@ -458,14 +181,14 @@ var useVoiceInput = ({ active, onUpdate }) => {
|
|
|
458
181
|
});
|
|
459
182
|
useEffect4(() => {
|
|
460
183
|
const ctx = new Context(void 0, {
|
|
461
|
-
F:
|
|
184
|
+
F: __dxlog_file2,
|
|
462
185
|
L: 43
|
|
463
186
|
});
|
|
464
187
|
scheduleMicroTask(ctx, async () => {
|
|
465
188
|
if (active && transcriber) {
|
|
466
189
|
await transcriber.open();
|
|
467
|
-
|
|
468
|
-
F:
|
|
190
|
+
log2.info("starting...", void 0, {
|
|
191
|
+
F: __dxlog_file2,
|
|
469
192
|
L: 47,
|
|
470
193
|
S: void 0,
|
|
471
194
|
C: (f, a) => f(...a)
|
|
@@ -476,8 +199,8 @@ var useVoiceInput = ({ active, onUpdate }) => {
|
|
|
476
199
|
} else if (!active && transcriber?.isOpen) {
|
|
477
200
|
transcriber?.stopChunksRecording();
|
|
478
201
|
await transcriber?.close();
|
|
479
|
-
|
|
480
|
-
F:
|
|
202
|
+
log2.info("stopped", void 0, {
|
|
203
|
+
F: __dxlog_file2,
|
|
481
204
|
L: 54,
|
|
482
205
|
S: void 0,
|
|
483
206
|
C: (f, a) => f(...a)
|
|
@@ -499,27 +222,28 @@ var useVoiceInput = ({ active, onUpdate }) => {
|
|
|
499
222
|
};
|
|
500
223
|
|
|
501
224
|
// packages/plugins/experimental/plugin-transcription/src/transcription-manager.ts
|
|
502
|
-
import { synchronized
|
|
503
|
-
import { Resource
|
|
225
|
+
import { synchronized } from "@dxos/async";
|
|
226
|
+
import { Resource } from "@dxos/context";
|
|
504
227
|
import { QueueImpl } from "@dxos/echo-db";
|
|
505
228
|
import { createStatic } from "@dxos/echo-schema";
|
|
506
|
-
import { invariant
|
|
229
|
+
import { invariant } from "@dxos/invariant";
|
|
507
230
|
import { DXN } from "@dxos/keys";
|
|
508
|
-
function
|
|
231
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
509
232
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
510
233
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
511
234
|
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;
|
|
512
235
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
513
236
|
}
|
|
514
|
-
var
|
|
237
|
+
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/transcription-manager.ts";
|
|
515
238
|
var RECORD_INTERVAL2 = 200;
|
|
516
239
|
var PREFIXED_CHUNKS_AMOUNT2 = 10;
|
|
517
240
|
var TRANSCRIBE_AFTER_CHUNKS_AMOUNT2 = 50;
|
|
518
|
-
var TranscriptionManager = class extends
|
|
241
|
+
var TranscriptionManager = class extends Resource {
|
|
519
242
|
constructor(edgeClient) {
|
|
520
243
|
super();
|
|
521
244
|
this._audioStreamTrack = void 0;
|
|
522
245
|
this._name = void 0;
|
|
246
|
+
this._hue = void 0;
|
|
523
247
|
this._mediaRecorder = void 0;
|
|
524
248
|
this._transcriber = void 0;
|
|
525
249
|
this._enabled = false;
|
|
@@ -576,9 +300,9 @@ var TranscriptionManager = class extends Resource2 {
|
|
|
576
300
|
if (this._queue === queue) {
|
|
577
301
|
return;
|
|
578
302
|
}
|
|
579
|
-
|
|
580
|
-
F:
|
|
581
|
-
L:
|
|
303
|
+
invariant(queue instanceof QueueImpl, void 0, {
|
|
304
|
+
F: __dxlog_file3,
|
|
305
|
+
L: 112,
|
|
582
306
|
S: this,
|
|
583
307
|
A: [
|
|
584
308
|
"queue instanceof QueueImpl",
|
|
@@ -598,6 +322,12 @@ var TranscriptionManager = class extends Resource2 {
|
|
|
598
322
|
}
|
|
599
323
|
this._name = name;
|
|
600
324
|
}
|
|
325
|
+
setHue(hue) {
|
|
326
|
+
if (this._hue === hue) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
this._hue = hue;
|
|
330
|
+
}
|
|
601
331
|
async _toggleTranscriber() {
|
|
602
332
|
await this._maybeReinitTranscriber();
|
|
603
333
|
if (this._enabled) {
|
|
@@ -635,7 +365,8 @@ var TranscriptionManager = class extends Resource2 {
|
|
|
635
365
|
return;
|
|
636
366
|
}
|
|
637
367
|
const block = createStatic(TranscriptBlock, {
|
|
638
|
-
|
|
368
|
+
authorName: this._name,
|
|
369
|
+
authorHue: this._hue,
|
|
639
370
|
segments
|
|
640
371
|
});
|
|
641
372
|
this._queue.append([
|
|
@@ -643,21 +374,24 @@ var TranscriptionManager = class extends Resource2 {
|
|
|
643
374
|
]);
|
|
644
375
|
}
|
|
645
376
|
};
|
|
646
|
-
|
|
647
|
-
|
|
377
|
+
_ts_decorate([
|
|
378
|
+
synchronized
|
|
648
379
|
], TranscriptionManager.prototype, "setRecording", null);
|
|
649
|
-
|
|
650
|
-
|
|
380
|
+
_ts_decorate([
|
|
381
|
+
synchronized
|
|
651
382
|
], TranscriptionManager.prototype, "setEnabled", null);
|
|
652
|
-
|
|
653
|
-
|
|
383
|
+
_ts_decorate([
|
|
384
|
+
synchronized
|
|
654
385
|
], TranscriptionManager.prototype, "setAudioTrack", null);
|
|
655
|
-
|
|
656
|
-
|
|
386
|
+
_ts_decorate([
|
|
387
|
+
synchronized
|
|
657
388
|
], TranscriptionManager.prototype, "setQueue", null);
|
|
658
|
-
|
|
659
|
-
|
|
389
|
+
_ts_decorate([
|
|
390
|
+
synchronized
|
|
660
391
|
], TranscriptionManager.prototype, "setName", null);
|
|
392
|
+
_ts_decorate([
|
|
393
|
+
synchronized
|
|
394
|
+
], TranscriptionManager.prototype, "setHue", null);
|
|
661
395
|
|
|
662
396
|
// packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx
|
|
663
397
|
import { Capabilities, Events, contributes, defineModule, definePlugin } from "@dxos/app-framework";
|
|
@@ -668,7 +402,8 @@ var translations_default = [
|
|
|
668
402
|
{
|
|
669
403
|
"en-US": {
|
|
670
404
|
[TranscriptType.typename]: {
|
|
671
|
-
"typename label": "Transcript"
|
|
405
|
+
"typename label": "Transcript",
|
|
406
|
+
"object name placeholder": "New transcript"
|
|
672
407
|
},
|
|
673
408
|
[TRANSCRIPTION_PLUGIN]: {
|
|
674
409
|
"plugin name": "Transcription",
|
|
@@ -678,8 +413,7 @@ var translations_default = [
|
|
|
678
413
|
"delete calls label": "Delete",
|
|
679
414
|
"delete button": "Delete",
|
|
680
415
|
"bookmark button": "Bookmark",
|
|
681
|
-
"
|
|
682
|
-
"summarizing label": "Summarizing..."
|
|
416
|
+
"scroll to end label": "Scroll to latest"
|
|
683
417
|
}
|
|
684
418
|
}
|
|
685
419
|
}
|
|
@@ -703,12 +437,6 @@ var TranscriptionPlugin = () => definePlugin(meta, [
|
|
|
703
437
|
activate: () => contributes(Capabilities.Metadata, {
|
|
704
438
|
id: TranscriptType.typename,
|
|
705
439
|
metadata: {
|
|
706
|
-
placeholder: [
|
|
707
|
-
"transcript title placeholder",
|
|
708
|
-
{
|
|
709
|
-
ns: TRANSCRIPTION_PLUGIN
|
|
710
|
-
}
|
|
711
|
-
],
|
|
712
440
|
icon: "ph--subtitles--regular"
|
|
713
441
|
}
|
|
714
442
|
})
|
|
@@ -752,6 +480,7 @@ export {
|
|
|
752
480
|
TranscriptionManager,
|
|
753
481
|
TranscriptionPlugin,
|
|
754
482
|
meta,
|
|
483
|
+
summarizeTranscript,
|
|
755
484
|
useAudioFile,
|
|
756
485
|
useAudioTrack,
|
|
757
486
|
useTranscriber,
|