@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.
Files changed (152) hide show
  1. package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs → TranscriptContainer-TJXP6ICP.mjs} +3 -3
  2. package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs +39 -0
  3. package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-AS364WZZ.mjs → chunk-3NWYXRZS.mjs} +2 -2
  5. package/dist/lib/browser/chunk-MD4NQO6W.mjs +252 -0
  6. package/dist/lib/browser/chunk-MD4NQO6W.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-N3VKF2J3.mjs +415 -0
  8. package/dist/lib/browser/chunk-N3VKF2J3.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-YEVVZZTC.mjs +19 -0
  10. package/dist/lib/browser/chunk-YEVVZZTC.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-QIHUPVQD.mjs → chunk-YRW4MNRE.mjs} +23 -24
  12. package/dist/lib/browser/chunk-YRW4MNRE.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +203 -366
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs +73 -0
  16. package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs.map +7 -0
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs → react-surface-OM2EECBI.mjs} +15 -8
  19. package/dist/lib/browser/{react-surface-FOEWLLTZ.mjs.map → react-surface-OM2EECBI.mjs.map} +2 -2
  20. package/dist/lib/browser/types/index.mjs +2 -1
  21. package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs → TranscriptContainer-KNTN76RZ.cjs} +8 -8
  22. package/dist/lib/node/{TranscriptContainer-HU763SN3.cjs.map → TranscriptContainer-KNTN76RZ.cjs.map} +2 -2
  23. package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs +52 -0
  24. package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs.map +7 -0
  25. package/dist/lib/node/chunk-EKSRBQX7.cjs +437 -0
  26. package/dist/lib/node/chunk-EKSRBQX7.cjs.map +7 -0
  27. package/dist/lib/node/{chunk-QWXLQPP5.cjs → chunk-I6CUIAQH.cjs} +5 -5
  28. package/dist/lib/node/{app-graph-builder-YFBX3OTP.cjs → chunk-LEHTJHKP.cjs} +23 -7
  29. package/dist/lib/node/chunk-LEHTJHKP.cjs.map +7 -0
  30. package/dist/lib/node/chunk-T4W4AKGM.cjs +279 -0
  31. package/dist/lib/node/chunk-T4W4AKGM.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-UIHEGU6Q.cjs → chunk-ZAE2IOZC.cjs} +25 -27
  33. package/dist/lib/node/chunk-ZAE2IOZC.cjs.map +7 -0
  34. package/dist/lib/node/index.cjs +220 -378
  35. package/dist/lib/node/index.cjs.map +4 -4
  36. package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs +84 -0
  37. package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs.map +7 -0
  38. package/dist/lib/node/meta.json +1 -1
  39. package/dist/lib/node/{react-surface-AGGGDOUC.cjs → react-surface-ZENSCF6S.cjs} +18 -12
  40. package/dist/lib/node/{react-surface-AGGGDOUC.cjs.map → react-surface-ZENSCF6S.cjs.map} +2 -2
  41. package/dist/lib/node/types/index.cjs +8 -7
  42. package/dist/lib/node/types/index.cjs.map +2 -2
  43. package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs → TranscriptContainer-MOWZQSEO.mjs} +3 -3
  44. package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs +40 -0
  45. package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs.map +7 -0
  46. package/dist/lib/node-esm/chunk-4A6BWPRB.mjs +253 -0
  47. package/dist/lib/node-esm/chunk-4A6BWPRB.mjs.map +7 -0
  48. package/dist/lib/node-esm/{chunk-KEG3ME4O.mjs → chunk-DLXORY7Y.mjs} +22 -24
  49. package/dist/lib/node-esm/chunk-DLXORY7Y.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs → chunk-NFPDIQYG.mjs} +2 -2
  51. package/dist/lib/node-esm/chunk-SB5TLXBU.mjs +21 -0
  52. package/dist/lib/node-esm/chunk-SB5TLXBU.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-SWV74BYU.mjs +416 -0
  54. package/dist/lib/node-esm/chunk-SWV74BYU.mjs.map +7 -0
  55. package/dist/lib/node-esm/index.mjs +203 -366
  56. package/dist/lib/node-esm/index.mjs.map +4 -4
  57. package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs +74 -0
  58. package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs.map +7 -0
  59. package/dist/lib/node-esm/meta.json +1 -1
  60. package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs → react-surface-5CBEXLXJ.mjs} +15 -8
  61. package/dist/lib/node-esm/{react-surface-6AYPLJ2B.mjs.map → react-surface-5CBEXLXJ.mjs.map} +2 -2
  62. package/dist/lib/node-esm/types/index.mjs +2 -1
  63. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  64. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -0
  65. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  67. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  68. package/dist/types/src/components/Transcript/Transcript.d.ts +2 -0
  69. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  70. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  71. package/dist/types/src/components/TranscriptContainer.d.ts +1 -0
  72. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  73. package/dist/types/src/components/index.d.ts +1 -0
  74. package/dist/types/src/components/index.d.ts.map +1 -1
  75. package/dist/types/src/components/transcription.stories.d.ts +3 -2
  76. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  77. package/dist/types/src/hooks/index.d.ts +0 -1
  78. package/dist/types/src/hooks/index.d.ts.map +1 -1
  79. package/dist/types/src/index.d.ts +1 -0
  80. package/dist/types/src/index.d.ts.map +1 -1
  81. package/dist/types/src/meta.d.ts +2 -9
  82. package/dist/types/src/meta.d.ts.map +1 -1
  83. package/dist/types/src/transcriber/index.d.ts +1 -0
  84. package/dist/types/src/transcriber/index.d.ts.map +1 -1
  85. package/dist/types/src/transcriber/media-stream-recorder.d.ts +1 -0
  86. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  87. package/dist/types/src/transcriber/summarize.d.ts +5 -0
  88. package/dist/types/src/transcriber/summarize.d.ts.map +1 -0
  89. package/dist/types/src/transcription-manager.d.ts +39 -0
  90. package/dist/types/src/transcription-manager.d.ts.map +1 -0
  91. package/dist/types/src/translations.d.ts +5 -6
  92. package/dist/types/src/translations.d.ts.map +1 -1
  93. package/dist/types/src/types/schema.d.ts +9 -15
  94. package/dist/types/src/types/schema.d.ts.map +1 -1
  95. package/dist/types/src/types/types.d.ts +13 -6
  96. package/dist/types/src/types/types.d.ts.map +1 -1
  97. package/dist/types/src/util/random-queue-dxn.d.ts +2 -2
  98. package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -1
  99. package/package.json +40 -37
  100. package/src/TranscriptionPlugin.tsx +1 -2
  101. package/src/capabilities/app-graph-builder.ts +25 -2
  102. package/src/capabilities/intent-resolver.ts +24 -2
  103. package/src/capabilities/react-surface.tsx +2 -2
  104. package/src/components/Transcript/Transcript.stories.tsx +46 -27
  105. package/src/components/Transcript/Transcript.tsx +205 -49
  106. package/src/components/TranscriptContainer.tsx +12 -147
  107. package/src/components/transcription.stories.tsx +11 -13
  108. package/src/hooks/index.ts +0 -1
  109. package/src/index.ts +1 -0
  110. package/src/meta.ts +2 -2
  111. package/src/transcriber/index.ts +1 -0
  112. package/src/transcriber/media-stream-recorder.ts +4 -0
  113. package/src/transcriber/summarize.ts +77 -0
  114. package/src/transcription-manager.ts +183 -0
  115. package/src/translations.ts +2 -2
  116. package/src/types/schema.ts +5 -3
  117. package/src/types/types.ts +12 -2
  118. package/src/util/random-queue-dxn.ts +2 -2
  119. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs +0 -7
  120. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs.map +0 -7
  121. package/dist/lib/browser/chunk-QIHUPVQD.mjs.map +0 -7
  122. package/dist/lib/browser/chunk-R4HHS6FA.mjs +0 -241
  123. package/dist/lib/browser/chunk-R4HHS6FA.mjs.map +0 -7
  124. package/dist/lib/browser/chunk-ZMES3U2D.mjs +0 -78
  125. package/dist/lib/browser/chunk-ZMES3U2D.mjs.map +0 -7
  126. package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs +0 -32
  127. package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs.map +0 -7
  128. package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map +0 -7
  129. package/dist/lib/node/chunk-JBN3P6ZF.cjs +0 -97
  130. package/dist/lib/node/chunk-JBN3P6ZF.cjs.map +0 -7
  131. package/dist/lib/node/chunk-UIHEGU6Q.cjs.map +0 -7
  132. package/dist/lib/node/chunk-YV74Z74I.cjs +0 -267
  133. package/dist/lib/node/chunk-YV74Z74I.cjs.map +0 -7
  134. package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs +0 -44
  135. package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs.map +0 -7
  136. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs +0 -9
  137. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs.map +0 -7
  138. package/dist/lib/node-esm/chunk-36EQXBWR.mjs +0 -242
  139. package/dist/lib/node-esm/chunk-36EQXBWR.mjs.map +0 -7
  140. package/dist/lib/node-esm/chunk-KEG3ME4O.mjs.map +0 -7
  141. package/dist/lib/node-esm/chunk-XYU6B73V.mjs +0 -80
  142. package/dist/lib/node-esm/chunk-XYU6B73V.mjs.map +0 -7
  143. package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs +0 -33
  144. package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs.map +0 -7
  145. package/dist/types/src/hooks/useIsSpeaking.d.ts +0 -2
  146. package/dist/types/src/hooks/useIsSpeaking.d.ts.map +0 -1
  147. package/src/hooks/useIsSpeaking.ts +0 -77
  148. /package/dist/lib/browser/{TranscriptContainer-SX6PNFEC.mjs.map → TranscriptContainer-TJXP6ICP.mjs.map} +0 -0
  149. /package/dist/lib/browser/{chunk-AS364WZZ.mjs.map → chunk-3NWYXRZS.mjs.map} +0 -0
  150. /package/dist/lib/node/{chunk-QWXLQPP5.cjs.map → chunk-I6CUIAQH.cjs.map} +0 -0
  151. /package/dist/lib/node-esm/{TranscriptContainer-DVBXQIQ4.mjs.map → TranscriptContainer-MOWZQSEO.mjs.map} +0 -0
  152. /package/dist/lib/node-esm/{chunk-WEZGRUG6.mjs.map → chunk-NFPDIQYG.mjs.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["TranscriptContainer-HU763SN3.cjs"],
4
- "sourcesContent": ["import {\n TranscriptContainer_default,\n TranscriptionContainer\n} from \"./chunk-YV74Z74I.cjs\";\nimport \"./chunk-UIHEGU6Q.cjs\";\nexport {\n TranscriptionContainer,\n TranscriptContainer_default as default\n};\n//# sourceMappingURL=TranscriptContainer-HU763SN3.cjs.map\n"],
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 chunk_QWXLQPP5_exports = {};
30
- __export(chunk_QWXLQPP5_exports, {
29
+ var chunk_I6CUIAQH_exports = {};
30
+ __export(chunk_I6CUIAQH_exports, {
31
31
  TranscriptContainer: () => TranscriptContainer
32
32
  });
33
- module.exports = __toCommonJS(chunk_QWXLQPP5_exports);
33
+ module.exports = __toCommonJS(chunk_I6CUIAQH_exports);
34
34
  var import_react = require("react");
35
- var TranscriptContainer = (0, import_react.lazy)(() => import("./TranscriptContainer-HU763SN3.cjs"));
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-QWXLQPP5.cjs.map
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 app_graph_builder_YFBX3OTP_exports = {};
20
- __export(app_graph_builder_YFBX3OTP_exports, {
21
- default: () => app_graph_builder_default
19
+ var chunk_LEHTJHKP_exports = {};
20
+ __export(chunk_LEHTJHKP_exports, {
21
+ TRANSCRIPTION_PLUGIN: () => TRANSCRIPTION_PLUGIN,
22
+ meta: () => meta
22
23
  });
23
- module.exports = __toCommonJS(app_graph_builder_YFBX3OTP_exports);
24
- var import_app_framework = require("@dxos/app-framework");
25
- var app_graph_builder_default = (context) => (0, import_app_framework.contributes)(import_app_framework.Capabilities.AppGraphBuilder, []);
26
- //# sourceMappingURL=app-graph-builder-YFBX3OTP.cjs.map
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
+ }