@dxos/plugin-transcription 0.7.5-main.b19bfc8

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 (172) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +15 -0
  3. package/dist/lib/browser/TranscriptContainer-G7NUUBPJ.mjs +10 -0
  4. package/dist/lib/browser/TranscriptContainer-G7NUUBPJ.mjs.map +7 -0
  5. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs +7 -0
  6. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-7V6ZINS5.mjs +8 -0
  8. package/dist/lib/browser/chunk-7V6ZINS5.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-D4ZMHRVK.mjs +241 -0
  10. package/dist/lib/browser/chunk-D4ZMHRVK.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-QIHUPVQD.mjs +80 -0
  12. package/dist/lib/browser/chunk-QIHUPVQD.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-ZMES3U2D.mjs +78 -0
  14. package/dist/lib/browser/chunk-ZMES3U2D.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +652 -0
  16. package/dist/lib/browser/index.mjs.map +7 -0
  17. package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs +32 -0
  18. package/dist/lib/browser/intent-resolver-EAR2TFK2.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -0
  20. package/dist/lib/browser/react-surface-IXF7SETX.mjs +26 -0
  21. package/dist/lib/browser/react-surface-IXF7SETX.mjs.map +7 -0
  22. package/dist/lib/browser/types/index.mjs +17 -0
  23. package/dist/lib/browser/types/index.mjs.map +7 -0
  24. package/dist/lib/node/TranscriptContainer-IKMCPYQ2.cjs +31 -0
  25. package/dist/lib/node/TranscriptContainer-IKMCPYQ2.cjs.map +7 -0
  26. package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs +26 -0
  27. package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map +7 -0
  28. package/dist/lib/node/chunk-JBN3P6ZF.cjs +97 -0
  29. package/dist/lib/node/chunk-JBN3P6ZF.cjs.map +7 -0
  30. package/dist/lib/node/chunk-SQHF7N3B.cjs +40 -0
  31. package/dist/lib/node/chunk-SQHF7N3B.cjs.map +7 -0
  32. package/dist/lib/node/chunk-UIHEGU6Q.cjs +103 -0
  33. package/dist/lib/node/chunk-UIHEGU6Q.cjs.map +7 -0
  34. package/dist/lib/node/chunk-Y2GCR535.cjs +267 -0
  35. package/dist/lib/node/chunk-Y2GCR535.cjs.map +7 -0
  36. package/dist/lib/node/index.cjs +661 -0
  37. package/dist/lib/node/index.cjs.map +7 -0
  38. package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs +44 -0
  39. package/dist/lib/node/intent-resolver-3KJZGGUQ.cjs.map +7 -0
  40. package/dist/lib/node/meta.json +1 -0
  41. package/dist/lib/node/react-surface-L4NQQWN4.cjs +49 -0
  42. package/dist/lib/node/react-surface-L4NQQWN4.cjs.map +7 -0
  43. package/dist/lib/node/types/index.cjs +39 -0
  44. package/dist/lib/node/types/index.cjs.map +7 -0
  45. package/dist/lib/node-esm/TranscriptContainer-HJTGGLU5.mjs +11 -0
  46. package/dist/lib/node-esm/TranscriptContainer-HJTGGLU5.mjs.map +7 -0
  47. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs +9 -0
  48. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-F4J7FV6Q.mjs +10 -0
  50. package/dist/lib/node-esm/chunk-F4J7FV6Q.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-KEG3ME4O.mjs +82 -0
  52. package/dist/lib/node-esm/chunk-KEG3ME4O.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-TNJUQCWM.mjs +242 -0
  54. package/dist/lib/node-esm/chunk-TNJUQCWM.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-XYU6B73V.mjs +80 -0
  56. package/dist/lib/node-esm/chunk-XYU6B73V.mjs.map +7 -0
  57. package/dist/lib/node-esm/index.mjs +653 -0
  58. package/dist/lib/node-esm/index.mjs.map +7 -0
  59. package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs +33 -0
  60. package/dist/lib/node-esm/intent-resolver-UGLYRD4X.mjs.map +7 -0
  61. package/dist/lib/node-esm/meta.json +1 -0
  62. package/dist/lib/node-esm/react-surface-TX4ULXGK.mjs +27 -0
  63. package/dist/lib/node-esm/react-surface-TX4ULXGK.mjs.map +7 -0
  64. package/dist/lib/node-esm/types/index.mjs +18 -0
  65. package/dist/lib/node-esm/types/index.mjs.map +7 -0
  66. package/dist/types/src/TranscriptionPlugin.d.ts +2 -0
  67. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -0
  68. package/dist/types/src/capabilities/app-graph-builder.d.ts +180 -0
  69. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  70. package/dist/types/src/capabilities/capabilities.d.ts +4 -0
  71. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  72. package/dist/types/src/capabilities/index.d.ts +181 -0
  73. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  74. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  75. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  76. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  77. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  78. package/dist/types/src/components/Transcript/Transcript.d.ts +7 -0
  79. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -0
  80. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +9 -0
  81. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -0
  82. package/dist/types/src/components/Transcript/index.d.ts +2 -0
  83. package/dist/types/src/components/Transcript/index.d.ts.map +1 -0
  84. package/dist/types/src/components/TranscriptContainer.d.ts +7 -0
  85. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -0
  86. package/dist/types/src/components/index.d.ts +6 -0
  87. package/dist/types/src/components/index.d.ts.map +1 -0
  88. package/dist/types/src/components/transcription.stories.d.ts +14 -0
  89. package/dist/types/src/components/transcription.stories.d.ts.map +1 -0
  90. package/dist/types/src/hooks/index.d.ts +6 -0
  91. package/dist/types/src/hooks/index.d.ts.map +1 -0
  92. package/dist/types/src/hooks/useAudioFile.d.ts +7 -0
  93. package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -0
  94. package/dist/types/src/hooks/useAudioTrack.d.ts +5 -0
  95. package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -0
  96. package/dist/types/src/hooks/useIsSpeaking.d.ts +2 -0
  97. package/dist/types/src/hooks/useIsSpeaking.d.ts.map +1 -0
  98. package/dist/types/src/hooks/useTranscriber.d.ts +10 -0
  99. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -0
  100. package/dist/types/src/hooks/useVoiceInput.d.ts +11 -0
  101. package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -0
  102. package/dist/types/src/index.d.ts +7 -0
  103. package/dist/types/src/index.d.ts.map +1 -0
  104. package/dist/types/src/meta.d.ts +11 -0
  105. package/dist/types/src/meta.d.ts.map +1 -0
  106. package/dist/types/src/sanity.test.d.ts +2 -0
  107. package/dist/types/src/sanity.test.d.ts.map +1 -0
  108. package/dist/types/src/transcriber/audio-recorder.d.ts +47 -0
  109. package/dist/types/src/transcriber/audio-recorder.d.ts.map +1 -0
  110. package/dist/types/src/transcriber/index.d.ts +4 -0
  111. package/dist/types/src/transcriber/index.d.ts.map +1 -0
  112. package/dist/types/src/transcriber/media-stream-recorder.d.ts +26 -0
  113. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -0
  114. package/dist/types/src/transcriber/transcriber.d.ts +46 -0
  115. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -0
  116. package/dist/types/src/transcriber/transcriber.test.d.ts +2 -0
  117. package/dist/types/src/transcriber/transcriber.test.d.ts.map +1 -0
  118. package/dist/types/src/translations.d.ts +40 -0
  119. package/dist/types/src/translations.d.ts.map +1 -0
  120. package/dist/types/src/types/index.d.ts +3 -0
  121. package/dist/types/src/types/index.d.ts.map +1 -0
  122. package/dist/types/src/types/schema.d.ts +63 -0
  123. package/dist/types/src/types/schema.d.ts.map +1 -0
  124. package/dist/types/src/types/types.d.ts +28 -0
  125. package/dist/types/src/types/types.d.ts.map +1 -0
  126. package/dist/types/src/util/array.d.ts +2 -0
  127. package/dist/types/src/util/array.d.ts.map +1 -0
  128. package/dist/types/src/util/get-time-str.d.ts +2 -0
  129. package/dist/types/src/util/get-time-str.d.ts.map +1 -0
  130. package/dist/types/src/util/index.d.ts +5 -0
  131. package/dist/types/src/util/index.d.ts.map +1 -0
  132. package/dist/types/src/util/monitor-audio-level.d.ts +6 -0
  133. package/dist/types/src/util/monitor-audio-level.d.ts.map +1 -0
  134. package/dist/types/src/util/random-queue-dxn.d.ts +3 -0
  135. package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -0
  136. package/dist/types/tsconfig.tsbuildinfo +1 -0
  137. package/package.json +93 -0
  138. package/src/TranscriptionPlugin.tsx +57 -0
  139. package/src/capabilities/app-graph-builder.ts +7 -0
  140. package/src/capabilities/capabilities.ts +12 -0
  141. package/src/capabilities/index.ts +11 -0
  142. package/src/capabilities/intent-resolver.ts +24 -0
  143. package/src/capabilities/react-surface.tsx +21 -0
  144. package/src/components/Transcript/Transcript.stories.tsx +65 -0
  145. package/src/components/Transcript/Transcript.tsx +69 -0
  146. package/src/components/Transcript/index.ts +5 -0
  147. package/src/components/TranscriptContainer.tsx +167 -0
  148. package/src/components/index.ts +10 -0
  149. package/src/components/transcription.stories.tsx +198 -0
  150. package/src/hooks/index.ts +9 -0
  151. package/src/hooks/useAudioFile.ts +62 -0
  152. package/src/hooks/useAudioTrack.ts +35 -0
  153. package/src/hooks/useIsSpeaking.ts +77 -0
  154. package/src/hooks/useTranscriber.ts +62 -0
  155. package/src/hooks/useVoiceInput.ts +66 -0
  156. package/src/index.ts +11 -0
  157. package/src/meta.ts +17 -0
  158. package/src/sanity.test.ts +11 -0
  159. package/src/transcriber/audio-recorder.ts +56 -0
  160. package/src/transcriber/index.ts +7 -0
  161. package/src/transcriber/media-stream-recorder.ts +109 -0
  162. package/src/transcriber/transcriber.test.ts +230 -0
  163. package/src/transcriber/transcriber.ts +247 -0
  164. package/src/translations.ts +28 -0
  165. package/src/types/index.ts +6 -0
  166. package/src/types/schema.ts +60 -0
  167. package/src/types/types.ts +34 -0
  168. package/src/util/array.ts +14 -0
  169. package/src/util/get-time-str.ts +12 -0
  170. package/src/util/index.ts +8 -0
  171. package/src/util/monitor-audio-level.ts +58 -0
  172. package/src/util/random-queue-dxn.ts +9 -0
