@dxos/plugin-transcription 0.8.2-main.fbd8ed0 → 0.8.2-staging.7ac8446
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-CXA4ZBHW.mjs → TranscriptContainer-JQ3HFHLQ.mjs} +2 -3
- package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs +191 -0
- package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs.map +7 -0
- package/dist/lib/browser/chunk-G4B6CPC2.mjs +253 -0
- package/dist/lib/browser/chunk-G4B6CPC2.mjs.map +7 -0
- package/dist/lib/browser/{chunk-KLD7O5GJ.mjs → chunk-GU2BNYKZ.mjs} +12 -2
- package/dist/lib/browser/chunk-GU2BNYKZ.mjs.map +7 -0
- package/dist/lib/browser/chunk-K7FOYAXO.mjs +8 -0
- package/dist/lib/browser/chunk-K7FOYAXO.mjs.map +7 -0
- package/dist/lib/browser/chunk-OGNXNGJB.mjs +73 -0
- package/dist/lib/browser/chunk-OGNXNGJB.mjs.map +7 -0
- package/dist/lib/browser/{chunk-3TKXI6TQ.mjs → chunk-YCZISX63.mjs} +81 -108
- package/dist/lib/browser/chunk-YCZISX63.mjs.map +7 -0
- package/dist/lib/browser/{chunk-LTIQFX4W.mjs → chunk-YEPT334A.mjs} +1 -1
- package/dist/lib/browser/chunk-YEPT334A.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +210 -47
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/{intent-resolver-DZ62CJPC.mjs → intent-resolver-4R66ZCKT.mjs} +8 -8
- package/dist/lib/browser/intent-resolver-4R66ZCKT.mjs.map +7 -0
- package/dist/lib/browser/{meeting-transcription-state-MNA2XROE.mjs → meeting-transcription-state-DLFHQK72.mjs} +4 -4
- package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-PUXZNAZL.mjs → react-surface-FQUHU5G7.mjs} +6 -18
- package/dist/lib/browser/react-surface-FQUHU5G7.mjs.map +7 -0
- package/dist/lib/browser/{transcriber-YWWIV6KP.mjs → transcriber-LGMIWDYI.mjs} +7 -8
- package/dist/lib/browser/{transcriber-YWWIV6KP.mjs.map → transcriber-LGMIWDYI.mjs.map} +3 -3
- package/dist/lib/browser/types/index.mjs +3 -3
- package/dist/lib/node/{TranscriptContainer-SSJVLRM6.cjs → TranscriptContainer-QEYTTT2V.cjs} +7 -8
- package/dist/lib/node/TranscriptContainer-QEYTTT2V.cjs.map +7 -0
- package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs +200 -0
- package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs.map +7 -0
- package/dist/lib/node/{chunk-J72PUQ3C.cjs → chunk-3KHUSQNW.cjs} +15 -6
- package/dist/lib/node/chunk-3KHUSQNW.cjs.map +7 -0
- package/dist/lib/node/{chunk-JUGOXWES.cjs → chunk-CZMLKKWT.cjs} +4 -4
- package/dist/lib/node/chunk-CZMLKKWT.cjs.map +7 -0
- package/dist/lib/node/{chunk-WKZLGVEJ.cjs → chunk-FCCJALOT.cjs} +83 -111
- package/dist/lib/node/chunk-FCCJALOT.cjs.map +7 -0
- package/dist/lib/node/{chunk-L27AK6FQ.cjs → chunk-LP4FG423.cjs} +8 -23
- package/dist/lib/node/chunk-LP4FG423.cjs.map +7 -0
- package/dist/lib/node/{chunk-EJWB53WK.cjs → chunk-P4VVD6ZO.cjs} +34 -24
- package/dist/lib/node/chunk-P4VVD6ZO.cjs.map +7 -0
- package/dist/lib/node/chunk-UOFHT4GZ.cjs +280 -0
- package/dist/lib/node/chunk-UOFHT4GZ.cjs.map +7 -0
- package/dist/lib/node/index.cjs +238 -66
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/{intent-resolver-TRBKI24D.cjs → intent-resolver-WMMCOUEH.cjs} +10 -11
- package/dist/lib/node/intent-resolver-WMMCOUEH.cjs.map +7 -0
- package/dist/lib/node/{meeting-transcription-state-5XLTMWPA.cjs → meeting-transcription-state-URIYILEQ.cjs} +7 -7
- package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-SZAMHCX7.cjs → react-surface-WI2MGWCC.cjs} +10 -20
- package/dist/lib/node/react-surface-WI2MGWCC.cjs.map +7 -0
- package/dist/lib/node/{transcriber-AFUXFHCR.cjs → transcriber-QG5WPKX4.cjs} +13 -14
- package/dist/lib/node/{transcriber-AFUXFHCR.cjs.map → transcriber-QG5WPKX4.cjs.map} +3 -3
- 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-M53LI2TX.mjs → TranscriptContainer-ZXUCOWGY.mjs} +2 -3
- package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs +192 -0
- package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-6X7X2UZF.mjs +254 -0
- package/dist/lib/node-esm/chunk-6X7X2UZF.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-GIO6J6FE.mjs +74 -0
- package/dist/lib/node-esm/chunk-GIO6J6FE.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-QMHMEKB3.mjs → chunk-HKATMD34.mjs} +12 -2
- package/dist/lib/node-esm/chunk-HKATMD34.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-J4D2RBBH.mjs +10 -0
- package/dist/lib/node-esm/chunk-J4D2RBBH.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-5E2MR5XK.mjs → chunk-PTZHDZ36.mjs} +1 -1
- package/dist/lib/node-esm/chunk-PTZHDZ36.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-V5IWBPYO.mjs → chunk-YQYBLFNI.mjs} +81 -108
- package/dist/lib/node-esm/chunk-YQYBLFNI.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +210 -47
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/{intent-resolver-HFVAL274.mjs → intent-resolver-QN2LO5TX.mjs} +8 -8
- package/dist/lib/node-esm/intent-resolver-QN2LO5TX.mjs.map +7 -0
- package/dist/lib/node-esm/{meeting-transcription-state-3WOZ52BQ.mjs → meeting-transcription-state-ZYVRAW6Y.mjs} +4 -4
- package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-UEJELL7I.mjs → react-surface-PCH6NTVB.mjs} +6 -18
- package/dist/lib/node-esm/react-surface-PCH6NTVB.mjs.map +7 -0
- package/dist/lib/node-esm/{transcriber-7RJEFPDI.mjs → transcriber-TMPYZ5L4.mjs} +7 -8
- package/dist/lib/node-esm/{transcriber-7RJEFPDI.mjs.map → transcriber-TMPYZ5L4.mjs.map} +3 -3
- 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 +179 -2
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +7 -5
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +182 -4
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/meeting-transcription-state.d.ts +4 -2
- package/dist/types/src/capabilities/meeting-transcription-state.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/Transcript.d.ts +4 -14
- package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts +4 -19
- package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
- package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +0 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/components/transcription.stories.d.ts +3 -6
- package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +0 -1
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
- package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -1
- package/dist/types/src/hooks/useTranscriber.d.ts +1 -1
- package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
- package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -1
- 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/transcriber.test.d.ts +2 -0
- package/dist/types/src/transcriber/transcriber.test.d.ts.map +1 -0
- package/dist/types/src/transcriber/transcription-manager.d.ts +15 -17
- package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +18 -3
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +40 -26
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +7 -18
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util/array.d.ts.map +1 -1
- package/dist/types/src/util/get-time-str.d.ts.map +1 -1
- package/dist/types/src/util/index.d.ts +1 -0
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/monitor-audio-level.d.ts.map +1 -1
- package/dist/types/src/util/random-queue-dxn.d.ts +3 -0
- package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +40 -57
- package/src/TranscriptionPlugin.tsx +13 -30
- package/src/capabilities/app-graph-builder.ts +111 -192
- package/src/capabilities/capabilities.ts +3 -4
- package/src/capabilities/index.ts +0 -1
- package/src/capabilities/intent-resolver.ts +7 -8
- package/src/capabilities/meeting-transcription-state.ts +2 -2
- package/src/capabilities/react-surface.tsx +4 -12
- package/src/capabilities/transcriber.ts +1 -2
- package/src/components/Transcript/Transcript.stories.tsx +43 -201
- package/src/components/Transcript/Transcript.tsx +208 -83
- package/src/components/TranscriptContainer.tsx +6 -11
- package/src/components/index.ts +0 -1
- package/src/components/transcription.stories.tsx +65 -164
- package/src/hooks/index.ts +0 -1
- package/src/hooks/useTranscriber.ts +2 -3
- package/src/transcriber/{transcriber.browser.test.ts → transcriber.test.ts} +3 -3
- package/src/transcriber/transcriber.ts +11 -20
- package/src/transcriber/transcription-manager.ts +58 -67
- package/src/translations.ts +0 -2
- package/src/types/schema.ts +32 -11
- package/src/types/types.ts +9 -19
- package/src/util/index.ts +1 -0
- package/src/util/random-queue-dxn.ts +9 -0
- package/dist/lib/browser/app-graph-builder-REQZ5SC5.mjs +0 -351
- package/dist/lib/browser/app-graph-builder-REQZ5SC5.mjs.map +0 -7
- package/dist/lib/browser/chunk-3TKXI6TQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-JHWEZRWC.mjs +0 -63
- package/dist/lib/browser/chunk-JHWEZRWC.mjs.map +0 -7
- package/dist/lib/browser/chunk-K2LS2QOM.mjs +0 -720
- package/dist/lib/browser/chunk-K2LS2QOM.mjs.map +0 -7
- package/dist/lib/browser/chunk-KLD7O5GJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-LCTMCTYY.mjs +0 -27
- package/dist/lib/browser/chunk-LCTMCTYY.mjs.map +0 -7
- package/dist/lib/browser/chunk-LTIQFX4W.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-DZ62CJPC.mjs.map +0 -7
- package/dist/lib/browser/meeting-transcription-state-MNA2XROE.mjs.map +0 -7
- package/dist/lib/browser/react-surface-PUXZNAZL.mjs.map +0 -7
- package/dist/lib/browser/settings-JWDS4J3F.mjs +0 -24
- package/dist/lib/browser/settings-JWDS4J3F.mjs.map +0 -7
- package/dist/lib/node/TranscriptContainer-SSJVLRM6.cjs.map +0 -7
- package/dist/lib/node/app-graph-builder-OAPU4GDH.cjs +0 -352
- package/dist/lib/node/app-graph-builder-OAPU4GDH.cjs.map +0 -7
- package/dist/lib/node/chunk-EJWB53WK.cjs.map +0 -7
- package/dist/lib/node/chunk-EVE3H46F.cjs +0 -737
- package/dist/lib/node/chunk-EVE3H46F.cjs.map +0 -7
- package/dist/lib/node/chunk-J72PUQ3C.cjs.map +0 -7
- package/dist/lib/node/chunk-JUGOXWES.cjs.map +0 -7
- package/dist/lib/node/chunk-L27AK6FQ.cjs.map +0 -7
- package/dist/lib/node/chunk-WKZLGVEJ.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-TRBKI24D.cjs.map +0 -7
- package/dist/lib/node/meeting-transcription-state-5XLTMWPA.cjs.map +0 -7
- package/dist/lib/node/react-surface-SZAMHCX7.cjs.map +0 -7
- package/dist/lib/node/settings-AWWMOSCV.cjs +0 -38
- package/dist/lib/node/settings-AWWMOSCV.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-UBP6EOBR.mjs +0 -352
- package/dist/lib/node-esm/app-graph-builder-UBP6EOBR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-4KC3E5T4.mjs +0 -721
- package/dist/lib/node-esm/chunk-4KC3E5T4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-5E2MR5XK.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MHQP2PAF.mjs +0 -28
- package/dist/lib/node-esm/chunk-MHQP2PAF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QMHMEKB3.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QYG2FOXA.mjs +0 -64
- package/dist/lib/node-esm/chunk-QYG2FOXA.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-V5IWBPYO.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-HFVAL274.mjs.map +0 -7
- package/dist/lib/node-esm/meeting-transcription-state-3WOZ52BQ.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-UEJELL7I.mjs.map +0 -7
- package/dist/lib/node-esm/settings-QFNFGFJ5.mjs +0 -25
- package/dist/lib/node-esm/settings-QFNFGFJ5.mjs.map +0 -7
- package/dist/types/src/capabilities/settings.d.ts +0 -4
- package/dist/types/src/capabilities/settings.d.ts.map +0 -1
- package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +0 -27
- package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +0 -1
- package/dist/types/src/components/Transcript/transcript-extension.d.ts +0 -19
- package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +0 -1
- package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts +0 -6
- package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts.map +0 -1
- package/dist/types/src/components/TranscriptionSettings/index.d.ts +0 -2
- package/dist/types/src/components/TranscriptionSettings/index.d.ts.map +0 -1
- package/dist/types/src/entity-extraction/entity-extraction.d.ts +0 -42
- package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +0 -1
- package/dist/types/src/entity-extraction/entity-extraction.test.d.ts +0 -2
- package/dist/types/src/entity-extraction/entity-extraction.test.d.ts.map +0 -1
- package/dist/types/src/entity-extraction/index.d.ts +0 -2
- package/dist/types/src/entity-extraction/index.d.ts.map +0 -1
- package/dist/types/src/hooks/useQueueModelAdapter.d.ts +0 -7
- package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +0 -1
- package/dist/types/src/model/index.d.ts +0 -2
- package/dist/types/src/model/index.d.ts.map +0 -1
- package/dist/types/src/model/model.d.ts +0 -68
- package/dist/types/src/model/model.d.ts.map +0 -1
- package/dist/types/src/model/model.test.d.ts +0 -2
- package/dist/types/src/model/model.test.d.ts.map +0 -1
- package/dist/types/src/testing/index.d.ts +0 -2
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/dist/types/src/testing/testing.d.ts +0 -40
- package/dist/types/src/testing/testing.d.ts.map +0 -1
- package/dist/types/src/transcriber/transcriber.browser.test.d.ts +0 -2
- package/dist/types/src/transcriber/transcriber.browser.test.d.ts.map +0 -1
- package/src/capabilities/settings.ts +0 -20
- package/src/components/Transcript/deprecated/OldTranscript.tsx +0 -260
- package/src/components/Transcript/transcript-extension.ts +0 -236
- package/src/components/TranscriptionSettings/TranscriptionSettings.tsx +0 -26
- package/src/components/TranscriptionSettings/index.ts +0 -5
- package/src/entity-extraction/entity-extraction.test.ts +0 -97
- package/src/entity-extraction/entity-extraction.ts +0 -149
- package/src/entity-extraction/index.ts +0 -5
- package/src/entity-extraction/system-prompt.tpl +0 -38
- package/src/entity-extraction/types.d.ts +0 -8
- package/src/hooks/useQueueModelAdapter.ts +0 -63
- package/src/model/index.ts +0 -5
- package/src/model/model.test.ts +0 -169
- package/src/model/model.ts +0 -229
- package/src/testing/index.ts +0 -5
- package/src/testing/testing.ts +0 -216
- /package/dist/lib/browser/{TranscriptContainer-CXA4ZBHW.mjs.map → TranscriptContainer-JQ3HFHLQ.mjs.map} +0 -0
- /package/dist/lib/node-esm/{TranscriptContainer-M53LI2TX.mjs.map → TranscriptContainer-ZXUCOWGY.mjs.map} +0 -0
|
@@ -16,148 +16,84 @@ import React, {
|
|
|
16
16
|
useState,
|
|
17
17
|
} from 'react';
|
|
18
18
|
|
|
19
|
-
import {
|
|
20
|
-
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
21
|
-
import { AIServiceEdgeClient } from '@dxos/assistant';
|
|
22
|
-
import { AI_SERVICE_ENDPOINT } from '@dxos/assistant/testing';
|
|
23
|
-
import { Filter, MemoryQueue } from '@dxos/echo-db';
|
|
24
|
-
import { create, createQueueDxn } from '@dxos/echo-schema';
|
|
19
|
+
import { createStatic } from '@dxos/echo-schema';
|
|
25
20
|
import { type DXN } from '@dxos/keys';
|
|
26
21
|
import { log } from '@dxos/log';
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
|
|
31
|
-
import { ThemePlugin } from '@dxos/plugin-theme';
|
|
32
|
-
import { useQueue, useSpace } from '@dxos/react-client/echo';
|
|
22
|
+
import { Config } from '@dxos/react-client';
|
|
23
|
+
import { useQueue } from '@dxos/react-client/echo';
|
|
24
|
+
import { withClientProvider } from '@dxos/react-client/testing';
|
|
33
25
|
import { IconButton, Toolbar } from '@dxos/react-ui';
|
|
34
26
|
import { ScrollContainer } from '@dxos/react-ui-components';
|
|
35
|
-
import { defaultTx } from '@dxos/react-ui-theme';
|
|
36
|
-
import { DataType } from '@dxos/schema';
|
|
37
|
-
import { seedTestData, Testing } from '@dxos/schema/testing';
|
|
38
27
|
import { withLayout, withTheme } from '@dxos/storybook-utils';
|
|
39
28
|
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import { processTranscriptMessage } from '../entity-extraction';
|
|
43
|
-
import { useAudioFile, useAudioTrack, useQueueModelAdapter, useTranscriber } from '../hooks';
|
|
44
|
-
import { type SerializationModel } from '../model';
|
|
45
|
-
import { TestItem } from '../testing';
|
|
29
|
+
import { Transcript } from './Transcript';
|
|
30
|
+
import { useAudioFile, useAudioTrack, useTranscriber } from '../hooks';
|
|
46
31
|
import { type TranscriberParams } from '../transcriber';
|
|
32
|
+
import { TranscriptBlock } from '../types';
|
|
33
|
+
import { randomQueueDxn } from '../util';
|
|
47
34
|
|
|
48
35
|
const TranscriptionStory: FC<{
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}> = ({
|
|
53
|
-
const space = useSpace();
|
|
54
|
-
|
|
36
|
+
playing: boolean;
|
|
37
|
+
setPlaying: Dispatch<SetStateAction<boolean>>;
|
|
38
|
+
blocks?: TranscriptBlock[];
|
|
39
|
+
}> = ({ playing, setPlaying, blocks }) => {
|
|
55
40
|
return (
|
|
56
41
|
<div className='flex flex-col w-[30rem]'>
|
|
57
42
|
<Toolbar.Root>
|
|
58
43
|
<IconButton
|
|
59
44
|
iconOnly
|
|
60
|
-
icon={
|
|
61
|
-
label={
|
|
62
|
-
onClick={() =>
|
|
45
|
+
icon={playing ? 'ph--pause--regular' : 'ph--play--regular'}
|
|
46
|
+
label={playing ? 'Pause' : 'Play'}
|
|
47
|
+
onClick={() => setPlaying((playing) => !playing)}
|
|
63
48
|
/>
|
|
64
49
|
</Toolbar.Root>
|
|
65
50
|
<ScrollContainer>
|
|
66
|
-
<Transcript
|
|
51
|
+
<Transcript blocks={blocks} attendableId='story' />
|
|
67
52
|
</ScrollContainer>
|
|
68
53
|
</div>
|
|
69
54
|
);
|
|
70
55
|
};
|
|
71
56
|
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
const Microphone = ({ entityExtraction }: { entityExtraction?: boolean }) => {
|
|
77
|
-
const [running, setRunning] = useState(false);
|
|
57
|
+
const Microphone = () => {
|
|
58
|
+
const [playing, setPlaying] = useState(false);
|
|
78
59
|
|
|
79
60
|
// Audio.
|
|
80
|
-
const track = useAudioTrack(
|
|
61
|
+
const track = useAudioTrack(playing);
|
|
81
62
|
|
|
82
63
|
// Queue.
|
|
83
|
-
const queueDxn = useMemo(() =>
|
|
84
|
-
const queue =
|
|
85
|
-
const model = useQueueModelAdapter(renderMarkdown([]), queue);
|
|
86
|
-
const space = useSpace();
|
|
64
|
+
const queueDxn = useMemo(() => randomQueueDxn(), []);
|
|
65
|
+
const queue = useQueue<TranscriptBlock>(queueDxn, { pollInterval: 500 });
|
|
87
66
|
|
|
88
67
|
// Transcriber.
|
|
89
68
|
const handleSegments = useCallback<TranscriberParams['onSegments']>(
|
|
90
|
-
async (
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
if (entityExtraction) {
|
|
94
|
-
if (!space) {
|
|
95
|
-
log.warn('no space');
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
// TODO(dmaretskyi): Move to vector search index.
|
|
99
|
-
const { objects } = await space.db
|
|
100
|
-
.query(
|
|
101
|
-
Filter.or(
|
|
102
|
-
Filter.type(DataType.Person),
|
|
103
|
-
Filter.type(DataType.Organization),
|
|
104
|
-
Filter.type(Testing.DocumentType),
|
|
105
|
-
),
|
|
106
|
-
)
|
|
107
|
-
.run();
|
|
108
|
-
|
|
109
|
-
log.info('context', { objects });
|
|
110
|
-
|
|
111
|
-
const result = await processTranscriptMessage({
|
|
112
|
-
message,
|
|
113
|
-
aiService,
|
|
114
|
-
context: {
|
|
115
|
-
objects,
|
|
116
|
-
},
|
|
117
|
-
options: {
|
|
118
|
-
fallbackToRaw: true,
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
void queue.append([result.message]);
|
|
122
|
-
} else {
|
|
123
|
-
void queue.append([message]);
|
|
124
|
-
}
|
|
69
|
+
async (segments) => {
|
|
70
|
+
const block = createStatic(TranscriptBlock, { segments });
|
|
71
|
+
queue?.append([block]);
|
|
125
72
|
},
|
|
126
|
-
[queue
|
|
73
|
+
[queue],
|
|
127
74
|
);
|
|
128
|
-
|
|
129
|
-
const config = useRef<TranscriberParams['config']>({
|
|
130
|
-
transcribeAfterChunksAmount: 20,
|
|
131
|
-
prefixBufferChunksAmount: 5,
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
const transcriber = useTranscriber({
|
|
135
|
-
audioStreamTrack: track,
|
|
136
|
-
onSegments: handleSegments,
|
|
137
|
-
config: config.current,
|
|
138
|
-
});
|
|
139
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
75
|
+
const transcriber = useTranscriber({ audioStreamTrack: track, onSegments: handleSegments });
|
|
140
76
|
useEffect(() => {
|
|
141
|
-
void transcriber?.open()
|
|
77
|
+
void transcriber?.open();
|
|
142
78
|
return () => {
|
|
143
|
-
void transcriber?.close()
|
|
79
|
+
void transcriber?.close();
|
|
144
80
|
};
|
|
145
81
|
}, [transcriber]);
|
|
146
82
|
|
|
147
83
|
// Manage transcription state.
|
|
148
84
|
useEffect(() => {
|
|
149
|
-
if (
|
|
150
|
-
transcriber?.startChunksRecording();
|
|
151
|
-
} else if (!
|
|
152
|
-
transcriber?.stopChunksRecording();
|
|
85
|
+
if (playing && transcriber?.isOpen) {
|
|
86
|
+
void transcriber?.startChunksRecording();
|
|
87
|
+
} else if (!playing) {
|
|
88
|
+
void transcriber?.stopChunksRecording();
|
|
153
89
|
}
|
|
154
|
-
}, [transcriber,
|
|
90
|
+
}, [transcriber, playing, transcriber?.isOpen]);
|
|
155
91
|
|
|
156
|
-
return <TranscriptionStory
|
|
92
|
+
return <TranscriptionStory playing={playing} setPlaying={setPlaying} blocks={queue?.items} />;
|
|
157
93
|
};
|
|
158
94
|
|
|
159
95
|
const AudioFile = ({ queueDxn, audioUrl }: { queueDxn: DXN; audioUrl: string; transcriptUrl: string }) => {
|
|
160
|
-
const [
|
|
96
|
+
const [playing, setPlaying] = useState(false);
|
|
161
97
|
|
|
162
98
|
// Audio.
|
|
163
99
|
const audioElement = useRef<HTMLAudioElement>(null);
|
|
@@ -174,20 +110,19 @@ const AudioFile = ({ queueDxn, audioUrl }: { queueDxn: DXN; audioUrl: string; tr
|
|
|
174
110
|
return;
|
|
175
111
|
}
|
|
176
112
|
|
|
177
|
-
if (
|
|
113
|
+
if (playing) {
|
|
178
114
|
void audio.play();
|
|
179
115
|
} else {
|
|
180
116
|
void audio.pause();
|
|
181
117
|
}
|
|
182
|
-
}, [audio,
|
|
118
|
+
}, [audio, playing]);
|
|
183
119
|
|
|
184
120
|
// Transcriber.
|
|
185
|
-
const queue = useQueue<
|
|
186
|
-
const model = useQueueModelAdapter(renderMarkdown([]), queue);
|
|
121
|
+
const queue = useQueue<TranscriptBlock>(queueDxn, { pollInterval: 500 });
|
|
187
122
|
const handleSegments = useCallback<TranscriberParams['onSegments']>(
|
|
188
|
-
async (
|
|
189
|
-
const
|
|
190
|
-
|
|
123
|
+
async (segments) => {
|
|
124
|
+
const block = createStatic(TranscriptBlock, { authorName: 'test', authorHue: 'cyan', segments });
|
|
125
|
+
queue?.append([block]);
|
|
191
126
|
},
|
|
192
127
|
[queue],
|
|
193
128
|
);
|
|
@@ -198,15 +133,15 @@ const AudioFile = ({ queueDxn, audioUrl }: { queueDxn: DXN; audioUrl: string; tr
|
|
|
198
133
|
});
|
|
199
134
|
|
|
200
135
|
useEffect(() => {
|
|
201
|
-
if (transcriber &&
|
|
202
|
-
void transcriber.open()
|
|
203
|
-
} else if (!
|
|
136
|
+
if (transcriber && playing) {
|
|
137
|
+
void transcriber.open();
|
|
138
|
+
} else if (!playing) {
|
|
204
139
|
transcriber?.stopChunksRecording();
|
|
205
140
|
void transcriber?.close();
|
|
206
141
|
}
|
|
207
|
-
}, [transcriber,
|
|
142
|
+
}, [transcriber, playing]);
|
|
208
143
|
|
|
209
|
-
|
|
144
|
+
useEffect(() => {
|
|
210
145
|
if (track?.readyState === 'live' && transcriber?.isOpen) {
|
|
211
146
|
log.info('starting transcription');
|
|
212
147
|
transcriber.startChunksRecording();
|
|
@@ -214,80 +149,46 @@ const AudioFile = ({ queueDxn, audioUrl }: { queueDxn: DXN; audioUrl: string; tr
|
|
|
214
149
|
log.info('stopping transcription');
|
|
215
150
|
transcriber.stopChunksRecording();
|
|
216
151
|
}
|
|
217
|
-
};
|
|
218
|
-
useEffect(() => {
|
|
219
|
-
manageChunkRecording();
|
|
220
152
|
}, [transcriber, track?.readyState, transcriber?.isOpen]);
|
|
221
153
|
|
|
222
|
-
return <TranscriptionStory
|
|
154
|
+
return <TranscriptionStory playing={playing} setPlaying={setPlaying} blocks={queue?.items} />;
|
|
223
155
|
};
|
|
224
156
|
|
|
225
157
|
const meta: Meta<typeof AudioFile> = {
|
|
226
158
|
title: 'plugins/plugin-transcription/transcription',
|
|
227
159
|
decorators: [
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
await client.halo.createIdentity();
|
|
236
|
-
await client.spaces.waitUntilReady();
|
|
237
|
-
await client.spaces.default.waitUntilReady();
|
|
238
|
-
await seedTestData(client.spaces.default);
|
|
160
|
+
withClientProvider({
|
|
161
|
+
config: new Config({
|
|
162
|
+
runtime: {
|
|
163
|
+
client: { edgeFeatures: { signaling: true } },
|
|
164
|
+
services: {
|
|
165
|
+
edge: { url: 'https://edge.dxos.workers.dev/' },
|
|
166
|
+
iceProviders: [{ urls: 'https://edge.dxos.workers.dev/ice' }],
|
|
239
167
|
},
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
SettingsPlugin(),
|
|
243
|
-
PreviewPlugin(),
|
|
244
|
-
IntentPlugin(),
|
|
245
|
-
TranscriptionPlugin(),
|
|
246
|
-
],
|
|
247
|
-
fireEvents: [Events.SetupAppGraph],
|
|
248
|
-
// capabilities: [
|
|
249
|
-
// contributes(
|
|
250
|
-
// Capabilities.ReactSurface,
|
|
251
|
-
// createSurface({
|
|
252
|
-
// id: 'preview-test',
|
|
253
|
-
// role: 'preview',
|
|
254
|
-
// component: ({ data }) => {
|
|
255
|
-
// const schema = getSchema(data);
|
|
256
|
-
// if (!schema) {
|
|
257
|
-
// return null;
|
|
258
|
-
// }
|
|
259
|
-
|
|
260
|
-
// return <Form schema={schema} values={data} />;
|
|
261
|
-
// },
|
|
262
|
-
// }),
|
|
263
|
-
// ),
|
|
264
|
-
// ],
|
|
168
|
+
},
|
|
169
|
+
}),
|
|
265
170
|
}),
|
|
266
171
|
withTheme,
|
|
267
|
-
withLayout({
|
|
172
|
+
withLayout({
|
|
173
|
+
tooltips: true,
|
|
174
|
+
fullscreen: true,
|
|
175
|
+
classNames: 'justify-center',
|
|
176
|
+
}),
|
|
268
177
|
],
|
|
269
178
|
};
|
|
270
179
|
|
|
271
180
|
export default meta;
|
|
272
181
|
|
|
273
|
-
|
|
274
|
-
render: Microphone,
|
|
275
|
-
args: {
|
|
276
|
-
entityExtraction: false,
|
|
277
|
-
},
|
|
278
|
-
};
|
|
182
|
+
type Story = StoryObj<typeof AudioFile>;
|
|
279
183
|
|
|
280
|
-
export const
|
|
184
|
+
export const Default: Story = {
|
|
281
185
|
render: Microphone,
|
|
282
|
-
args: {
|
|
283
|
-
entityExtraction: true,
|
|
284
|
-
},
|
|
285
186
|
};
|
|
286
187
|
|
|
287
|
-
export const File:
|
|
188
|
+
export const File: Story = {
|
|
288
189
|
render: AudioFile,
|
|
289
190
|
args: {
|
|
290
|
-
queueDxn:
|
|
191
|
+
queueDxn: randomQueueDxn(),
|
|
291
192
|
// https://learnenglish.britishcouncil.org/general-english/audio-zone/living-london
|
|
292
193
|
transcriptUrl: 'https://dxos.network/audio-london.txt',
|
|
293
194
|
audioUrl: 'https://dxos.network/audio-london.m4a',
|
package/src/hooks/index.ts
CHANGED
|
@@ -15,7 +15,6 @@ import { type Transcriber } from '../transcriber';
|
|
|
15
15
|
export const useTranscriber = ({
|
|
16
16
|
audioStreamTrack,
|
|
17
17
|
onSegments,
|
|
18
|
-
config,
|
|
19
18
|
}: Partial<TranscriptionCapabilities.GetTranscriberProps>) => {
|
|
20
19
|
const [getTranscriber] = useCapabilities(TranscriptionCapabilities.Transcriber);
|
|
21
20
|
|
|
@@ -25,8 +24,8 @@ export const useTranscriber = ({
|
|
|
25
24
|
return undefined;
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
return getTranscriber({ audioStreamTrack, onSegments
|
|
29
|
-
}, [audioStreamTrack, onSegments, getTranscriber
|
|
27
|
+
return getTranscriber({ audioStreamTrack, onSegments });
|
|
28
|
+
}, [audioStreamTrack, onSegments, getTranscriber]);
|
|
30
29
|
|
|
31
30
|
useEffect(() => {
|
|
32
31
|
return () => {
|
|
@@ -9,11 +9,11 @@ import { WaveFile } from 'wavefile';
|
|
|
9
9
|
|
|
10
10
|
import { Trigger } from '@dxos/async';
|
|
11
11
|
import { log } from '@dxos/log';
|
|
12
|
-
import { type DataType } from '@dxos/schema';
|
|
13
12
|
import { openAndClose } from '@dxos/test-utils';
|
|
14
13
|
import { trace, TRACE_PROCESSOR } from '@dxos/tracing';
|
|
15
14
|
|
|
16
15
|
import { type AudioChunk, type AudioRecorder, Transcriber } from '../transcriber';
|
|
16
|
+
import { type TranscriptSegment } from '../types';
|
|
17
17
|
import { mergeFloat64Arrays } from '../util';
|
|
18
18
|
|
|
19
19
|
// TODO(burdon): ReferenceError: Worker is not defined (Can only run with web workers).
|
|
@@ -93,7 +93,7 @@ describe.skip('Transcriber', () => {
|
|
|
93
93
|
});
|
|
94
94
|
|
|
95
95
|
test.skip('transcription of audio recording', { timeout: 10_000 }, async () => {
|
|
96
|
-
const trigger = new Trigger<
|
|
96
|
+
const trigger = new Trigger<TranscriptSegment[]>({ autoReset: true });
|
|
97
97
|
const recorder = new MockAudioRecorder({
|
|
98
98
|
buffer: await readFile('test.wav'),
|
|
99
99
|
chunkDuration: 3_000,
|
|
@@ -127,7 +127,7 @@ describe.skip('Transcriber', () => {
|
|
|
127
127
|
});
|
|
128
128
|
|
|
129
129
|
test.skip('transcription of audio recording with overlapping chunks', { timeout: 20_000 }, async () => {
|
|
130
|
-
const trigger = new Trigger<
|
|
130
|
+
const trigger = new Trigger<TranscriptSegment[]>({ autoReset: true });
|
|
131
131
|
const recorder = new MockAudioRecorder({
|
|
132
132
|
buffer: await readFile('test.wav'),
|
|
133
133
|
chunkDuration: 3_000,
|
|
@@ -7,11 +7,10 @@ import { WaveFile } from 'wavefile';
|
|
|
7
7
|
import { DeferredTask, Trigger } from '@dxos/async';
|
|
8
8
|
import { type Context, LifecycleState, Resource } from '@dxos/context';
|
|
9
9
|
import { log } from '@dxos/log';
|
|
10
|
-
import { type DataType } from '@dxos/schema';
|
|
11
10
|
import { trace } from '@dxos/tracing';
|
|
12
11
|
|
|
13
12
|
import { type AudioRecorder, type AudioChunk } from './audio-recorder';
|
|
14
|
-
import { TRANSCRIPTION_URL } from '../types';
|
|
13
|
+
import { TRANSCRIPTION_URL, type TranscriptSegment } from '../types';
|
|
15
14
|
import { mergeFloat64Arrays } from '../util';
|
|
16
15
|
|
|
17
16
|
type WhisperWord = {
|
|
@@ -65,7 +64,7 @@ export type TranscribeConfig = {
|
|
|
65
64
|
export type TranscriberParams = {
|
|
66
65
|
config: TranscribeConfig;
|
|
67
66
|
recorder: AudioRecorder;
|
|
68
|
-
onSegments: (segments:
|
|
67
|
+
onSegments: (segments: TranscriptSegment[]) => Promise<void>;
|
|
69
68
|
};
|
|
70
69
|
|
|
71
70
|
/**
|
|
@@ -94,7 +93,6 @@ export class Transcriber extends Resource {
|
|
|
94
93
|
}
|
|
95
94
|
|
|
96
95
|
protected override async _open(ctx: Context) {
|
|
97
|
-
log.info('opening');
|
|
98
96
|
this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));
|
|
99
97
|
await this._recorder.start();
|
|
100
98
|
this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());
|
|
@@ -102,18 +100,15 @@ export class Transcriber extends Resource {
|
|
|
102
100
|
}
|
|
103
101
|
|
|
104
102
|
protected override async _close() {
|
|
105
|
-
log.info('closing');
|
|
106
103
|
this._recording = false;
|
|
107
104
|
this._transcribeTask = undefined;
|
|
108
105
|
await this._recorder.stop();
|
|
109
106
|
}
|
|
110
107
|
|
|
111
108
|
startChunksRecording() {
|
|
112
|
-
log.info('starting');
|
|
113
109
|
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
114
110
|
return;
|
|
115
111
|
}
|
|
116
|
-
|
|
117
112
|
this._recording = true;
|
|
118
113
|
}
|
|
119
114
|
|
|
@@ -121,10 +116,8 @@ export class Transcriber extends Resource {
|
|
|
121
116
|
if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {
|
|
122
117
|
return;
|
|
123
118
|
}
|
|
124
|
-
|
|
125
119
|
this._recording = false;
|
|
126
120
|
this._transcribeTask?.schedule();
|
|
127
|
-
log.info('stopped');
|
|
128
121
|
}
|
|
129
122
|
|
|
130
123
|
private _saveAudioChunk(chunk: AudioChunk) {
|
|
@@ -201,25 +194,24 @@ export class Transcriber extends Resource {
|
|
|
201
194
|
|
|
202
195
|
if (!response.ok) {
|
|
203
196
|
this._audioChunks = [];
|
|
204
|
-
throw new Error(
|
|
197
|
+
throw new Error('Failed to transcribe');
|
|
205
198
|
}
|
|
206
199
|
|
|
207
|
-
const {
|
|
200
|
+
const {
|
|
201
|
+
segments,
|
|
202
|
+
}: {
|
|
208
203
|
segments: WhisperSegment[];
|
|
209
|
-
};
|
|
204
|
+
} = await response.json();
|
|
210
205
|
|
|
211
206
|
log.info('transcription response', {
|
|
212
|
-
segments
|
|
207
|
+
segments,
|
|
213
208
|
string: segments.map((segments) => segments.text).join(' '),
|
|
214
209
|
});
|
|
215
210
|
|
|
216
211
|
return segments;
|
|
217
212
|
}
|
|
218
213
|
|
|
219
|
-
private _alignSegments(
|
|
220
|
-
segments: WhisperSegment[],
|
|
221
|
-
originalChunks: AudioChunk[],
|
|
222
|
-
): DataType.MessageBlock.Transcription[] {
|
|
214
|
+
private _alignSegments(segments: WhisperSegment[], originalChunks: AudioChunk[]): TranscriptSegment[] {
|
|
223
215
|
// Absolute zero for all relative timestamps in the segments.
|
|
224
216
|
const zeroTimestamp = originalChunks.at(0)!.timestamp;
|
|
225
217
|
|
|
@@ -248,9 +240,8 @@ export class Transcriber extends Resource {
|
|
|
248
240
|
|
|
249
241
|
// Add absolute timestamp to each segment.
|
|
250
242
|
return filteredSegments.map((segment) => ({
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
text: segment.text.trim(),
|
|
243
|
+
started: new Date(zeroTimestamp + segment.start * 1_000),
|
|
244
|
+
text: segment.text,
|
|
254
245
|
}));
|
|
255
246
|
}
|
|
256
247
|
}
|