@dxos/plugin-transcription 0.8.0 → 0.8.1-main.013e445
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-SX6PNFEC.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-AS364WZZ.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 +203 -366
- 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-FOEWLLTZ.mjs → react-surface-OM2EECBI.mjs} +15 -8
- package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs.map → react-surface-OM2EECBI.mjs.map} +2 -2
- package/dist/lib/browser/types/index.mjs +2 -1
- package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs → TranscriptContainer-KNTN76RZ.cjs} +8 -8
- package/dist/lib/node/{TranscriptContainer-HU763SN3.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-QWXLQPP5.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 +220 -378
- 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-AGGGDOUC.cjs → react-surface-ZENSCF6S.cjs} +18 -12
- package/dist/lib/node/{react-surface-AGGGDOUC.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-DVBXQIQ4.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-WEZGRUG6.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 +203 -366
- 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-6AYPLJ2B.mjs → react-surface-5CBEXLXJ.mjs} +15 -8
- package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs.map → 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/index.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 +3 -2
- package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +0 -1
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.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/media-stream-recorder.d.ts +1 -0
- package/dist/types/src/transcriber/media-stream-recorder.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 +39 -0
- package/dist/types/src/transcription-manager.d.ts.map +1 -0
- 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 +40 -37
- 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 -147
- package/src/components/transcription.stories.tsx +11 -13
- package/src/hooks/index.ts +0 -1
- package/src/index.ts +1 -0
- package/src/meta.ts +2 -2
- package/src/transcriber/index.ts +1 -0
- package/src/transcriber/media-stream-recorder.ts +4 -0
- package/src/transcriber/summarize.ts +77 -0
- package/src/transcription-manager.ts +183 -0
- 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-QIHUPVQD.mjs.map +0 -7
- package/dist/lib/browser/chunk-R4HHS6FA.mjs +0 -241
- package/dist/lib/browser/chunk-R4HHS6FA.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZMES3U2D.mjs +0 -78
- package/dist/lib/browser/chunk-ZMES3U2D.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs +0 -32
- package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map +0 -7
- package/dist/lib/node/chunk-JBN3P6ZF.cjs +0 -97
- package/dist/lib/node/chunk-JBN3P6ZF.cjs.map +0 -7
- package/dist/lib/node/chunk-UIHEGU6Q.cjs.map +0 -7
- package/dist/lib/node/chunk-YV74Z74I.cjs +0 -267
- package/dist/lib/node/chunk-YV74Z74I.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs +0 -44
- package/dist/lib/node/intent-resolver-3KJZGGUQ.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-36EQXBWR.mjs +0 -242
- package/dist/lib/node-esm/chunk-36EQXBWR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KEG3ME4O.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XYU6B73V.mjs +0 -80
- package/dist/lib/node-esm/chunk-XYU6B73V.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs +0 -33
- package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs.map +0 -7
- package/dist/types/src/hooks/useIsSpeaking.d.ts +0 -2
- package/dist/types/src/hooks/useIsSpeaking.d.ts.map +0 -1
- package/src/hooks/useIsSpeaking.ts +0 -77
- /package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs.map → TranscriptContainer-TJXP6ICP.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-AS364WZZ.mjs.map → chunk-3NWYXRZS.mjs.map} +0 -0
- /package/dist/lib/node/{chunk-QWXLQPP5.cjs.map → chunk-I6CUIAQH.cjs.map} +0 -0
- /package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs.map → TranscriptContainer-MOWZQSEO.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs.map → chunk-NFPDIQYG.mjs.map} +0 -0
package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs.map → TranscriptContainer-KNTN76RZ.cjs.map}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["TranscriptContainer-
|
|
4
|
-
"sourcesContent": ["import {\n TranscriptContainer_default,\n TranscriptionContainer\n} from \"./chunk-
|
|
3
|
+
"sources": ["TranscriptContainer-KNTN76RZ.cjs"],
|
|
4
|
+
"sourcesContent": ["import {\n TranscriptContainer_default,\n TranscriptionContainer\n} from \"./chunk-T4W4AKGM.cjs\";\nimport \"./chunk-LEHTJHKP.cjs\";\nexport {\n TranscriptionContainer,\n TranscriptContainer_default as default\n};\n//# sourceMappingURL=TranscriptContainer-KNTN76RZ.cjs.map\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAGO;AACP,4BAAO;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var app_graph_builder_CJSNQYJZ_exports = {};
|
|
20
|
+
__export(app_graph_builder_CJSNQYJZ_exports, {
|
|
21
|
+
default: () => app_graph_builder_default
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(app_graph_builder_CJSNQYJZ_exports);
|
|
24
|
+
var import_chunk_ZAE2IOZC = require("./chunk-ZAE2IOZC.cjs");
|
|
25
|
+
var import_chunk_LEHTJHKP = require("./chunk-LEHTJHKP.cjs");
|
|
26
|
+
var import_app_framework = require("@dxos/app-framework");
|
|
27
|
+
var import_plugin_graph = require("@dxos/plugin-graph");
|
|
28
|
+
var app_graph_builder_default = (context) => (0, import_app_framework.contributes)(import_app_framework.Capabilities.AppGraphBuilder, [
|
|
29
|
+
(0, import_plugin_graph.createExtension)({
|
|
30
|
+
id: `${import_chunk_LEHTJHKP.TRANSCRIPTION_PLUGIN}/transcription`,
|
|
31
|
+
filter: (node) => node.data instanceof import_chunk_ZAE2IOZC.TranscriptType,
|
|
32
|
+
actions: () => [
|
|
33
|
+
{
|
|
34
|
+
id: `${import_chunk_LEHTJHKP.TRANSCRIPTION_PLUGIN}/transcription`,
|
|
35
|
+
data: async () => {
|
|
36
|
+
const { dispatchPromise: dispatch } = context.requestCapability(import_app_framework.Capabilities.IntentDispatcher);
|
|
37
|
+
await dispatch((0, import_app_framework.createIntent)(import_chunk_ZAE2IOZC.TranscriptionAction.Summarize));
|
|
38
|
+
},
|
|
39
|
+
properties: {
|
|
40
|
+
label: [
|
|
41
|
+
"summarize label",
|
|
42
|
+
{
|
|
43
|
+
ns: import_chunk_LEHTJHKP.TRANSCRIPTION_PLUGIN
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
icon: "ph--book-open-text--regular"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
})
|
|
51
|
+
]);
|
|
52
|
+
//# sourceMappingURL=app-graph-builder-CJSNQYJZ.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/app-graph-builder.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, type PluginsContext } from '@dxos/app-framework';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\n\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { TranscriptionAction, TranscriptType } from '../types';\n\nexport default (context: PluginsContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${TRANSCRIPTION_PLUGIN}/transcription`,\n filter: (node): node is Node<TranscriptType> => node.data instanceof TranscriptType,\n actions: () => [\n {\n id: `${TRANSCRIPTION_PLUGIN}/transcription`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n await dispatch(createIntent(TranscriptionAction.Summarize));\n },\n properties: {\n label: ['summarize label', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--book-open-text--regular',\n },\n },\n ],\n }),\n ]);\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,2BAA6E;AAC7E,0BAA2C;AAK3C,IAAA,4BAAe,CAACA,gBACdC,kCAAYC,kCAAaC,iBAAiB;MACxCC,qCAAgB;IACdC,IAAI,GAAGC,0CAAAA;IACPC,QAAQ,CAACC,SAAuCA,KAAKC,gBAAgBC;IACrEC,SAAS,MAAM;MACb;QACEN,IAAI,GAAGC,0CAAAA;QACPG,MAAM,YAAA;AACJ,gBAAM,EAAEG,iBAAiBC,SAAQ,IAAKb,QAAQc,kBAAkBZ,kCAAaa,gBAAgB;AAC7F,gBAAMF,aAASG,mCAAaC,0CAAoBC,SAAS,CAAA;QAC3D;QACAC,YAAY;UACVC,OAAO;YAAC;YAAmB;cAAEC,IAAIf;YAAqB;;UACtDgB,MAAM;QACR;MACF;;EAEJ,CAAA;CACD;",
|
|
6
|
+
"names": ["context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "TRANSCRIPTION_PLUGIN", "filter", "node", "data", "TranscriptType", "actions", "dispatchPromise", "dispatch", "requestCapability", "IntentDispatcher", "createIntent", "TranscriptionAction", "Summarize", "properties", "label", "ns", "icon"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var chunk_EKSRBQX7_exports = {};
|
|
30
|
+
__export(chunk_EKSRBQX7_exports, {
|
|
31
|
+
MediaStreamRecorder: () => MediaStreamRecorder,
|
|
32
|
+
Transcriber: () => Transcriber,
|
|
33
|
+
getTimeStr: () => getTimeStr,
|
|
34
|
+
randomQueueDxn: () => randomQueueDxn,
|
|
35
|
+
summarizeTranscript: () => summarizeTranscript
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(chunk_EKSRBQX7_exports);
|
|
38
|
+
var import_chunk_ZAE2IOZC = require("./chunk-ZAE2IOZC.cjs");
|
|
39
|
+
var import_extendable_media_recorder = require("extendable-media-recorder");
|
|
40
|
+
var import_wavefile = require("wavefile");
|
|
41
|
+
var import_async = require("@dxos/async");
|
|
42
|
+
var import_invariant = require("@dxos/invariant");
|
|
43
|
+
var import_log = require("@dxos/log");
|
|
44
|
+
var import_tracing = require("@dxos/tracing");
|
|
45
|
+
var import_artifact = require("@dxos/artifact");
|
|
46
|
+
var import_assistant = require("@dxos/assistant");
|
|
47
|
+
var import_echo_db = require("@dxos/echo-db");
|
|
48
|
+
var import_echo_schema = require("@dxos/echo-schema");
|
|
49
|
+
var import_invariant2 = require("@dxos/invariant");
|
|
50
|
+
var import_keys = require("@dxos/keys");
|
|
51
|
+
var import_log2 = require("@dxos/log");
|
|
52
|
+
var import_echo_schema2 = require("@dxos/echo-schema");
|
|
53
|
+
var import_keys2 = require("@dxos/keys");
|
|
54
|
+
var import_wavefile2 = require("wavefile");
|
|
55
|
+
var import_async2 = require("@dxos/async");
|
|
56
|
+
var import_context = require("@dxos/context");
|
|
57
|
+
var import_log3 = require("@dxos/log");
|
|
58
|
+
var import_tracing2 = require("@dxos/tracing");
|
|
59
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
60
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
61
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
62
|
+
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;
|
|
63
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
64
|
+
}
|
|
65
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts";
|
|
66
|
+
var initializingPromise;
|
|
67
|
+
var initializeExtendableMediaRecorder = async () => {
|
|
68
|
+
const { connect } = await import("extendable-media-recorder-wav-encoder");
|
|
69
|
+
await (0, import_extendable_media_recorder.register)(await connect());
|
|
70
|
+
};
|
|
71
|
+
var MediaStreamRecorder = class {
|
|
72
|
+
constructor({ mediaStreamTrack, interval }) {
|
|
73
|
+
this._mediaRecorder = void 0;
|
|
74
|
+
this._header = void 0;
|
|
75
|
+
this._mediaStreamTrack = mediaStreamTrack;
|
|
76
|
+
this._interval = interval;
|
|
77
|
+
}
|
|
78
|
+
get wavConfig() {
|
|
79
|
+
const settings = this._mediaStreamTrack.getSettings();
|
|
80
|
+
return {
|
|
81
|
+
channels: settings.channelCount ?? 1,
|
|
82
|
+
sampleRate: settings.sampleRate ?? 16e3,
|
|
83
|
+
bitDepthCode: settings.sampleSize ? String(settings.sampleSize) : "16"
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
get mediaStreamTrack() {
|
|
87
|
+
return this._mediaStreamTrack;
|
|
88
|
+
}
|
|
89
|
+
setOnChunk(onChunk) {
|
|
90
|
+
this._onChunk = onChunk;
|
|
91
|
+
}
|
|
92
|
+
async start() {
|
|
93
|
+
await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) => import_log.log.info("initializeExtendableMediaRecorder", {
|
|
94
|
+
err
|
|
95
|
+
}, {
|
|
96
|
+
F: __dxlog_file,
|
|
97
|
+
L: 62,
|
|
98
|
+
S: this,
|
|
99
|
+
C: (f, a) => f(...a)
|
|
100
|
+
}));
|
|
101
|
+
if (!this._mediaRecorder) {
|
|
102
|
+
const stream = new MediaStream([
|
|
103
|
+
this._mediaStreamTrack
|
|
104
|
+
]);
|
|
105
|
+
this._mediaRecorder = new import_extendable_media_recorder.MediaRecorder(stream, {
|
|
106
|
+
mimeType: "audio/wav"
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (this._mediaRecorder.state === "recording") {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
(0, import_invariant.invariant)(this._onChunk, "MediaStreamRecorder: onChunk is not set", {
|
|
113
|
+
F: __dxlog_file,
|
|
114
|
+
L: 73,
|
|
115
|
+
S: this,
|
|
116
|
+
A: [
|
|
117
|
+
"this._onChunk",
|
|
118
|
+
"'MediaStreamRecorder: onChunk is not set'"
|
|
119
|
+
]
|
|
120
|
+
});
|
|
121
|
+
this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);
|
|
122
|
+
this._mediaRecorder.start(this._interval);
|
|
123
|
+
}
|
|
124
|
+
async stop() {
|
|
125
|
+
if (this._mediaRecorder?.state !== "recording") {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this._mediaRecorder.stop();
|
|
129
|
+
}
|
|
130
|
+
async _ondataavailable(event) {
|
|
131
|
+
const blob = event.data;
|
|
132
|
+
const uint8Array = new Uint8Array(await blob.arrayBuffer());
|
|
133
|
+
const isHeader = uint8Array[0] === 82 && // R
|
|
134
|
+
uint8Array[1] === 73 && // I
|
|
135
|
+
uint8Array[2] === 70 && // F
|
|
136
|
+
uint8Array[3] === 70;
|
|
137
|
+
let wav;
|
|
138
|
+
if (isHeader) {
|
|
139
|
+
wav = new import_wavefile.WaveFile(uint8Array);
|
|
140
|
+
this._header = uint8Array.slice(0, 44);
|
|
141
|
+
} else if (this._header) {
|
|
142
|
+
wav = new import_wavefile.WaveFile(new Uint8Array([
|
|
143
|
+
...this._header,
|
|
144
|
+
...uint8Array
|
|
145
|
+
]));
|
|
146
|
+
} else {
|
|
147
|
+
import_log.log.warn("MediaStreamRecorder: no header", void 0, {
|
|
148
|
+
F: __dxlog_file,
|
|
149
|
+
L: 104,
|
|
150
|
+
S: this,
|
|
151
|
+
C: (f, a) => f(...a)
|
|
152
|
+
});
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
this._onChunk({
|
|
156
|
+
timestamp: Date.now(),
|
|
157
|
+
data: wav.getSamples()
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
_ts_decorate([
|
|
162
|
+
import_async.synchronized
|
|
163
|
+
], MediaStreamRecorder.prototype, "_ondataavailable", null);
|
|
164
|
+
MediaStreamRecorder = _ts_decorate([
|
|
165
|
+
import_tracing.trace.resource()
|
|
166
|
+
], MediaStreamRecorder);
|
|
167
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/transcriber/summarize.ts";
|
|
168
|
+
var summarizeTranscript = async (edge, ai, transcript, context) => {
|
|
169
|
+
(0, import_invariant2.invariant)(transcript.queue, "No queue for transcript", {
|
|
170
|
+
F: __dxlog_file2,
|
|
171
|
+
L: 23,
|
|
172
|
+
S: void 0,
|
|
173
|
+
A: [
|
|
174
|
+
"transcript.queue",
|
|
175
|
+
"'No queue for transcript'"
|
|
176
|
+
]
|
|
177
|
+
});
|
|
178
|
+
const queue = new import_echo_db.QueueImpl(edge, import_keys.DXN.parse(transcript.queue));
|
|
179
|
+
await queue.refresh();
|
|
180
|
+
const content = queue.items.filter((block) => (0, import_echo_schema.isInstanceOf)(import_chunk_ZAE2IOZC.TranscriptBlock, block)).map((block) => `${block.authorName}: ${block.segments.map((segment) => segment.text).join("\n")}`).join("\n\n");
|
|
181
|
+
const parser = new import_assistant.MixedStreamParser();
|
|
182
|
+
import_log2.log.info("summarizing transcript", {
|
|
183
|
+
blockCount: queue.items.length
|
|
184
|
+
}, {
|
|
185
|
+
F: __dxlog_file2,
|
|
186
|
+
L: 34,
|
|
187
|
+
S: void 0,
|
|
188
|
+
C: (f, a) => f(...a)
|
|
189
|
+
});
|
|
190
|
+
const output = await parser.parse(await ai.exec({
|
|
191
|
+
model: import_assistant.DEFAULT_EDGE_MODEL,
|
|
192
|
+
systemPrompt: SUMMARIZE_PROMPT,
|
|
193
|
+
history: [
|
|
194
|
+
(0, import_echo_schema.createStatic)(import_artifact.Message, {
|
|
195
|
+
role: "user",
|
|
196
|
+
content: [
|
|
197
|
+
{
|
|
198
|
+
type: "text",
|
|
199
|
+
text: content
|
|
200
|
+
}
|
|
201
|
+
]
|
|
202
|
+
})
|
|
203
|
+
]
|
|
204
|
+
}));
|
|
205
|
+
import_log2.log.info("transcript summary", {
|
|
206
|
+
output
|
|
207
|
+
}, {
|
|
208
|
+
F: __dxlog_file2,
|
|
209
|
+
L: 43,
|
|
210
|
+
S: void 0,
|
|
211
|
+
C: (f, a) => f(...a)
|
|
212
|
+
});
|
|
213
|
+
(0, import_invariant2.invariant)(output[0].content[0].type === "text", "Expected text content", {
|
|
214
|
+
F: __dxlog_file2,
|
|
215
|
+
L: 44,
|
|
216
|
+
S: void 0,
|
|
217
|
+
A: [
|
|
218
|
+
"output[0].content[0].type === 'text'",
|
|
219
|
+
"'Expected text content'"
|
|
220
|
+
]
|
|
221
|
+
});
|
|
222
|
+
return output[0].content[0].text;
|
|
223
|
+
};
|
|
224
|
+
var SUMMARIZE_PROMPT = `
|
|
225
|
+
# Goal
|
|
226
|
+
Create a markdown summary of the transcript provided.
|
|
227
|
+
|
|
228
|
+
# Formatting
|
|
229
|
+
- Format the summary as a markdown document without extra comments like "Here is the summary of the transcript:".
|
|
230
|
+
- Use markdown formatting for headings and bullet points.
|
|
231
|
+
- Format the summary as a list of key points and takeaways.
|
|
232
|
+
- All names of people should be in bold.
|
|
233
|
+
|
|
234
|
+
# Note Taking
|
|
235
|
+
- Correlate items in the summary with the person of origin to build a coherent narrative.
|
|
236
|
+
- Include short quotes verbatim where appropriate. Especially when concerned with design decisions and problem descriptions.
|
|
237
|
+
|
|
238
|
+
# Tasks
|
|
239
|
+
At the end of the summary include tasks.
|
|
240
|
+
Extract only the tasks that are:
|
|
241
|
+
- Directly actionable.
|
|
242
|
+
- Clearly assigned to a person or team (or can easily be inferred).
|
|
243
|
+
- Strongly implied by the conversation and/or user note (no speculative tasks).
|
|
244
|
+
- Specific enough that someone reading them would know exactly what to do next.
|
|
245
|
+
|
|
246
|
+
Format all tasks as markdown checkboxes using the syntax:
|
|
247
|
+
- [ ] Task description.
|
|
248
|
+
|
|
249
|
+
Additional information can be included (indented).
|
|
250
|
+
|
|
251
|
+
If no actionable tasks are found, omit this tasks section.
|
|
252
|
+
`;
|
|
253
|
+
var getTimeStr = (timestamp) => new Date(timestamp ?? Date.now()).toLocaleTimeString("en-US", {
|
|
254
|
+
timeZone: "UTC",
|
|
255
|
+
hour12: true,
|
|
256
|
+
hour: "numeric",
|
|
257
|
+
minute: "2-digit",
|
|
258
|
+
second: "2-digit"
|
|
259
|
+
});
|
|
260
|
+
var randomQueueDxn = (spaceId) => new import_keys2.DXN(import_keys2.DXN.kind.QUEUE, [
|
|
261
|
+
import_keys2.QueueSubspaceTags.DATA,
|
|
262
|
+
spaceId ?? import_keys2.SpaceId.random(),
|
|
263
|
+
import_echo_schema2.ObjectId.random()
|
|
264
|
+
]);
|
|
265
|
+
var mergeFloat64Arrays = (arrays) => {
|
|
266
|
+
const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));
|
|
267
|
+
let offset = 0;
|
|
268
|
+
for (const array of arrays) {
|
|
269
|
+
newArray.set(array, offset);
|
|
270
|
+
offset += array.length;
|
|
271
|
+
}
|
|
272
|
+
return newArray;
|
|
273
|
+
};
|
|
274
|
+
function _ts_decorate2(decorators, target, key, desc) {
|
|
275
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
276
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
277
|
+
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;
|
|
278
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
279
|
+
}
|
|
280
|
+
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts";
|
|
281
|
+
var Transcriber = class extends import_context.Resource {
|
|
282
|
+
constructor({ config, recorder, onSegments }) {
|
|
283
|
+
super();
|
|
284
|
+
this._audioChunks = [];
|
|
285
|
+
this._lastUsedTimestamp = 0;
|
|
286
|
+
this._openTrigger = new import_async2.Trigger({
|
|
287
|
+
autoReset: true
|
|
288
|
+
});
|
|
289
|
+
this._recording = false;
|
|
290
|
+
this._transcribeTask = void 0;
|
|
291
|
+
this._config = config;
|
|
292
|
+
this._recorder = recorder;
|
|
293
|
+
this._onSegments = onSegments;
|
|
294
|
+
}
|
|
295
|
+
async _open(ctx) {
|
|
296
|
+
this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));
|
|
297
|
+
await this._recorder.start();
|
|
298
|
+
this._transcribeTask = new import_async2.DeferredTask(ctx, async () => this._transcribe());
|
|
299
|
+
this._openTrigger.wake();
|
|
300
|
+
}
|
|
301
|
+
async _close() {
|
|
302
|
+
this._recording = false;
|
|
303
|
+
this._transcribeTask = void 0;
|
|
304
|
+
await this._recorder.stop();
|
|
305
|
+
}
|
|
306
|
+
startChunksRecording() {
|
|
307
|
+
if (this._lifecycleState !== import_context.LifecycleState.OPEN) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
this._recording = true;
|
|
311
|
+
}
|
|
312
|
+
stopChunksRecording() {
|
|
313
|
+
if (this._lifecycleState !== import_context.LifecycleState.OPEN || !this._recording) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
this._recording = false;
|
|
317
|
+
this._transcribeTask?.schedule();
|
|
318
|
+
}
|
|
319
|
+
_saveAudioChunk(chunk) {
|
|
320
|
+
(0, import_log3.log)("saving audio chunk", {
|
|
321
|
+
chunk
|
|
322
|
+
}, {
|
|
323
|
+
F: __dxlog_file3,
|
|
324
|
+
L: 124,
|
|
325
|
+
S: this,
|
|
326
|
+
C: (f, a) => f(...a)
|
|
327
|
+
});
|
|
328
|
+
this._audioChunks.push(chunk);
|
|
329
|
+
if (!this._recording && (!this._transcribeTask || !this._transcribeTask.scheduled) && this._audioChunks.length >= this._config.prefixBufferChunksAmount) {
|
|
330
|
+
this._audioChunks = this._dropOldChunks();
|
|
331
|
+
} else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {
|
|
332
|
+
this._transcribeTask?.schedule();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
async _transcribe() {
|
|
336
|
+
(0, import_log3.log)("transcribing", {
|
|
337
|
+
chunks: this._audioChunks.length
|
|
338
|
+
}, {
|
|
339
|
+
F: __dxlog_file3,
|
|
340
|
+
L: 140,
|
|
341
|
+
S: this,
|
|
342
|
+
C: (f, a) => f(...a)
|
|
343
|
+
});
|
|
344
|
+
const chunks = this._audioChunks;
|
|
345
|
+
this._audioChunks = this._dropOldChunks();
|
|
346
|
+
if (chunks.length === 0) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
const audio = await this._mergeAudioChunks(chunks);
|
|
350
|
+
const segments = await this._fetchTranscription(audio);
|
|
351
|
+
if (!Array.isArray(segments) || segments.length === 0) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
const alignedSegments = this._alignSegments(segments, chunks);
|
|
355
|
+
if (alignedSegments.length > 0) {
|
|
356
|
+
await this._onSegments(alignedSegments);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
_dropOldChunks() {
|
|
360
|
+
return this._config.prefixBufferChunksAmount > 0 ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount) : [];
|
|
361
|
+
}
|
|
362
|
+
async _mergeAudioChunks(chunks) {
|
|
363
|
+
const file = new import_wavefile2.WaveFile();
|
|
364
|
+
const wavConfig = this._recorder.wavConfig;
|
|
365
|
+
file.fromScratch(wavConfig.channels, wavConfig.sampleRate, wavConfig.bitDepthCode, mergeFloat64Arrays(chunks.map(({ data }) => data)));
|
|
366
|
+
return file.toBase64();
|
|
367
|
+
}
|
|
368
|
+
async _fetchTranscription(audio) {
|
|
369
|
+
if (audio.length === 0) {
|
|
370
|
+
this._audioChunks = [];
|
|
371
|
+
throw new Error("No audio to send for transcribing");
|
|
372
|
+
}
|
|
373
|
+
const response = await fetch(`${import_chunk_ZAE2IOZC.TRANSCRIPTION_URL}/transcribe`, {
|
|
374
|
+
method: "POST",
|
|
375
|
+
body: JSON.stringify({
|
|
376
|
+
audio
|
|
377
|
+
}),
|
|
378
|
+
headers: {
|
|
379
|
+
"Content-Type": "application/json"
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
if (!response.ok) {
|
|
383
|
+
this._audioChunks = [];
|
|
384
|
+
throw new Error("Failed to transcribe");
|
|
385
|
+
}
|
|
386
|
+
const { segments } = await response.json();
|
|
387
|
+
import_log3.log.info("transcription response", {
|
|
388
|
+
segments,
|
|
389
|
+
string: segments.map((segments2) => segments2.text).join(" ")
|
|
390
|
+
}, {
|
|
391
|
+
F: __dxlog_file3,
|
|
392
|
+
L: 206,
|
|
393
|
+
S: this,
|
|
394
|
+
C: (f, a) => f(...a)
|
|
395
|
+
});
|
|
396
|
+
return segments;
|
|
397
|
+
}
|
|
398
|
+
_alignSegments(segments, originalChunks) {
|
|
399
|
+
const zeroTimestamp = originalChunks.at(0).timestamp;
|
|
400
|
+
const filteredSegments = segments.filter((segment) => zeroTimestamp + segment.end * 1e3 >= this._lastUsedTimestamp).map((segment) => {
|
|
401
|
+
const words = segment.words.filter((word) => zeroTimestamp + word.start * 1e3 >= this._lastUsedTimestamp);
|
|
402
|
+
return {
|
|
403
|
+
...segment,
|
|
404
|
+
words,
|
|
405
|
+
text: words.map((word) => word.word).join(""),
|
|
406
|
+
start: words.at(0)?.start ?? segment.end
|
|
407
|
+
};
|
|
408
|
+
}).filter((segment) => segment.words.length > 0);
|
|
409
|
+
if (filteredSegments.length === 0) {
|
|
410
|
+
return [];
|
|
411
|
+
}
|
|
412
|
+
this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1).end * 1e3;
|
|
413
|
+
return filteredSegments.map((segment) => ({
|
|
414
|
+
started: new Date(zeroTimestamp + segment.start * 1e3),
|
|
415
|
+
text: segment.text
|
|
416
|
+
}));
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
_ts_decorate2([
|
|
420
|
+
import_tracing2.trace.span({
|
|
421
|
+
showInBrowserTimeline: true
|
|
422
|
+
})
|
|
423
|
+
], Transcriber.prototype, "_mergeAudioChunks", null);
|
|
424
|
+
_ts_decorate2([
|
|
425
|
+
import_tracing2.trace.span({
|
|
426
|
+
showInBrowserTimeline: true
|
|
427
|
+
})
|
|
428
|
+
], Transcriber.prototype, "_fetchTranscription", null);
|
|
429
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
430
|
+
0 && (module.exports = {
|
|
431
|
+
MediaStreamRecorder,
|
|
432
|
+
Transcriber,
|
|
433
|
+
getTimeStr,
|
|
434
|
+
randomQueueDxn,
|
|
435
|
+
summarizeTranscript
|
|
436
|
+
});
|
|
437
|
+
//# sourceMappingURL=chunk-EKSRBQX7.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/transcriber/media-stream-recorder.ts", "../../../src/transcriber/summarize.ts", "../../../src/util/get-time-str.ts", "../../../src/util/random-queue-dxn.ts", "../../../src/util/array.ts", "../../../src/transcriber/transcriber.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type IBlobEvent, type IMediaRecorder, MediaRecorder, register } from 'extendable-media-recorder';\nimport { WaveFile } from 'wavefile';\n\nimport { synchronized } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type WavConfig, type AudioChunk, type AudioRecorder } from './audio-recorder';\n\nlet initializingPromise: Promise<void> | undefined;\n\nconst initializeExtendableMediaRecorder = async () => {\n const { connect } = await import('extendable-media-recorder-wav-encoder');\n await register(await connect());\n};\n\n/**\n * Recorder that uses the MediaContext API and AudioNode API to record audio.\n *\n * It records MediaStream using https://www.npmjs.com/package/extendable-media-recorder.\n */\n@trace.resource()\nexport class MediaStreamRecorder implements AudioRecorder {\n private readonly _mediaStreamTrack: MediaStreamTrack;\n /**\n * Default MediaRecorder implementation do not support wav encoding.\n */\n private readonly _interval: number;\n private _mediaRecorder?: IMediaRecorder = undefined;\n private _header?: Uint8Array = undefined;\n private _onChunk?: (chunk: AudioChunk) => void;\n\n constructor({ mediaStreamTrack, interval }: { mediaStreamTrack: MediaStreamTrack; interval: number }) {\n this._mediaStreamTrack = mediaStreamTrack;\n this._interval = interval;\n }\n\n get wavConfig(): WavConfig {\n const settings = this._mediaStreamTrack.getSettings();\n return {\n channels: settings.channelCount ?? 1,\n sampleRate: settings.sampleRate ?? 16000,\n bitDepthCode: settings.sampleSize ? String(settings.sampleSize) : '16',\n };\n }\n\n get mediaStreamTrack() {\n return this._mediaStreamTrack;\n }\n\n setOnChunk(onChunk: (chunk: AudioChunk) => void): void {\n this._onChunk = onChunk;\n }\n\n async start() {\n await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) =>\n log.info('initializeExtendableMediaRecorder', { err }),\n );\n\n if (!this._mediaRecorder) {\n const stream = new MediaStream([this._mediaStreamTrack]);\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' });\n }\n\n if (this._mediaRecorder.state === 'recording') {\n return;\n }\n invariant(this._onChunk, 'MediaStreamRecorder: onChunk is not set');\n this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);\n this._mediaRecorder.start(this._interval);\n }\n\n async stop() {\n if (this._mediaRecorder?.state !== 'recording') {\n return;\n }\n this._mediaRecorder.stop();\n }\n\n @synchronized\n private async _ondataavailable(event: IBlobEvent) {\n const blob = event.data;\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\n\n // First chunk from the MediaRecorder has a header.\n const isHeader =\n uint8Array[0] === 0x52 && // R\n uint8Array[1] === 0x49 && // I\n uint8Array[2] === 0x46 && // F\n uint8Array[3] === 0x46; // F\n let wav: WaveFile;\n\n if (isHeader) {\n wav = new WaveFile(uint8Array);\n this._header = uint8Array.slice(0, 44);\n } else if (this._header) {\n wav = new WaveFile(new Uint8Array([...this._header, ...uint8Array]));\n } else {\n log.warn('MediaStreamRecorder: no header');\n return;\n }\n\n this._onChunk!({\n timestamp: Date.now(),\n data: wav.getSamples(),\n });\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Message } from '@dxos/artifact';\nimport { DEFAULT_EDGE_MODEL, MixedStreamParser, type AIServiceClient } from '@dxos/assistant';\nimport { QueueImpl } from '@dxos/echo-db';\nimport { createStatic, isInstanceOf } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type EdgeHttpClient } from '@dxos/react-edge-client';\n\nimport { TranscriptBlock, type TranscriptType } from '../types';\n\nexport const summarizeTranscript = async (\n edge: EdgeHttpClient,\n ai: AIServiceClient,\n transcript: TranscriptType,\n // TODO(wittjosiah): Add additional context into the prompt.\n context?: string,\n): Promise<string> => {\n invariant(transcript.queue, 'No queue for transcript');\n\n const queue = new QueueImpl(edge, DXN.parse(transcript.queue));\n await queue.refresh();\n const content = queue.items\n .filter((block) => isInstanceOf(TranscriptBlock, block))\n .map((block) => `${block.authorName}: ${block.segments.map((segment) => segment.text).join('\\n')}`)\n .join('\\n\\n');\n\n const parser = new MixedStreamParser();\n\n log.info('summarizing transcript', { blockCount: queue.items.length });\n const output = await parser.parse(\n await ai.exec({\n model: DEFAULT_EDGE_MODEL,\n systemPrompt: SUMMARIZE_PROMPT,\n history: [createStatic(Message, { role: 'user', content: [{ type: 'text', text: content }] })],\n }),\n );\n\n log.info('transcript summary', { output });\n invariant(output[0].content[0].type === 'text', 'Expected text content');\n return output[0].content[0].text;\n};\n\n// TODO(dmaretskyi): Add example to set consistent structure for the summary.\nconst SUMMARIZE_PROMPT = `\n # Goal\n Create a markdown summary of the transcript provided.\n\n # Formatting\n - Format the summary as a markdown document without extra comments like \"Here is the summary of the transcript:\".\n - Use markdown formatting for headings and bullet points.\n - Format the summary as a list of key points and takeaways.\n - All names of people should be in bold.\n\n # Note Taking\n - Correlate items in the summary with the person of origin to build a coherent narrative.\n - Include short quotes verbatim where appropriate. Especially when concerned with design decisions and problem descriptions.\n\n # Tasks\n At the end of the summary include tasks.\n Extract only the tasks that are:\n - Directly actionable.\n - Clearly assigned to a person or team (or can easily be inferred).\n - Strongly implied by the conversation and/or user note (no speculative tasks).\n - Specific enough that someone reading them would know exactly what to do next.\n\n Format all tasks as markdown checkboxes using the syntax:\n - [ ] Task description.\n\n Additional information can be included (indented).\n\n If no actionable tasks are found, omit this tasks section.\n`;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nexport const getTimeStr = (timestamp?: number) =>\n new Date(timestamp ?? Date.now()).toLocaleTimeString('en-US', {\n timeZone: 'UTC',\n hour12: true,\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ObjectId } from '@dxos/echo-schema';\nimport { DXN, QueueSubspaceTags, SpaceId } from '@dxos/keys';\n\nexport const randomQueueDxn = (spaceId?: SpaceId) =>\n new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, spaceId ?? SpaceId.random(), ObjectId.random()]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nexport const mergeFloat64Arrays = (arrays: Float64Array[]) => {\n const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));\n let offset = 0;\n for (const array of arrays) {\n newArray.set(array, offset);\n offset += array.length;\n }\n\n return newArray;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { WaveFile } from 'wavefile';\n\nimport { DeferredTask, Trigger } from '@dxos/async';\nimport { type Context, LifecycleState, Resource } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type AudioRecorder, type AudioChunk } from './audio-recorder';\nimport { TRANSCRIPTION_URL, type TranscriptSegment } from '../types';\nimport { mergeFloat64Arrays } from '../util';\n\ntype WhisperWord = {\n word: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n};\n\ntype WhisperSegment = {\n text: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n\n /**\n * Probability of no speech in the segment.\n */\n no_speech_prob: number;\n\n words: WhisperWord[];\n};\n\nexport type TranscribeConfig = {\n /**\n * Number of chunks to transcribe automatically after.\n */\n transcribeAfterChunksAmount: number;\n\n /**\n * Number of chunks to save before the user starts speaking.\n * This is needed to catch the beginning of the user's speech.\n */\n prefixBufferChunksAmount: number;\n};\n\nexport type TranscriberParams = {\n config: TranscribeConfig;\n recorder: AudioRecorder;\n onSegments: (segments: TranscriptSegment[]) => Promise<void>;\n};\n\n/**\n * Handles transcription of audio chunks.\n * If user is not speaking, the last `minChunksAmount` chunks are saved and transcribed.\n * If user is speaking, the chunks are added to the buffer until the user is done talking.\n */\nexport class Transcriber extends Resource {\n private _audioChunks: AudioChunk[] = [];\n private _lastUsedTimestamp = 0;\n\n private readonly _openTrigger = new Trigger({ autoReset: true });\n\n private readonly _config: TranscribeConfig;\n private readonly _recorder: AudioRecorder;\n private readonly _onSegments: TranscriberParams['onSegments'];\n\n private _recording = false;\n private _transcribeTask?: DeferredTask = undefined;\n\n constructor({ config, recorder, onSegments }: TranscriberParams) {\n super();\n this._config = config;\n this._recorder = recorder;\n this._onSegments = onSegments;\n }\n\n protected override async _open(ctx: Context) {\n this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));\n await this._recorder.start();\n this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());\n this._openTrigger.wake();\n }\n\n protected override async _close() {\n this._recording = false;\n this._transcribeTask = undefined;\n await this._recorder.stop();\n }\n\n startChunksRecording() {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n this._recording = true;\n }\n\n stopChunksRecording() {\n if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {\n return;\n }\n this._recording = false;\n this._transcribeTask?.schedule();\n }\n\n private _saveAudioChunk(chunk: AudioChunk) {\n log('saving audio chunk', { chunk });\n this._audioChunks.push(chunk);\n\n // Clean the buffer if the user is not speaking and the transcription task is not scheduled.\n if (\n !this._recording &&\n (!this._transcribeTask || !this._transcribeTask.scheduled) &&\n this._audioChunks.length >= this._config.prefixBufferChunksAmount\n ) {\n this._audioChunks = this._dropOldChunks();\n } else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {\n this._transcribeTask?.schedule();\n }\n }\n\n private async _transcribe() {\n log('transcribing', { chunks: this._audioChunks.length });\n const chunks = this._audioChunks;\n this._audioChunks = this._dropOldChunks();\n if (chunks.length === 0) {\n return;\n }\n\n const audio = await this._mergeAudioChunks(chunks);\n const segments = await this._fetchTranscription(audio);\n if (!Array.isArray(segments) || segments.length === 0) {\n return;\n }\n\n const alignedSegments = this._alignSegments(segments, chunks);\n if (alignedSegments.length > 0) {\n await this._onSegments(alignedSegments);\n }\n }\n\n private _dropOldChunks() {\n return this._config.prefixBufferChunksAmount > 0\n ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount)\n : [];\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _mergeAudioChunks(chunks: AudioChunk[]) {\n const file = new WaveFile();\n const wavConfig = this._recorder.wavConfig;\n\n file.fromScratch(\n wavConfig.channels,\n wavConfig.sampleRate,\n wavConfig.bitDepthCode,\n mergeFloat64Arrays(chunks.map(({ data }) => data)),\n );\n\n return file.toBase64();\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _fetchTranscription(audio: string) {\n if (audio.length === 0) {\n this._audioChunks = [];\n throw new Error('No audio to send for transcribing');\n }\n\n const response = await fetch(`${TRANSCRIPTION_URL}/transcribe`, {\n method: 'POST',\n body: JSON.stringify({ audio }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n this._audioChunks = [];\n throw new Error('Failed to transcribe');\n }\n\n const {\n segments,\n }: {\n segments: WhisperSegment[];\n } = await response.json();\n\n log.info('transcription response', {\n segments,\n string: segments.map((segments) => segments.text).join(' '),\n });\n\n return segments;\n }\n\n private _alignSegments(segments: WhisperSegment[], originalChunks: AudioChunk[]): TranscriptSegment[] {\n // Absolute zero for all relative timestamps in the segments.\n const zeroTimestamp = originalChunks.at(0)!.timestamp;\n\n const filteredSegments = segments\n // Use segments that end after the last used timestamp.\n // Segments could overlap, so we need to filter words that starts after the last used timestamp.\n .filter((segment) => zeroTimestamp + segment.end * 1_000 >= this._lastUsedTimestamp)\n // Use words that starts after the last used timestamp.\n .map((segment) => {\n const words = segment.words.filter((word) => zeroTimestamp + word.start * 1_000 >= this._lastUsedTimestamp);\n return {\n ...segment,\n words,\n text: words.map((word) => word.word).join(''),\n start: words.at(0)?.start ?? segment.end,\n };\n })\n .filter((segment) => segment.words.length > 0);\n\n if (filteredSegments.length === 0) {\n return [];\n }\n\n // Update last timestamp.\n this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1)!.end * 1_000;\n\n // Add absolute timestamp to each segment.\n return filteredSegments.map((segment) => ({\n started: new Date(zeroTimestamp + segment.start * 1_000),\n text: segment.text,\n }));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_invariant", "import_log", "import_echo_schema", "import_keys", "import_wavefile", "import_async", "import_tracing", "initializingPromise", "initializeExtendableMediaRecorder", "connect", "register", "MediaStreamRecorder", "constructor", "mediaStreamTrack", "interval", "_mediaRecorder", "undefined", "_header", "_mediaStreamTrack", "_interval", "wavConfig", "settings", "getSettings", "channels", "channelCount", "sampleRate", "bitDepthCode", "sampleSize", "String", "setOnChunk", "onChunk", "_onChunk", "start", "catch", "err", "log", "info", "stream", "MediaStream", "MediaRecorder", "mimeType", "state", "invariant", "ondataavailable", "event", "_ondataavailable", "stop", "blob", "data", "uint8Array", "Uint8Array", "arrayBuffer", "isHeader", "wav", "WaveFile", "slice", "warn", "timestamp", "Date", "now", "getSamples", "synchronized", "trace", "resource", "summarizeTranscript", "edge", "ai", "transcript", "context", "queue", "QueueImpl", "DXN", "parse", "refresh", "content", "items", "filter", "block", "isInstanceOf", "TranscriptBlock", "map", "authorName", "segments", "segment", "text", "join", "parser", "MixedStreamParser", "blockCount", "length", "output", "exec", "model", "DEFAULT_EDGE_MODEL", "systemPrompt", "SUMMARIZE_PROMPT", "history", "createStatic", "Message", "role", "type", "getTimeStr", "toLocaleTimeString", "timeZone", "hour12", "hour", "minute", "second", "randomQueueDxn", "spaceId", "kind", "QUEUE", "QueueSubspaceTags", "DATA", "SpaceId", "random", "ObjectId", "mergeFloat64Arrays", "arrays", "newArray", "Float64Array", "reduce", "acc", "array", "offset", "set", "Transcriber", "Resource", "config", "recorder", "onSegments", "_audioChunks", "_lastUsedTimestamp", "_openTrigger", "Trigger", "autoReset", "_recording", "_transcribeTask", "_config", "_recorder", "_onSegments", "_open", "ctx", "chunk", "_saveAudioChunk", "DeferredTask", "_transcribe", "wake", "_close", "startChunksRecording", "_lifecycleState", "LifecycleState", "OPEN", "stopChunksRecording", "schedule", "push", "scheduled", "prefixBufferChunksAmount", "_dropOldChunks", "transcribeAfterChunksAmount", "chunks", "audio", "_mergeAudioChunks", "_fetchTranscription", "Array", "isArray", "alignedSegments", "_alignSegments", "file", "fromScratch", "toBase64", "Error", "response", "fetch", "TRANSCRIPTION_URL", "method", "body", "JSON", "stringify", "headers", "ok", "json", "string", "originalChunks", "zeroTimestamp", "at", "filteredSegments", "end", "words", "word", "started", "span", "showInBrowserTimeline"]
|
|
7
|
+
}
|
|
@@ -26,15 +26,15 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var
|
|
30
|
-
__export(
|
|
29
|
+
var chunk_I6CUIAQH_exports = {};
|
|
30
|
+
__export(chunk_I6CUIAQH_exports, {
|
|
31
31
|
TranscriptContainer: () => TranscriptContainer
|
|
32
32
|
});
|
|
33
|
-
module.exports = __toCommonJS(
|
|
33
|
+
module.exports = __toCommonJS(chunk_I6CUIAQH_exports);
|
|
34
34
|
var import_react = require("react");
|
|
35
|
-
var TranscriptContainer = (0, import_react.lazy)(() => import("./TranscriptContainer-
|
|
35
|
+
var TranscriptContainer = (0, import_react.lazy)(() => import("./TranscriptContainer-KNTN76RZ.cjs"));
|
|
36
36
|
// Annotate the CommonJS export names for ESM import in node:
|
|
37
37
|
0 && (module.exports = {
|
|
38
38
|
TranscriptContainer
|
|
39
39
|
});
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
40
|
+
//# sourceMappingURL=chunk-I6CUIAQH.cjs.map
|
|
@@ -16,11 +16,27 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
21
|
-
|
|
19
|
+
var chunk_LEHTJHKP_exports = {};
|
|
20
|
+
__export(chunk_LEHTJHKP_exports, {
|
|
21
|
+
TRANSCRIPTION_PLUGIN: () => TRANSCRIPTION_PLUGIN,
|
|
22
|
+
meta: () => meta
|
|
22
23
|
});
|
|
23
|
-
module.exports = __toCommonJS(
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
|
|
24
|
+
module.exports = __toCommonJS(chunk_LEHTJHKP_exports);
|
|
25
|
+
var TRANSCRIPTION_PLUGIN = "dxos.org/plugin/transcription";
|
|
26
|
+
var meta = {
|
|
27
|
+
id: TRANSCRIPTION_PLUGIN,
|
|
28
|
+
name: "Transcription",
|
|
29
|
+
description: "Voice transcription.",
|
|
30
|
+
icon: "ph--microphone--regular",
|
|
31
|
+
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-transcription",
|
|
32
|
+
tags: [
|
|
33
|
+
"experimental"
|
|
34
|
+
],
|
|
35
|
+
screenshots: []
|
|
36
|
+
};
|
|
37
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
38
|
+
0 && (module.exports = {
|
|
39
|
+
TRANSCRIPTION_PLUGIN,
|
|
40
|
+
meta
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=chunk-LEHTJHKP.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/meta.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const TRANSCRIPTION_PLUGIN = 'dxos.org/plugin/transcription';\n\nexport const meta: PluginMeta = {\n id: TRANSCRIPTION_PLUGIN,\n name: 'Transcription',\n description: 'Voice transcription.',\n icon: 'ph--microphone--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-transcription',\n tags: ['experimental'],\n screenshots: [],\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAMA,uBAAuB;AAE7B,IAAMC,OAAmB;EAC9BC,IAAIF;EACJG,MAAM;EACNC,aAAa;EACbC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;EACPC,aAAa,CAAA;AACf;",
|
|
6
|
+
"names": ["TRANSCRIPTION_PLUGIN", "meta", "id", "name", "description", "icon", "source", "tags", "screenshots"]
|
|
7
|
+
}
|