@@ -0,0 +1,28 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { TRANSCRIPTION_PLUGIN } from './meta';
6
+ import { TranscriptType } from './types';
7
+
8
+ export default [
9
+ {
10
+ 'en-US': {
11
+ [TranscriptType.typename]: {
12
+ 'typename label': 'Transcript',
13
+ },
14
+ [TRANSCRIPTION_PLUGIN]: {
15
+ 'plugin name': 'Transcription',
16
+ 'calls label': 'Transcript',
17
+ 'calls panel label': 'Transcription',
18
+ 'create calls label': 'Create transcription',
19
+ 'delete calls label': 'Delete',
20
+
21
+ 'delete button': 'Delete',
22
+ 'bookmark button': 'Bookmark',
23
+ 'summary button': 'Create summary',
24
+ 'summarizing label': 'Summarizing...',
25
+ },
26
+ },
27
+ },
28
+ ];
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './schema';
6
+ export * from './types';
@@ -0,0 +1,60 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { EchoObject, ObjectId, S, TypedObject } from '@dxos/echo-schema';
6
+
7
+ /**
8
+ * Root transcript object created when the user starts a transcription.
9
+ */
10
+ export const TranscriptSchema = S.Struct({
11
+ name: S.String,
12
+
13
+ // TODO(burdon): Use string for dates?
14
+ started: S.optional(S.Date),
15
+ ended: S.optional(S.Date),
16
+
17
+ /**
18
+ * Queue containing TranscriptBlock objects.
19
+ */
20
+ queue: S.optional(S.String),
21
+ });
22
+
23
+ export class TranscriptType extends TypedObject({
24
+ typename: 'dxos.org/type/Transcript',
25
+ version: '0.1.0',
26
+ })(TranscriptSchema.fields) {}
27
+
28
+ // TODO(burdon): Do these need to be kept in sync with EDGE?
29
+
30
+ /**
31
+ * First message in queue.
32
+ * Contains metadata for the recording and transcript.
33
+ */
34
+ const TranscriptHeader = S.Struct({
35
+ started: S.optional(S.Date),
36
+ });
37
+
38
+ export type TranscriptHeader = S.Schema.Type<typeof TranscriptHeader>;
39
+
40
+ /**
41
+ * Transcription fragment.
42
+ */
43
+ const TranscriptSegment = S.Struct({
44
+ // TODO(burdon): TS from service is not Unix TS (x1000).
45
+ started: S.Date,
46
+ text: S.String,
47
+ });
48
+
49
+ export type TranscriptSegment = S.Schema.Type<typeof TranscriptSegment>;
50
+
51
+ /**
52
+ * Transcription block (from single speaker).
53
+ */
54
+ export const TranscriptBlock = S.Struct({
55
+ id: ObjectId,
56
+ author: S.optional(S.String), // TODO(burdon): DID?
57
+ segments: S.Array(TranscriptSegment),
58
+ }).pipe(EchoObject('dxos.org/type/TranscriptBlock', '0.1.0'));
59
+
60
+ export type TranscriptBlock = S.Schema.Type<typeof TranscriptBlock>;
@@ -0,0 +1,34 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { S, isInstanceOf } from '@dxos/echo-schema';
6
+ import { isReactiveObject } from '@dxos/react-client/echo';
7
+
8
+ import { TranscriptSchema, TranscriptType } from './schema';
9
+ import { TRANSCRIPTION_PLUGIN } from '../meta';
10
+
11
+ // TODO(burdon): Move to separate proto.
12
+
13
+ /**
14
+ * Endpoint to the calls service.
15
+ */
16
+ // TODO(burdon): Reconfigure/move.
17
+ export const TRANSCRIPTION_URL = 'https://calls-service.dxos.workers.dev';
18
+
19
+ export namespace TranscriptionAction {
20
+ const TRANSCRIPTION_ACTION = `${TRANSCRIPTION_PLUGIN}/action`;
21
+
22
+ export class Create extends S.TaggedClass<Create>()(`${TRANSCRIPTION_ACTION}/create`, {
23
+ input: S.Struct({
24
+ name: S.optional(S.String),
25
+ }),
26
+ output: S.Struct({
27
+ object: TranscriptSchema,
28
+ }),
29
+ }) {}
30
+ }
31
+
32
+ export const isTranscript = (object: unknown): object is typeof TranscriptType => {
33
+ return isReactiveObject(object) && isInstanceOf(TranscriptType, object);
34
+ };
@@ -0,0 +1,14 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export const mergeFloat64Arrays = (arrays: Float64Array[]) => {
6
+ const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));
7
+ let offset = 0;
8
+ for (const array of arrays) {
9
+ newArray.set(array, offset);
10
+ offset += array.length;
11
+ }
12
+
13
+ return newArray;
14
+ };
@@ -0,0 +1,12 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export const getTimeStr = (timestamp?: number) =>
6
+ new Date(timestamp ?? Date.now()).toLocaleTimeString('en-US', {
7
+ timeZone: 'UTC',
8
+ hour12: true,
9
+ hour: 'numeric',
10
+ minute: '2-digit',
11
+ second: '2-digit',
12
+ });
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './array';
6
+ export * from './get-time-str';
7
+ export * from './monitor-audio-level';
8
+ export * from './random-queue-dxn';
@@ -0,0 +1,58 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export const monitorAudioLevel = ({
6
+ mediaStreamTrack,
7
+ onMeasure,
8
+ intervalMs = 1000 / 10, // 12 fps.
9
+ }: {
10
+ mediaStreamTrack: MediaStreamTrack;
11
+ onMeasure: (value: number) => void;
12
+ intervalMs?: number;
13
+ }) => {
14
+ let timeout = -1;
15
+ let interval = -1;
16
+ const audioContext = new AudioContext();
17
+ const stream = new MediaStream();
18
+ stream.addTrack(mediaStreamTrack);
19
+ const mediaStreamAudioSourceNode = audioContext.createMediaStreamSource(stream);
20
+ const analyserNode = audioContext.createAnalyser();
21
+ mediaStreamAudioSourceNode.connect(analyserNode);
22
+ // Since we just need a rough approximation and will be measuring
23
+ // frequently, we want to drop this down from the default of 2048.
24
+ analyserNode.fftSize = 32;
25
+
26
+ const pcmData = new Float32Array(analyserNode.fftSize);
27
+ let peak = 0;
28
+
29
+ interval = window.setInterval(() => {
30
+ onMeasure(peak);
31
+ peak = 0;
32
+ }, intervalMs);
33
+
34
+ const tick = () => {
35
+ timeout = window.setTimeout(() => {
36
+ analyserNode.getFloatTimeDomainData(pcmData);
37
+ let sumSquares = 0.0;
38
+ for (const amplitude of pcmData) {
39
+ sumSquares += amplitude * amplitude;
40
+ }
41
+ const current = Math.sqrt(sumSquares / pcmData.length);
42
+ if (current > peak) {
43
+ peak = current;
44
+ }
45
+ tick();
46
+ }, intervalMs);
47
+ };
48
+ tick();
49
+
50
+ return () => {
51
+ mediaStreamAudioSourceNode.disconnect();
52
+ analyserNode.disconnect();
53
+ void audioContext.close();
54
+ clearInterval(interval);
55
+ clearTimeout(timeout);
56
+ stream.removeTrack(mediaStreamTrack);
57
+ };
58
+ };
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { ObjectId } from '@dxos/echo-schema';
6
+ import { DXN, QueueSubspaceTags, SpaceId } from '@dxos/keys';
7
+
8
+ export const randomQueueDxn = () =>
9
+ new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, SpaceId.random(), ObjectId.random()]);