@dxos/plugin-transcription 0.8.2-main.12df754 → 0.8.2-main.36232bc
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-4D4BHE7G.mjs → TranscriptContainer-2VFHUHLE.mjs} +3 -3
- package/dist/lib/browser/app-graph-builder-TDP6PYV6.mjs +350 -0
- package/dist/lib/browser/app-graph-builder-TDP6PYV6.mjs.map +7 -0
- package/dist/lib/browser/{chunk-DR3NBV6Q.mjs → chunk-KSUYWWIU.mjs} +105 -78
- package/dist/lib/browser/chunk-KSUYWWIU.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5BE6RTNC.mjs → chunk-LTIQFX4W.mjs} +1 -1
- package/dist/lib/browser/{chunk-5BE6RTNC.mjs.map → chunk-LTIQFX4W.mjs.map} +1 -1
- package/dist/lib/browser/{chunk-RHHJZQPM.mjs → chunk-NFVDICSJ.mjs} +133 -116
- package/dist/lib/browser/chunk-NFVDICSJ.mjs.map +7 -0
- package/dist/lib/browser/chunk-O6RY7FNK.mjs +27 -0
- package/dist/lib/browser/chunk-O6RY7FNK.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5Q3R53U3.mjs → chunk-YRWBY6UK.mjs} +9 -21
- package/dist/lib/browser/chunk-YRWBY6UK.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +29 -17
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-ZQQEH27F.mjs → intent-resolver-ZWKYRFE7.mjs} +4 -4
- package/dist/lib/browser/{intent-resolver-ZQQEH27F.mjs.map → intent-resolver-ZWKYRFE7.mjs.map} +2 -2
- package/dist/lib/browser/{meeting-transcription-state-5D52VTHU.mjs → meeting-transcription-state-MNA2XROE.mjs} +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-HETJ5XY6.mjs → react-surface-F32UNCKZ.mjs} +18 -7
- package/dist/lib/browser/react-surface-F32UNCKZ.mjs.map +7 -0
- package/dist/lib/browser/settings-6YAHKVKX.mjs +24 -0
- package/dist/lib/browser/settings-6YAHKVKX.mjs.map +7 -0
- package/dist/lib/browser/{transcriber-SMRLU2KY.mjs → transcriber-MSBS4VBI.mjs} +4 -4
- package/dist/lib/browser/types/index.mjs +3 -3
- package/dist/lib/node/{TranscriptContainer-ZWP6UKY6.cjs → TranscriptContainer-E2D7PKO3.cjs} +8 -8
- package/dist/lib/node/{TranscriptContainer-ZWP6UKY6.cjs.map → TranscriptContainer-E2D7PKO3.cjs.map} +2 -2
- package/dist/lib/node/app-graph-builder-W4VDMVGV.cjs +351 -0
- package/dist/lib/node/app-graph-builder-W4VDMVGV.cjs.map +7 -0
- package/dist/lib/node/{chunk-LA73IHCB.cjs → chunk-7XIIUVN3.cjs} +108 -80
- package/dist/lib/node/chunk-7XIIUVN3.cjs.map +7 -0
- package/dist/lib/node/{chunk-3QEJ5EBO.cjs → chunk-IXU57SCA.cjs} +10 -22
- package/dist/lib/node/chunk-IXU57SCA.cjs.map +7 -0
- package/dist/lib/node/{chunk-HYGDHS6X.cjs → chunk-JUGOXWES.cjs} +4 -4
- package/dist/lib/node/{chunk-HYGDHS6X.cjs.map → chunk-JUGOXWES.cjs.map} +1 -1
- package/dist/lib/node/{chunk-KO6MKCED.cjs → chunk-NBC6V3M2.cjs} +136 -118
- package/dist/lib/node/chunk-NBC6V3M2.cjs.map +7 -0
- package/dist/lib/node/{chunk-WXG4Z2EZ.cjs → chunk-TJMZ26GS.cjs} +23 -8
- package/dist/lib/node/chunk-TJMZ26GS.cjs.map +7 -0
- package/dist/lib/node/index.cjs +46 -34
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-VY3XWYAA.cjs → intent-resolver-RM4JOCDV.cjs} +8 -8
- package/dist/lib/node/{intent-resolver-VY3XWYAA.cjs.map → intent-resolver-RM4JOCDV.cjs.map} +2 -2
- package/dist/lib/node/{meeting-transcription-state-OYWCY5XE.cjs → meeting-transcription-state-5XLTMWPA.cjs} +6 -6
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-M2JQIIDY.cjs → react-surface-YQHBGPOC.cjs} +20 -11
- package/dist/lib/node/react-surface-YQHBGPOC.cjs.map +7 -0
- package/dist/lib/node/settings-ZMB4XRWS.cjs +38 -0
- package/dist/lib/node/settings-ZMB4XRWS.cjs.map +7 -0
- package/dist/lib/node/{transcriber-E6AAB4SU.cjs → transcriber-55OE4X6I.cjs} +10 -10
- package/dist/lib/node/types/index.cjs +8 -8
- package/dist/lib/node/types/index.cjs.map +1 -1
- package/dist/lib/node-esm/{TranscriptContainer-3HJ752CP.mjs → TranscriptContainer-5N3BSK2S.mjs} +3 -3
- package/dist/lib/node-esm/app-graph-builder-DDDVKUHS.mjs +351 -0
- package/dist/lib/node-esm/app-graph-builder-DDDVKUHS.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SDMGJZLN.mjs → chunk-4RMJO6QQ.mjs} +133 -116
- package/dist/lib/node-esm/chunk-4RMJO6QQ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-YXZOLOFT.mjs → chunk-5E2MR5XK.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-YXZOLOFT.mjs.map → chunk-5E2MR5XK.mjs.map} +1 -1
- package/dist/lib/node-esm/chunk-HZBSWUJH.mjs +28 -0
- package/dist/lib/node-esm/chunk-HZBSWUJH.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-54HDN33F.mjs → chunk-OS2ITZUL.mjs} +9 -21
- package/dist/lib/node-esm/chunk-OS2ITZUL.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-K3R3YK3S.mjs → chunk-UWF6LM27.mjs} +105 -78
- package/dist/lib/node-esm/chunk-UWF6LM27.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +29 -17
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-FCTNJPWY.mjs → intent-resolver-HDRFXMKP.mjs} +4 -4
- package/dist/lib/node-esm/{intent-resolver-FCTNJPWY.mjs.map → intent-resolver-HDRFXMKP.mjs.map} +2 -2
- package/dist/lib/node-esm/{meeting-transcription-state-XMZJ45P4.mjs → meeting-transcription-state-3WOZ52BQ.mjs} +2 -2
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-PXFSIM6V.mjs → react-surface-DRDNXTFZ.mjs} +18 -7
- package/dist/lib/node-esm/react-surface-DRDNXTFZ.mjs.map +7 -0
- package/dist/lib/node-esm/settings-I35TVDUG.mjs +25 -0
- package/dist/lib/node-esm/settings-I35TVDUG.mjs.map +7 -0
- package/dist/lib/node-esm/{transcriber-REAGRCPY.mjs → transcriber-HH7EMCGH.mjs} +4 -4
- package/dist/lib/node-esm/types/index.mjs +3 -3
- package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +1 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +4 -0
- package/dist/types/src/capabilities/settings.d.ts.map +1 -0
- package/dist/types/src/components/Transcript/Transcript.d.ts +6 -4
- package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts +8 -4
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +27 -0
- package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +1 -0
- package/dist/types/src/components/Transcript/transcript-extension.d.ts +4 -4
- package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -1
- package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
- package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts +6 -0
- package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts.map +1 -0
- package/dist/types/src/components/TranscriptionSettings/index.d.ts +2 -0
- package/dist/types/src/components/TranscriptionSettings/index.d.ts.map +1 -0
- 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 +6 -3
- package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
- package/dist/types/src/entity-extraction/entity-extraction.d.ts +33 -7
- package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +1 -1
- package/dist/types/src/hooks/useQueueModelAdapter.d.ts +2 -2
- package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -1
- package/dist/types/src/model/model.d.ts +23 -23
- package/dist/types/src/model/model.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/testing.d.ts +39 -0
- package/dist/types/src/testing/testing.d.ts.map +1 -0
- package/dist/types/src/transcriber/transcriber.d.ts +2 -2
- package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
- package/dist/types/src/transcriber/transcription-manager.d.ts +17 -15
- package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +3 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +0 -21
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +5 -1
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +48 -45
- package/src/TranscriptionPlugin.tsx +29 -12
- package/src/capabilities/app-graph-builder.ts +99 -29
- package/src/capabilities/capabilities.ts +1 -1
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/intent-resolver.ts +2 -2
- package/src/capabilities/react-surface.tsx +12 -4
- package/src/capabilities/settings.ts +20 -0
- package/src/components/Transcript/Transcript.stories.tsx +71 -35
- package/src/components/Transcript/Transcript.tsx +30 -29
- package/src/components/Transcript/deprecated/{Transcript.tsx → OldTranscript.tsx} +24 -1
- package/src/components/Transcript/transcript-extension.ts +20 -17
- package/src/components/TranscriptContainer.tsx +6 -4
- package/src/components/TranscriptionSettings/TranscriptionSettings.tsx +26 -0
- package/src/components/TranscriptionSettings/index.ts +5 -0
- package/src/components/index.ts +1 -0
- package/src/components/transcription.stories.tsx +77 -29
- package/src/entity-extraction/entity-extraction.test.ts +55 -9
- package/src/entity-extraction/entity-extraction.ts +105 -55
- package/src/entity-extraction/system-prompt.tpl +38 -9
- package/src/hooks/useQueueModelAdapter.ts +44 -11
- package/src/model/model.test.ts +85 -43
- package/src/model/model.ts +59 -59
- package/src/testing/index.ts +5 -0
- package/src/testing/testing.ts +208 -0
- package/src/transcriber/transcriber.browser.test.ts +3 -3
- package/src/transcriber/transcriber.ts +16 -10
- package/src/transcriber/transcription-manager.ts +66 -57
- package/src/translations.ts +2 -0
- package/src/types/schema.ts +1 -24
- package/src/types/types.ts +11 -3
- package/dist/lib/browser/app-graph-builder-I4SSIQMW.mjs +0 -168
- package/dist/lib/browser/app-graph-builder-I4SSIQMW.mjs.map +0 -7
- package/dist/lib/browser/chunk-5Q3R53U3.mjs.map +0 -7
- package/dist/lib/browser/chunk-DR3NBV6Q.mjs.map +0 -7
- package/dist/lib/browser/chunk-GI5LZ4SV.mjs +0 -8
- package/dist/lib/browser/chunk-GI5LZ4SV.mjs.map +0 -7
- package/dist/lib/browser/chunk-RHHJZQPM.mjs.map +0 -7
- package/dist/lib/browser/react-surface-HETJ5XY6.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-WWC4WNTG.cjs +0 -177
- package/dist/lib/node/app-graph-builder-WWC4WNTG.cjs.map +0 -7
- package/dist/lib/node/chunk-3QEJ5EBO.cjs.map +0 -7
- package/dist/lib/node/chunk-KO6MKCED.cjs.map +0 -7
- package/dist/lib/node/chunk-LA73IHCB.cjs.map +0 -7
- package/dist/lib/node/chunk-WXG4Z2EZ.cjs.map +0 -7
- package/dist/lib/node/react-surface-M2JQIIDY.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-PPJQAFSI.mjs +0 -169
- package/dist/lib/node-esm/app-graph-builder-PPJQAFSI.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-54HDN33F.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-K3R3YK3S.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SDMGJZLN.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XY22OP6H.mjs +0 -10
- package/dist/lib/node-esm/chunk-XY22OP6H.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-PXFSIM6V.mjs.map +0 -7
- package/dist/types/src/components/Transcript/deprecated/Transcript.d.ts +0 -13
- package/dist/types/src/components/Transcript/deprecated/Transcript.d.ts.map +0 -1
- package/dist/types/src/components/Transcript/testings.d.ts +0 -51
- package/dist/types/src/components/Transcript/testings.d.ts.map +0 -1
- package/dist/types/src/testing/test-data.d.ts +0 -73
- package/dist/types/src/testing/test-data.d.ts.map +0 -1
- package/src/components/Transcript/testings.ts +0 -182
- package/src/testing/test-data.ts +0 -314
- /package/dist/lib/browser/{TranscriptContainer-4D4BHE7G.mjs.map → TranscriptContainer-2VFHUHLE.mjs.map} +0 -0
- /package/dist/lib/browser/{meeting-transcription-state-5D52VTHU.mjs.map → meeting-transcription-state-MNA2XROE.mjs.map} +0 -0
- /package/dist/lib/browser/{transcriber-SMRLU2KY.mjs.map → transcriber-MSBS4VBI.mjs.map} +0 -0
- /package/dist/lib/node/{meeting-transcription-state-OYWCY5XE.cjs.map → meeting-transcription-state-5XLTMWPA.cjs.map} +0 -0
- /package/dist/lib/node/{transcriber-E6AAB4SU.cjs.map → transcriber-55OE4X6I.cjs.map} +0 -0
- /package/dist/lib/node-esm/{TranscriptContainer-3HJ752CP.mjs.map → TranscriptContainer-5N3BSK2S.mjs.map} +0 -0
- /package/dist/lib/node-esm/{meeting-transcription-state-XMZJ45P4.mjs.map → meeting-transcription-state-3WOZ52BQ.mjs.map} +0 -0
- /package/dist/lib/node-esm/{transcriber-REAGRCPY.mjs.map → transcriber-HH7EMCGH.mjs.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/capabilities/capabilities.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineCapability } from '@dxos/app-framework';\nimport { type Live } from '@dxos/live-object';\n\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { type TranscriberParams, type Transcriber, type TranscriptionManager } from '../transcriber';\n\nexport namespace TranscriptionCapabilities {\n export type GetTranscriberProps = {\n audioStreamTrack: MediaStreamTrack;\n onSegments: TranscriberParams['onSegments'];\n config?: TranscriberParams['config'];\n };\n export type GetTranscriber = (props: GetTranscriberProps) => Transcriber;\n export const Transcriber = defineCapability<GetTranscriber>(`${TRANSCRIPTION_PLUGIN}/capability/transcriber`);\n\n export type MeetingTranscriptionState = Live<{\n
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineCapability } from '@dxos/app-framework';\nimport { type Live } from '@dxos/live-object';\n\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { type TranscriberParams, type Transcriber, type TranscriptionManager } from '../transcriber';\n\nexport namespace TranscriptionCapabilities {\n export type GetTranscriberProps = {\n audioStreamTrack: MediaStreamTrack;\n onSegments: TranscriberParams['onSegments'];\n config?: TranscriberParams['config'];\n };\n export type GetTranscriber = (props: GetTranscriberProps) => Transcriber;\n export const Transcriber = defineCapability<GetTranscriber>(`${TRANSCRIPTION_PLUGIN}/capability/transcriber`);\n\n export type MeetingTranscriptionState = Live<{\n transcriptionManager?: TranscriptionManager;\n enabled: boolean; // TODO(burdon): Move state into TranscriptionManager.\n }>;\n export const MeetingTranscriptionState = defineCapability<MeetingTranscriptionState>(\n `${TRANSCRIPTION_PLUGIN}/capability/meeting-transcription-state`,\n );\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;AAIA,SAASA,wBAAwB;;UAMhBC,4BAAAA;6BAOFC,cAAcC,iBAAiC,GAAGC,oBAAAA,yBAA6C;6BAM/FC,4BAA4BF,iBACvC,GAAGC,oBAAAA,yCAA6D;AAEpE,GAhBiBH,8BAAAA,4BAAAA,CAAAA,EAAAA;",
|
|
6
6
|
"names": ["defineCapability", "TranscriptionCapabilities", "Transcriber", "defineCapability", "TRANSCRIPTION_PLUGIN", "MeetingTranscriptionState"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
TRANSCRIPTION_PLUGIN
|
|
4
|
+
} from "./chunk-X4DDJIVL.mjs";
|
|
5
|
+
|
|
6
|
+
// packages/plugins/plugin-transcription/src/components/TranscriptionSettings/TranscriptionSettings.tsx
|
|
7
|
+
import React from "react";
|
|
8
|
+
import { Input, useTranslation } from "@dxos/react-ui";
|
|
9
|
+
import { DeprecatedFormContainer, DeprecatedFormInput } from "@dxos/react-ui-form";
|
|
10
|
+
var TranscriptionSettings = ({ settings }) => {
|
|
11
|
+
const { t } = useTranslation(TRANSCRIPTION_PLUGIN);
|
|
12
|
+
return /* @__PURE__ */ React.createElement(DeprecatedFormContainer, null, /* @__PURE__ */ React.createElement(DeprecatedFormInput, {
|
|
13
|
+
label: t("settings entity extraction label")
|
|
14
|
+
}, /* @__PURE__ */ React.createElement(Input.Switch, {
|
|
15
|
+
checked: !!settings.entityExtraction,
|
|
16
|
+
onCheckedChange: (checked) => settings.entityExtraction = checked
|
|
17
|
+
})));
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// packages/plugins/plugin-transcription/src/components/index.ts
|
|
21
|
+
import { lazy } from "react";
|
|
22
|
+
var TranscriptContainer = lazy(() => import("./TranscriptContainer-5N3BSK2S.mjs"));
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
TranscriptionSettings,
|
|
26
|
+
TranscriptContainer
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=chunk-HZBSWUJH.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/TranscriptionSettings/TranscriptionSettings.tsx", "../../../src/components/index.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Input, useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';\n\nimport { TRANSCRIPTION_PLUGIN } from '../../meta';\nimport { type TranscriptionSettingsProps } from '../../types';\n\nexport const TranscriptionSettings = ({ settings }: { settings: TranscriptionSettingsProps }) => {\n const { t } = useTranslation(TRANSCRIPTION_PLUGIN);\n\n return (\n <DeprecatedFormContainer>\n <DeprecatedFormInput label={t('settings entity extraction label')}>\n <Input.Switch\n checked={!!settings.entityExtraction}\n onCheckedChange={(checked) => (settings.entityExtraction = checked)}\n />\n </DeprecatedFormInput>\n </DeprecatedFormContainer>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './Transcript';\nexport * from './TranscriptContainer';\nexport * from './TranscriptionSettings';\n\nexport const TranscriptContainer = lazy(() => import('./TranscriptContainer'));\n"],
|
|
5
|
+
"mappings": ";;;;;;AAIA,OAAOA,WAAW;AAElB,SAASC,OAAOC,sBAAsB;AACtC,SAASC,yBAAyBC,2BAA2B;AAKtD,IAAMC,wBAAwB,CAAC,EAAEC,SAAQ,MAA4C;AAC1F,QAAM,EAAEC,EAAC,IAAKC,eAAeC,oBAAAA;AAE7B,SACE,sBAAA,cAACC,yBAAAA,MACC,sBAAA,cAACC,qBAAAA;IAAoBC,OAAOL,EAAE,kCAAA;KAC5B,sBAAA,cAACM,MAAMC,QAAM;IACXC,SAAS,CAAC,CAACT,SAASU;IACpBC,iBAAiB,CAACF,YAAaT,SAASU,mBAAmBD;;AAKrE;;;ACrBA,SAASG,YAAY;AAMd,IAAMC,sBAAsBC,KAAK,MAAM,OAAO,oCAAA,CAAA;",
|
|
6
|
+
"names": ["React", "Input", "useTranslation", "DeprecatedFormContainer", "DeprecatedFormInput", "TranscriptionSettings", "settings", "t", "useTranslation", "TRANSCRIPTION_PLUGIN", "DeprecatedFormContainer", "DeprecatedFormInput", "label", "Input", "Switch", "checked", "entityExtraction", "onCheckedChange", "lazy", "TranscriptContainer", "lazy"]
|
|
7
|
+
}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-X4DDJIVL.mjs";
|
|
5
5
|
|
|
6
6
|
// packages/plugins/plugin-transcription/src/types/schema.ts
|
|
7
|
-
import {
|
|
7
|
+
import { Expando, Ref, S, TypedObject } from "@dxos/echo-schema";
|
|
8
8
|
var TranscriptSchema = S.Struct({
|
|
9
9
|
name: S.String,
|
|
10
10
|
// TODO(burdon): Use Date or string?
|
|
@@ -24,23 +24,9 @@ var TranscriptType = class extends TypedObject({
|
|
|
24
24
|
var TranscriptHeader = S.Struct({
|
|
25
25
|
started: S.optional(S.String)
|
|
26
26
|
});
|
|
27
|
-
var TranscriptSegment = S.Struct({
|
|
28
|
-
// TODO(burdon): TS from service is not Unix TS (x1000).
|
|
29
|
-
started: S.String,
|
|
30
|
-
text: S.String
|
|
31
|
-
});
|
|
32
|
-
var TranscriptBlock = S.Struct({
|
|
33
|
-
id: S.String,
|
|
34
|
-
authorName: S.optional(S.String),
|
|
35
|
-
authorHue: S.optional(S.String),
|
|
36
|
-
segments: S.Array(TranscriptSegment)
|
|
37
|
-
}).pipe(EchoObject({
|
|
38
|
-
typename: "dxos.org/type/TranscriptBlock",
|
|
39
|
-
version: "0.1.0"
|
|
40
|
-
}));
|
|
41
27
|
|
|
42
28
|
// packages/plugins/plugin-transcription/src/types/types.ts
|
|
43
|
-
import { S as S2, isInstanceOf } from "@dxos/echo-schema";
|
|
29
|
+
import { SpaceIdSchema, S as S2, isInstanceOf } from "@dxos/echo-schema";
|
|
44
30
|
import { isLiveObject } from "@dxos/react-client/echo";
|
|
45
31
|
var TRANSCRIPTION_URL = "https://calls-service.dxos.workers.dev";
|
|
46
32
|
var TranscriptionAction;
|
|
@@ -49,8 +35,7 @@ var TranscriptionAction;
|
|
|
49
35
|
class Create extends S2.TaggedClass()(`${TRANSCRIPTION_ACTION}/create`, {
|
|
50
36
|
input: S2.Struct({
|
|
51
37
|
name: S2.optional(S2.String),
|
|
52
|
-
|
|
53
|
-
spaceId: S2.String
|
|
38
|
+
spaceId: SpaceIdSchema
|
|
54
39
|
}),
|
|
55
40
|
output: S2.Struct({
|
|
56
41
|
object: TranscriptType
|
|
@@ -62,13 +47,16 @@ var TranscriptionAction;
|
|
|
62
47
|
var isTranscript = (object) => {
|
|
63
48
|
return isLiveObject(object) && isInstanceOf(TranscriptType, object);
|
|
64
49
|
};
|
|
50
|
+
var TranscriptionSettingsSchema = S2.mutable(S2.Struct({
|
|
51
|
+
entityExtraction: S2.optional(S2.Boolean).pipe(S2.withConstructorDefault(() => true))
|
|
52
|
+
}));
|
|
65
53
|
|
|
66
54
|
export {
|
|
67
55
|
TranscriptSchema,
|
|
68
56
|
TranscriptType,
|
|
69
|
-
TranscriptBlock,
|
|
70
57
|
TRANSCRIPTION_URL,
|
|
71
58
|
TranscriptionAction,
|
|
72
|
-
isTranscript
|
|
59
|
+
isTranscript,
|
|
60
|
+
TranscriptionSettingsSchema
|
|
73
61
|
};
|
|
74
|
-
//# sourceMappingURL=chunk-
|
|
62
|
+
//# sourceMappingURL=chunk-OS2ITZUL.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Expando, Ref, S, TypedObject } from '@dxos/echo-schema';\n\n/**\n * Root transcript object created when the user starts a transcription.\n */\nexport const TranscriptSchema = S.Struct({\n name: S.String,\n\n // TODO(burdon): Use Date or string?\n started: S.optional(S.String),\n ended: S.optional(S.String),\n\n /**\n * Queue containing TranscriptBlock objects.\n */\n // TODO(wittjosiah): Should be a ref to a queue.\n queue: Ref(Expando),\n});\n\nexport class TranscriptType extends TypedObject({\n typename: 'dxos.org/type/Transcript',\n version: '0.1.0',\n})(TranscriptSchema.fields) {}\n\n// TODO(burdon): Do these need to be kept in sync with EDGE?\n\n/**\n * First message in queue.\n * Contains metadata for the recording and transcript.\n */\nconst TranscriptHeader = S.Struct({\n started: S.optional(S.String),\n});\n\nexport type TranscriptHeader = S.Schema.Type<typeof TranscriptHeader>;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { SpaceIdSchema, S, isInstanceOf } from '@dxos/echo-schema';\nimport { isLiveObject } from '@dxos/react-client/echo';\n\nimport { TranscriptType } from './schema';\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\n\n// TODO(burdon): Move to separate proto.\n\n/**\n * Endpoint to the calls service.\n */\n// TODO(burdon): Reconfigure/move.\nexport const TRANSCRIPTION_URL = 'https://calls-service.dxos.workers.dev';\n\nexport namespace TranscriptionAction {\n const TRANSCRIPTION_ACTION = `${TRANSCRIPTION_PLUGIN}/action`;\n\n export class Create extends S.TaggedClass<Create>()(`${TRANSCRIPTION_ACTION}/create`, {\n input: S.Struct({\n name: S.optional(S.String),\n spaceId: SpaceIdSchema,\n }),\n output: S.Struct({\n object: TranscriptType,\n }),\n }) {}\n}\n\nexport const isTranscript = (object: unknown): object is typeof TranscriptType => {\n return isLiveObject(object) && isInstanceOf(TranscriptType, object);\n};\n\n// TODO(burdon): Create with decode consistently: S.decodeSync(TranscriptionSettingsSchema)({}))\nexport const TranscriptionSettingsSchema = S.mutable(\n S.Struct({\n entityExtraction: S.optional(S.Boolean).pipe(S.withConstructorDefault(() => true)),\n }),\n);\n\nexport type TranscriptionSettingsProps = S.Schema.Type<typeof TranscriptionSettingsSchema>;\n"],
|
|
5
|
+
"mappings": ";;;;;;AAIA,SAASA,SAASC,KAAKC,GAAGC,mBAAmB;AAKtC,IAAMC,mBAAmBC,EAAEC,OAAO;EACvCC,MAAMF,EAAEG;;EAGRC,SAASJ,EAAEK,SAASL,EAAEG,MAAM;EAC5BG,OAAON,EAAEK,SAASL,EAAEG,MAAM;;;;;EAM1BI,OAAOC,IAAIC,OAAAA;AACb,CAAA;AAEO,IAAMC,iBAAN,cAA6BC,YAAY;EAC9CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAGd,iBAAiBe,MAAM,EAAA;AAAG;AAQ7B,IAAMC,mBAAmBf,EAAEC,OAAO;EAChCG,SAASJ,EAAEK,SAASL,EAAEG,MAAM;AAC9B,CAAA;;;AChCA,SAASa,eAAeC,KAAAA,IAAGC,oBAAoB;AAC/C,SAASC,oBAAoB;AAWtB,IAAMC,oBAAoB;;UAEhBC,sBAAAA;AACf,QAAMC,uBAAuB,GAAGC,oBAAAA;EAEzB,MAAMC,eAAeC,GAAEC,YAAW,EAAW,GAAGJ,oBAAAA,WAA+B;IACpFK,OAAOF,GAAEG,OAAO;MACdC,MAAMJ,GAAEK,SAASL,GAAEM,MAAM;MACzBC,SAASC;IACX,CAAA;IACAC,QAAQT,GAAEG,OAAO;MACfO,QAAQC;IACV,CAAA;EACF,CAAA,EAAA;EAAI;uBARSZ,SAAAA;AASf,GAZiBH,wBAAAA,sBAAAA,CAAAA,EAAAA;AAcV,IAAMgB,eAAe,CAACF,WAAAA;AAC3B,SAAOG,aAAaH,MAAAA,KAAWI,aAAaH,gBAAgBD,MAAAA;AAC9D;AAGO,IAAMK,8BAA8Bf,GAAEgB,QAC3ChB,GAAEG,OAAO;EACPc,kBAAkBjB,GAAEK,SAASL,GAAEkB,OAAO,EAAEC,KAAKnB,GAAEoB,uBAAuB,MAAM,IAAA,CAAA;AAC9E,CAAA,CAAA;",
|
|
6
|
+
"names": ["Expando", "Ref", "S", "TypedObject", "TranscriptSchema", "S", "Struct", "name", "String", "started", "optional", "ended", "queue", "Ref", "Expando", "TranscriptType", "TypedObject", "typename", "version", "fields", "TranscriptHeader", "SpaceIdSchema", "S", "isInstanceOf", "isLiveObject", "TRANSCRIPTION_URL", "TranscriptionAction", "TRANSCRIPTION_ACTION", "TRANSCRIPTION_PLUGIN", "Create", "S", "TaggedClass", "input", "Struct", "name", "optional", "String", "spaceId", "SpaceIdSchema", "output", "object", "TranscriptType", "isTranscript", "isLiveObject", "isInstanceOf", "TranscriptionSettingsSchema", "mutable", "entityExtraction", "Boolean", "pipe", "withConstructorDefault"]
|
|
7
|
+
}
|
|
@@ -3,9 +3,8 @@ import {
|
|
|
3
3
|
mergeFloat64Arrays
|
|
4
4
|
} from "./chunk-QMHMEKB3.mjs";
|
|
5
5
|
import {
|
|
6
|
-
TRANSCRIPTION_URL
|
|
7
|
-
|
|
8
|
-
} from "./chunk-54HDN33F.mjs";
|
|
6
|
+
TRANSCRIPTION_URL
|
|
7
|
+
} from "./chunk-OS2ITZUL.mjs";
|
|
9
8
|
|
|
10
9
|
// packages/plugins/plugin-transcription/src/transcriber/media-stream-recorder.ts
|
|
11
10
|
import { MediaRecorder, register } from "extendable-media-recorder";
|
|
@@ -151,17 +150,35 @@ var Transcriber = class extends Resource {
|
|
|
151
150
|
this._onSegments = onSegments;
|
|
152
151
|
}
|
|
153
152
|
async _open(ctx) {
|
|
153
|
+
log2.info("opening", void 0, {
|
|
154
|
+
F: __dxlog_file2,
|
|
155
|
+
L: 97,
|
|
156
|
+
S: this,
|
|
157
|
+
C: (f, a) => f(...a)
|
|
158
|
+
});
|
|
154
159
|
this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));
|
|
155
160
|
await this._recorder.start();
|
|
156
161
|
this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());
|
|
157
162
|
this._openTrigger.wake();
|
|
158
163
|
}
|
|
159
164
|
async _close() {
|
|
165
|
+
log2.info("closing", void 0, {
|
|
166
|
+
F: __dxlog_file2,
|
|
167
|
+
L: 105,
|
|
168
|
+
S: this,
|
|
169
|
+
C: (f, a) => f(...a)
|
|
170
|
+
});
|
|
160
171
|
this._recording = false;
|
|
161
172
|
this._transcribeTask = void 0;
|
|
162
173
|
await this._recorder.stop();
|
|
163
174
|
}
|
|
164
175
|
startChunksRecording() {
|
|
176
|
+
log2.info("starting", void 0, {
|
|
177
|
+
F: __dxlog_file2,
|
|
178
|
+
L: 112,
|
|
179
|
+
S: this,
|
|
180
|
+
C: (f, a) => f(...a)
|
|
181
|
+
});
|
|
165
182
|
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
166
183
|
return;
|
|
167
184
|
}
|
|
@@ -173,13 +190,19 @@ var Transcriber = class extends Resource {
|
|
|
173
190
|
}
|
|
174
191
|
this._recording = false;
|
|
175
192
|
this._transcribeTask?.schedule();
|
|
193
|
+
log2.info("stopped", void 0, {
|
|
194
|
+
F: __dxlog_file2,
|
|
195
|
+
L: 127,
|
|
196
|
+
S: this,
|
|
197
|
+
C: (f, a) => f(...a)
|
|
198
|
+
});
|
|
176
199
|
}
|
|
177
200
|
_saveAudioChunk(chunk) {
|
|
178
201
|
log2("saving audio chunk", {
|
|
179
202
|
chunk
|
|
180
203
|
}, {
|
|
181
204
|
F: __dxlog_file2,
|
|
182
|
-
L:
|
|
205
|
+
L: 131,
|
|
183
206
|
S: this,
|
|
184
207
|
C: (f, a) => f(...a)
|
|
185
208
|
});
|
|
@@ -195,7 +218,7 @@ var Transcriber = class extends Resource {
|
|
|
195
218
|
chunks: this._audioChunks.length
|
|
196
219
|
}, {
|
|
197
220
|
F: __dxlog_file2,
|
|
198
|
-
L:
|
|
221
|
+
L: 147,
|
|
199
222
|
S: this,
|
|
200
223
|
C: (f, a) => f(...a)
|
|
201
224
|
});
|
|
@@ -239,15 +262,15 @@ var Transcriber = class extends Resource {
|
|
|
239
262
|
});
|
|
240
263
|
if (!response.ok) {
|
|
241
264
|
this._audioChunks = [];
|
|
242
|
-
throw new Error(
|
|
265
|
+
throw new Error(`Transcription failed: ${response.statusText}`);
|
|
243
266
|
}
|
|
244
267
|
const { segments } = await response.json();
|
|
245
268
|
log2.info("transcription response", {
|
|
246
|
-
segments,
|
|
269
|
+
segments: segments.length,
|
|
247
270
|
string: segments.map((segments2) => segments2.text).join(" ")
|
|
248
271
|
}, {
|
|
249
272
|
F: __dxlog_file2,
|
|
250
|
-
L:
|
|
273
|
+
L: 211,
|
|
251
274
|
S: this,
|
|
252
275
|
C: (f, a) => f(...a)
|
|
253
276
|
});
|
|
@@ -269,8 +292,9 @@ var Transcriber = class extends Resource {
|
|
|
269
292
|
}
|
|
270
293
|
this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1).end * 1e3;
|
|
271
294
|
return filteredSegments.map((segment) => ({
|
|
295
|
+
type: "transcription",
|
|
272
296
|
started: new Date(zeroTimestamp + segment.start * 1e3).toISOString(),
|
|
273
|
-
text: segment.text
|
|
297
|
+
text: segment.text.trim()
|
|
274
298
|
}));
|
|
275
299
|
}
|
|
276
300
|
};
|
|
@@ -290,8 +314,8 @@ import { synchronized as synchronized2 } from "@dxos/async";
|
|
|
290
314
|
import { Resource as Resource2 } from "@dxos/context";
|
|
291
315
|
import { QueueImpl } from "@dxos/echo-db";
|
|
292
316
|
import { create } from "@dxos/echo-schema";
|
|
293
|
-
import {
|
|
294
|
-
import {
|
|
317
|
+
import { log as log3 } from "@dxos/log";
|
|
318
|
+
import { MessageType } from "@dxos/schema";
|
|
295
319
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
296
320
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
297
321
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -303,16 +327,16 @@ var RECORD_INTERVAL = 200;
|
|
|
303
327
|
var PREFIXED_CHUNKS_AMOUNT = 10;
|
|
304
328
|
var TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;
|
|
305
329
|
var TranscriptionManager = class extends Resource2 {
|
|
306
|
-
constructor(
|
|
330
|
+
constructor(options) {
|
|
307
331
|
super();
|
|
308
332
|
this._audioStreamTrack = void 0;
|
|
309
|
-
this.
|
|
310
|
-
this._hue = void 0;
|
|
333
|
+
this._identityDid = void 0;
|
|
311
334
|
this._mediaRecorder = void 0;
|
|
312
335
|
this._transcriber = void 0;
|
|
313
|
-
this._enabled = false;
|
|
314
336
|
this._queue = void 0;
|
|
315
|
-
this.
|
|
337
|
+
this._enabled = false;
|
|
338
|
+
this._edgeClient = options.edgeClient;
|
|
339
|
+
this._messageEnricher = options.messageEnricher;
|
|
316
340
|
}
|
|
317
341
|
async _open() {
|
|
318
342
|
await this._toggleTranscriber();
|
|
@@ -320,15 +344,36 @@ var TranscriptionManager = class extends Resource2 {
|
|
|
320
344
|
async _close() {
|
|
321
345
|
void this._transcriber?.close();
|
|
322
346
|
}
|
|
347
|
+
setQueue(queueDxn) {
|
|
348
|
+
if (this._queue?.dxn.toString() !== queueDxn.toString()) {
|
|
349
|
+
log3.info("setQueue", {
|
|
350
|
+
queueDxn: queueDxn.toString()
|
|
351
|
+
}, {
|
|
352
|
+
F: __dxlog_file3,
|
|
353
|
+
L: 73,
|
|
354
|
+
S: this,
|
|
355
|
+
C: (f, a) => f(...a)
|
|
356
|
+
});
|
|
357
|
+
this._queue = new QueueImpl(this._edgeClient, queueDxn);
|
|
358
|
+
}
|
|
359
|
+
return this;
|
|
360
|
+
}
|
|
361
|
+
setIdentityDid(did) {
|
|
362
|
+
if (this._identityDid !== did) {
|
|
363
|
+
this._identityDid = did;
|
|
364
|
+
}
|
|
365
|
+
return this;
|
|
366
|
+
}
|
|
323
367
|
setRecording(recording) {
|
|
324
368
|
if (!this.isOpen || !this._enabled) {
|
|
325
|
-
return;
|
|
369
|
+
return this;
|
|
326
370
|
}
|
|
327
371
|
if (recording) {
|
|
328
372
|
this._transcriber?.startChunksRecording();
|
|
329
373
|
} else {
|
|
330
374
|
this._transcriber?.stopChunksRecording();
|
|
331
375
|
}
|
|
376
|
+
return this;
|
|
332
377
|
}
|
|
333
378
|
/**
|
|
334
379
|
* Enable or disable transcription.
|
|
@@ -348,56 +393,45 @@ var TranscriptionManager = class extends Resource2 {
|
|
|
348
393
|
this._audioStreamTrack = track;
|
|
349
394
|
this.isOpen && await this._toggleTranscriber();
|
|
350
395
|
}
|
|
351
|
-
|
|
352
|
-
* Set the queue to save the transcription to.
|
|
353
|
-
* @param queue - The queue to save the transcription to or the DXN of the queue.
|
|
354
|
-
*/
|
|
355
|
-
setQueue(queue) {
|
|
356
|
-
switch (typeof queue) {
|
|
357
|
-
case "string":
|
|
358
|
-
if (this._queue?.dxn.toString() === queue) {
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
this._queue = new QueueImpl(this._edgeClient, DXN.parse(queue));
|
|
362
|
-
break;
|
|
363
|
-
case "object":
|
|
364
|
-
if (this._queue === queue) {
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
invariant2(queue instanceof QueueImpl, void 0, {
|
|
368
|
-
F: __dxlog_file3,
|
|
369
|
-
L: 113,
|
|
370
|
-
S: this,
|
|
371
|
-
A: [
|
|
372
|
-
"queue instanceof QueueImpl",
|
|
373
|
-
""
|
|
374
|
-
]
|
|
375
|
-
});
|
|
376
|
-
this._queue = queue;
|
|
377
|
-
break;
|
|
378
|
-
case "undefined":
|
|
379
|
-
this._queue = void 0;
|
|
380
|
-
break;
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
setName(name) {
|
|
384
|
-
if (this._name === name) {
|
|
385
|
-
return;
|
|
386
|
-
}
|
|
387
|
-
this._name = name;
|
|
388
|
-
}
|
|
389
|
-
setHue(hue) {
|
|
390
|
-
if (this._hue === hue) {
|
|
391
|
-
return;
|
|
392
|
-
}
|
|
393
|
-
this._hue = hue;
|
|
394
|
-
}
|
|
396
|
+
// TODO(burdon): Change this to setEnables (explicit), not toggle.
|
|
395
397
|
async _toggleTranscriber() {
|
|
396
398
|
await this._maybeReinitTranscriber();
|
|
397
399
|
if (this._enabled) {
|
|
398
400
|
await this._transcriber?.open();
|
|
401
|
+
const block = create(MessageType, {
|
|
402
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
403
|
+
blocks: [
|
|
404
|
+
{
|
|
405
|
+
type: "transcription",
|
|
406
|
+
text: "Started",
|
|
407
|
+
started: (/* @__PURE__ */ new Date()).toISOString()
|
|
408
|
+
}
|
|
409
|
+
],
|
|
410
|
+
sender: {
|
|
411
|
+
role: "assistant"
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
this._queue?.append([
|
|
415
|
+
block
|
|
416
|
+
]);
|
|
399
417
|
} else {
|
|
400
418
|
await this._transcriber?.close();
|
|
419
|
+
const block = create(MessageType, {
|
|
420
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
421
|
+
blocks: [
|
|
422
|
+
{
|
|
423
|
+
type: "transcription",
|
|
424
|
+
text: "Stopped",
|
|
425
|
+
started: (/* @__PURE__ */ new Date()).toISOString()
|
|
426
|
+
}
|
|
427
|
+
],
|
|
428
|
+
sender: {
|
|
429
|
+
role: "assistant"
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
this._queue?.append([
|
|
433
|
+
block
|
|
434
|
+
]);
|
|
401
435
|
}
|
|
402
436
|
}
|
|
403
437
|
async _maybeReinitTranscriber() {
|
|
@@ -428,38 +462,31 @@ var TranscriptionManager = class extends Resource2 {
|
|
|
428
462
|
if (!this.isOpen || !this._queue) {
|
|
429
463
|
return;
|
|
430
464
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
465
|
+
let block = create(MessageType, {
|
|
466
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
467
|
+
blocks: segments,
|
|
468
|
+
sender: {
|
|
469
|
+
identityDid: this._identityDid
|
|
470
|
+
}
|
|
435
471
|
});
|
|
472
|
+
if (this._messageEnricher) {
|
|
473
|
+
block = await this._messageEnricher(block);
|
|
474
|
+
}
|
|
436
475
|
this._queue.append([
|
|
437
476
|
block
|
|
438
477
|
]);
|
|
439
478
|
}
|
|
440
479
|
};
|
|
441
|
-
_ts_decorate3([
|
|
442
|
-
synchronized2
|
|
443
|
-
], TranscriptionManager.prototype, "setRecording", null);
|
|
444
480
|
_ts_decorate3([
|
|
445
481
|
synchronized2
|
|
446
482
|
], TranscriptionManager.prototype, "setEnabled", null);
|
|
447
483
|
_ts_decorate3([
|
|
448
484
|
synchronized2
|
|
449
485
|
], TranscriptionManager.prototype, "setAudioTrack", null);
|
|
450
|
-
_ts_decorate3([
|
|
451
|
-
synchronized2
|
|
452
|
-
], TranscriptionManager.prototype, "setQueue", null);
|
|
453
|
-
_ts_decorate3([
|
|
454
|
-
synchronized2
|
|
455
|
-
], TranscriptionManager.prototype, "setName", null);
|
|
456
|
-
_ts_decorate3([
|
|
457
|
-
synchronized2
|
|
458
|
-
], TranscriptionManager.prototype, "setHue", null);
|
|
459
486
|
|
|
460
487
|
export {
|
|
461
488
|
MediaStreamRecorder,
|
|
462
489
|
Transcriber,
|
|
463
490
|
TranscriptionManager
|
|
464
491
|
};
|
|
465
|
-
//# sourceMappingURL=chunk-
|
|
492
|
+
//# sourceMappingURL=chunk-UWF6LM27.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/transcriber/media-stream-recorder.ts", "../../../src/transcriber/transcriber.ts", "../../../src/transcriber/transcription-manager.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { 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 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 { type TranscriptionContentBlock } from '@dxos/schema';\nimport { trace } from '@dxos/tracing';\n\nimport { type AudioRecorder, type AudioChunk } from './audio-recorder';\nimport { TRANSCRIPTION_URL } 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: TranscriptionContentBlock[]) => 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 log.info('opening');\n this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));\n await this._recorder.start();\n this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());\n this._openTrigger.wake();\n }\n\n protected override async _close() {\n log.info('closing');\n this._recording = false;\n this._transcribeTask = undefined;\n await this._recorder.stop();\n }\n\n startChunksRecording() {\n log.info('starting');\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n\n this._recording = true;\n }\n\n stopChunksRecording() {\n if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {\n return;\n }\n\n this._recording = false;\n this._transcribeTask?.schedule();\n log.info('stopped');\n }\n\n private _saveAudioChunk(chunk: AudioChunk) {\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(`Transcription failed: ${response.statusText}`);\n }\n\n const { segments } = (await response.json()) as {\n segments: WhisperSegment[];\n };\n\n log.info('transcription response', {\n segments: segments.length,\n string: segments.map((segments) => segments.text).join(' '),\n });\n\n return segments;\n }\n\n private _alignSegments(segments: WhisperSegment[], originalChunks: AudioChunk[]): TranscriptionContentBlock[] {\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 type: 'transcription',\n started: new Date(zeroTimestamp + segment.start * 1_000).toISOString(),\n text: segment.text.trim(),\n }));\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { synchronized } from '@dxos/async';\nimport { Resource } from '@dxos/context';\nimport { QueueImpl, type Queue } from '@dxos/echo-db';\nimport { create } from '@dxos/echo-schema';\nimport { type DXN } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type EdgeHttpClient } from '@dxos/react-edge-client';\nimport { MessageType, type TranscriptionContentBlock } from '@dxos/schema';\n\nimport { MediaStreamRecorder } from './media-stream-recorder';\nimport { Transcriber } from './transcriber';\n\n/**\n * Length of the chunk in ms.\n */\nconst RECORD_INTERVAL = 200;\n\n/**\n * Number of chunks to save before the user starts speaking.\n */\nconst PREFIXED_CHUNKS_AMOUNT = 10;\n\n/**\n * Number of chunks to transcribe automatically after.\n * Combined should be mess than 25MB or whisper would fail.\n */\nconst TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;\n\nexport type TranscriptMessageEnricher = (message: MessageType) => Promise<MessageType>;\n\nexport type TranscriptionManagerOptions = {\n edgeClient: EdgeHttpClient;\n\n /**\n * Enrich the message before it is written to the transcription queue.\n */\n messageEnricher?: TranscriptMessageEnricher;\n};\n\n/**\n * Manages transcription state for a meeting.\n */\nexport class TranscriptionManager extends Resource {\n private readonly _edgeClient: EdgeHttpClient;\n private readonly _messageEnricher?: TranscriptMessageEnricher;\n private _audioStreamTrack?: MediaStreamTrack = undefined;\n private _identityDid?: string = undefined;\n private _mediaRecorder?: MediaStreamRecorder = undefined;\n private _transcriber?: Transcriber = undefined;\n private _queue?: Queue<MessageType> = undefined;\n private _enabled = false;\n\n constructor(options: TranscriptionManagerOptions) {\n super();\n this._edgeClient = options.edgeClient;\n this._messageEnricher = options.messageEnricher;\n }\n\n protected override async _open() {\n await this._toggleTranscriber();\n }\n\n protected override async _close() {\n void this._transcriber?.close();\n }\n\n setQueue(queueDxn: DXN): TranscriptionManager {\n if (this._queue?.dxn.toString() !== queueDxn.toString()) {\n log.info('setQueue', { queueDxn: queueDxn.toString() });\n this._queue = new QueueImpl<MessageType>(this._edgeClient, queueDxn);\n }\n return this;\n }\n\n setIdentityDid(did: string): TranscriptionManager {\n if (this._identityDid !== did) {\n this._identityDid = did;\n }\n return this;\n }\n\n setRecording(recording?: boolean): TranscriptionManager {\n if (!this.isOpen || !this._enabled) {\n return this;\n }\n\n if (recording) {\n this._transcriber?.startChunksRecording();\n } else {\n this._transcriber?.stopChunksRecording();\n }\n return this;\n }\n\n /**\n * Enable or disable transcription.\n * @param enabled - Whether to enable transcription.\n */\n @synchronized\n async setEnabled(enabled?: boolean) {\n if (this._enabled === enabled) {\n return;\n }\n\n this._enabled = enabled ?? false;\n // TODO(burdon): Why is toggle called here?\n this.isOpen && (await this._toggleTranscriber());\n }\n\n @synchronized\n async setAudioTrack(track?: MediaStreamTrack) {\n if (this._audioStreamTrack === track) {\n return;\n }\n\n this._audioStreamTrack = track;\n this.isOpen && (await this._toggleTranscriber());\n }\n\n // TODO(burdon): Change this to setEnables (explicit), not toggle.\n private async _toggleTranscriber() {\n await this._maybeReinitTranscriber();\n\n // Open or close transcriber if transcription is enabled or disabled.\n if (this._enabled) {\n await this._transcriber?.open();\n // TODO(burdon): Started and stopped blocks appear twice.\n const block = create(MessageType, {\n created: new Date().toISOString(),\n blocks: [{ type: 'transcription', text: 'Started', started: new Date().toISOString() }],\n sender: { role: 'assistant' },\n });\n this._queue?.append([block]);\n } else {\n await this._transcriber?.close();\n const block = create(MessageType, {\n created: new Date().toISOString(),\n blocks: [{ type: 'transcription', text: 'Stopped', started: new Date().toISOString() }],\n sender: { role: 'assistant' },\n });\n this._queue?.append([block]);\n }\n }\n\n private async _maybeReinitTranscriber() {\n if (!this._audioStreamTrack || !this._enabled) {\n return;\n }\n\n // Reinitialize transcriber if queue or media stream track has changed.\n let needReinit = false;\n if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {\n this._mediaRecorder = new MediaStreamRecorder({\n mediaStreamTrack: this._audioStreamTrack,\n interval: RECORD_INTERVAL,\n });\n needReinit = true;\n }\n if (needReinit) {\n await this._transcriber?.close();\n this._transcriber = new Transcriber({\n config: {\n transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,\n prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,\n },\n recorder: this._mediaRecorder,\n onSegments: (segments) => this._onSegments(segments),\n });\n }\n }\n\n private async _onSegments(segments: TranscriptionContentBlock[]) {\n if (!this.isOpen || !this._queue) {\n return;\n }\n\n let block = create(MessageType, {\n created: new Date().toISOString(),\n blocks: segments,\n sender: { identityDid: this._identityDid },\n });\n\n if (this._messageEnricher) {\n block = await this._messageEnricher(block);\n }\n\n this._queue.append([block]);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["MediaRecorder", "register", "WaveFile", "synchronized", "invariant", "log", "trace", "initializingPromise", "initializeExtendableMediaRecorder", "connect", "MediaStreamRecorder", "constructor", "mediaStreamTrack", "interval", "_mediaRecorder", "undefined", "_header", "_mediaStreamTrack", "_interval", "wavConfig", "settings", "getSettings", "channels", "channelCount", "sampleRate", "bitDepthCode", "sampleSize", "String", "setOnChunk", "onChunk", "_onChunk", "start", "catch", "err", "info", "stream", "MediaStream", "mimeType", "state", "ondataavailable", "event", "_ondataavailable", "stop", "blob", "data", "uint8Array", "Uint8Array", "arrayBuffer", "isHeader", "wav", "slice", "warn", "timestamp", "Date", "now", "getSamples", "resource", "WaveFile", "DeferredTask", "Trigger", "LifecycleState", "Resource", "log", "trace", "Transcriber", "Resource", "constructor", "config", "recorder", "onSegments", "_audioChunks", "_lastUsedTimestamp", "_openTrigger", "Trigger", "autoReset", "_recording", "_transcribeTask", "undefined", "_config", "_recorder", "_onSegments", "_open", "ctx", "log", "info", "setOnChunk", "chunk", "_saveAudioChunk", "start", "DeferredTask", "_transcribe", "wake", "_close", "stop", "startChunksRecording", "_lifecycleState", "LifecycleState", "OPEN", "stopChunksRecording", "schedule", "push", "scheduled", "length", "prefixBufferChunksAmount", "_dropOldChunks", "transcribeAfterChunksAmount", "chunks", "audio", "_mergeAudioChunks", "segments", "_fetchTranscription", "Array", "isArray", "alignedSegments", "_alignSegments", "slice", "file", "WaveFile", "wavConfig", "fromScratch", "channels", "sampleRate", "bitDepthCode", "mergeFloat64Arrays", "map", "data", "toBase64", "Error", "response", "fetch", "TRANSCRIPTION_URL", "method", "body", "JSON", "stringify", "headers", "ok", "statusText", "json", "string", "text", "join", "originalChunks", "zeroTimestamp", "at", "timestamp", "filteredSegments", "filter", "segment", "end", "words", "word", "type", "started", "Date", "toISOString", "trim", "trace", "span", "showInBrowserTimeline", "synchronized", "Resource", "QueueImpl", "create", "log", "MessageType", "RECORD_INTERVAL", "PREFIXED_CHUNKS_AMOUNT", "TRANSCRIBE_AFTER_CHUNKS_AMOUNT", "TranscriptionManager", "Resource", "constructor", "options", "_audioStreamTrack", "undefined", "_identityDid", "_mediaRecorder", "_transcriber", "_queue", "_enabled", "_edgeClient", "edgeClient", "_messageEnricher", "messageEnricher", "_open", "_toggleTranscriber", "_close", "close", "setQueue", "queueDxn", "dxn", "toString", "log", "info", "QueueImpl", "setIdentityDid", "did", "setRecording", "recording", "isOpen", "startChunksRecording", "stopChunksRecording", "setEnabled", "enabled", "setAudioTrack", "track", "_maybeReinitTranscriber", "open", "block", "create", "MessageType", "created", "Date", "toISOString", "blocks", "type", "text", "started", "sender", "role", "append", "needReinit", "mediaStreamTrack", "MediaStreamRecorder", "interval", "Transcriber", "config", "transcribeAfterChunksAmount", "prefixBufferChunksAmount", "recorder", "onSegments", "segments", "_onSegments", "identityDid", "synchronized"]
|
|
7
|
+
}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
|
-
TranscriptContainer
|
|
4
|
-
|
|
3
|
+
TranscriptContainer,
|
|
4
|
+
TranscriptionSettings
|
|
5
|
+
} from "./chunk-HZBSWUJH.mjs";
|
|
5
6
|
import {
|
|
6
7
|
AppGraphBuilder,
|
|
7
8
|
IntentResolver,
|
|
8
9
|
MeetingTranscriptionState,
|
|
9
10
|
ReactSurface,
|
|
11
|
+
Settings,
|
|
10
12
|
Transcriber as Transcriber2,
|
|
11
13
|
Transcript,
|
|
12
14
|
TranscriptionContainer,
|
|
@@ -16,20 +18,19 @@ import {
|
|
|
16
18
|
useQueueModelAdapter,
|
|
17
19
|
useTranscriber,
|
|
18
20
|
useVoiceInput
|
|
19
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-4RMJO6QQ.mjs";
|
|
20
22
|
import {
|
|
21
23
|
MediaStreamRecorder,
|
|
22
24
|
Transcriber,
|
|
23
25
|
TranscriptionManager
|
|
24
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-UWF6LM27.mjs";
|
|
25
27
|
import "./chunk-QMHMEKB3.mjs";
|
|
26
28
|
import {
|
|
27
|
-
TranscriptBlock,
|
|
28
29
|
TranscriptType
|
|
29
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-OS2ITZUL.mjs";
|
|
30
31
|
import {
|
|
31
32
|
TranscriptionCapabilities
|
|
32
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-5E2MR5XK.mjs";
|
|
33
34
|
import {
|
|
34
35
|
TRANSCRIPTION_PLUGIN,
|
|
35
36
|
meta
|
|
@@ -40,6 +41,8 @@ import { Capabilities, Events, contributes, defineModule, definePlugin } from "@
|
|
|
40
41
|
import { QueueImpl } from "@dxos/echo-db";
|
|
41
42
|
import { isInstanceOf } from "@dxos/echo-schema";
|
|
42
43
|
import { ClientCapabilities, ClientEvents } from "@dxos/plugin-client";
|
|
44
|
+
import { getSpace } from "@dxos/react-client/echo";
|
|
45
|
+
import { MessageType } from "@dxos/schema";
|
|
43
46
|
|
|
44
47
|
// packages/plugins/plugin-transcription/src/translations.ts
|
|
45
48
|
var translations_default = [
|
|
@@ -56,7 +59,8 @@ var translations_default = [
|
|
|
56
59
|
"stop transcription label": "Stop transcription",
|
|
57
60
|
"delete button": "Delete",
|
|
58
61
|
"bookmark button": "Bookmark",
|
|
59
|
-
"scroll to end label": "Scroll to latest"
|
|
62
|
+
"scroll to end label": "Scroll to latest",
|
|
63
|
+
"settings entity extraction label": "Entity extraction"
|
|
60
64
|
}
|
|
61
65
|
}
|
|
62
66
|
}
|
|
@@ -70,14 +74,9 @@ var TranscriptionPlugin = () => definePlugin(meta, [
|
|
|
70
74
|
activate: () => contributes(Capabilities.Translations, translations_default)
|
|
71
75
|
}),
|
|
72
76
|
defineModule({
|
|
73
|
-
id: `${meta.id}/module/
|
|
74
|
-
activatesOn: Events.
|
|
75
|
-
activate:
|
|
76
|
-
}),
|
|
77
|
-
defineModule({
|
|
78
|
-
id: `${meta.id}/module/meeting-transcription-state`,
|
|
79
|
-
activatesOn: Events.SetupAppGraph,
|
|
80
|
-
activate: MeetingTranscriptionState
|
|
77
|
+
id: `${meta.id}/module/settings`,
|
|
78
|
+
activatesOn: Events.SetupSettings,
|
|
79
|
+
activate: Settings
|
|
81
80
|
}),
|
|
82
81
|
defineModule({
|
|
83
82
|
id: `${meta.id}/module/metadata`,
|
|
@@ -89,9 +88,11 @@ var TranscriptionPlugin = () => definePlugin(meta, [
|
|
|
89
88
|
// TODO(wittjosiah): Factor out. Artifact? Separate capability?
|
|
90
89
|
getTextContent: async (transcript) => {
|
|
91
90
|
const client = context.requestCapability(ClientCapabilities.Client);
|
|
91
|
+
const space = getSpace(transcript);
|
|
92
|
+
const members = space?.members.get().map((member) => member.identity) ?? [];
|
|
92
93
|
const queue = new QueueImpl(client.edge, transcript.queue.dxn);
|
|
93
94
|
await queue.refresh();
|
|
94
|
-
const content = queue.items.filter((
|
|
95
|
+
const content = queue.items.filter((message) => isInstanceOf(MessageType, message)).flatMap((message, index) => renderMarkdown(members)(message, index)).join("\n\n");
|
|
95
96
|
return content;
|
|
96
97
|
}
|
|
97
98
|
}
|
|
@@ -120,6 +121,16 @@ var TranscriptionPlugin = () => definePlugin(meta, [
|
|
|
120
121
|
id: `${meta.id}/module/app-graph-builder`,
|
|
121
122
|
activatesOn: Events.SetupAppGraph,
|
|
122
123
|
activate: AppGraphBuilder
|
|
124
|
+
}),
|
|
125
|
+
defineModule({
|
|
126
|
+
id: `${meta.id}/module/transcription`,
|
|
127
|
+
activatesOn: Events.SetupAppGraph,
|
|
128
|
+
activate: Transcriber2
|
|
129
|
+
}),
|
|
130
|
+
defineModule({
|
|
131
|
+
id: `${meta.id}/module/meeting-transcription-state`,
|
|
132
|
+
activatesOn: Events.SetupAppGraph,
|
|
133
|
+
activate: MeetingTranscriptionState
|
|
123
134
|
})
|
|
124
135
|
]);
|
|
125
136
|
export {
|
|
@@ -132,6 +143,7 @@ export {
|
|
|
132
143
|
TranscriptionContainer,
|
|
133
144
|
TranscriptionManager,
|
|
134
145
|
TranscriptionPlugin,
|
|
146
|
+
TranscriptionSettings,
|
|
135
147
|
meta,
|
|
136
148
|
renderMarkdown,
|
|
137
149
|
useAudioFile,
|