@dxos/plugin-transcription 0.8.2-main.fbd8ed0 → 0.8.2-staging.4d6ad0f
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-PFKLKRPQ.mjs +11 -0
- package/dist/lib/browser/{chunk-3TKXI6TQ.mjs → chunk-4KCUYW2F.mjs} +43 -26
- package/dist/lib/browser/chunk-4KCUYW2F.mjs.map +7 -0
- package/dist/lib/browser/{chunk-6ZR5MDK3.mjs → chunk-GOF7MJNV.mjs} +3 -3
- package/dist/lib/browser/{chunk-6ZR5MDK3.mjs.map → chunk-GOF7MJNV.mjs.map} +1 -1
- package/dist/lib/browser/chunk-IGEKO7ZU.mjs +8 -0
- package/dist/lib/browser/chunk-IGEKO7ZU.mjs.map +7 -0
- package/dist/lib/browser/{chunk-JHWEZRWC.mjs → chunk-NODIXNQP.mjs} +6 -15
- package/dist/lib/browser/chunk-NODIXNQP.mjs.map +7 -0
- package/dist/lib/browser/{chunk-K2LS2QOM.mjs → chunk-TJPJBE45.mjs} +136 -92
- package/dist/lib/browser/chunk-TJPJBE45.mjs.map +7 -0
- package/dist/lib/browser/{chunk-LTIQFX4W.mjs → chunk-W2KNYJD6.mjs} +4 -4
- package/dist/lib/browser/chunk-W2KNYJD6.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +8 -31
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-DZ62CJPC.mjs → intent-resolver-I2LJSQDR.mjs} +4 -8
- package/dist/lib/browser/intent-resolver-I2LJSQDR.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-surface-ID2MLJHZ.mjs +34 -0
- package/dist/lib/browser/react-surface-ID2MLJHZ.mjs.map +7 -0
- package/dist/lib/browser/transcriber-NA7CIFIT.mjs +56 -0
- package/dist/lib/browser/transcriber-NA7CIFIT.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +4 -8
- package/dist/lib/node/{TranscriptContainer-SSJVLRM6.cjs → TranscriptContainer-LHMC7553.cjs} +9 -9
- package/dist/lib/node/{TranscriptContainer-SSJVLRM6.cjs.map → TranscriptContainer-LHMC7553.cjs.map} +2 -2
- package/dist/lib/node/{chunk-EVE3H46F.cjs → chunk-3GS5UNO5.cjs} +141 -100
- package/dist/lib/node/chunk-3GS5UNO5.cjs.map +7 -0
- package/dist/lib/node/{chunk-L27AK6FQ.cjs → chunk-5J3FBCON.cjs} +8 -23
- package/dist/lib/node/chunk-5J3FBCON.cjs.map +7 -0
- package/dist/lib/node/{chunk-NVZWGFJL.cjs → chunk-AFUZI63A.cjs} +6 -6
- package/dist/lib/node/{chunk-NVZWGFJL.cjs.map → chunk-AFUZI63A.cjs.map} +1 -1
- package/dist/lib/node/{chunk-EJWB53WK.cjs → chunk-EIMUQYCZ.cjs} +10 -21
- package/dist/lib/node/chunk-EIMUQYCZ.cjs.map +7 -0
- package/dist/lib/node/{chunk-JUGOXWES.cjs → chunk-FKDJNJ57.cjs} +8 -8
- package/dist/lib/node/chunk-FKDJNJ57.cjs.map +7 -0
- package/dist/lib/node/{chunk-WKZLGVEJ.cjs → chunk-ZFTXJZXH.cjs} +44 -29
- package/dist/lib/node/chunk-ZFTXJZXH.cjs.map +7 -0
- package/dist/lib/node/index.cjs +36 -56
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-TRBKI24D.cjs → intent-resolver-LLMGF5I5.cjs} +9 -11
- package/dist/lib/node/intent-resolver-LLMGF5I5.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-SZAMHCX7.cjs → react-surface-SEQLEL4K.cjs} +13 -21
- package/dist/lib/node/react-surface-SEQLEL4K.cjs.map +7 -0
- package/dist/lib/node/transcriber-RKKN7LDU.cjs +68 -0
- package/dist/lib/node/transcriber-RKKN7LDU.cjs.map +7 -0
- package/dist/lib/node/types/index.cjs +7 -11
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/{TranscriptContainer-M53LI2TX.mjs → TranscriptContainer-DLNRFVTA.mjs} +4 -4
- package/dist/lib/node-esm/{chunk-QYG2FOXA.mjs → chunk-BRPFVRAD.mjs} +6 -15
- package/dist/lib/node-esm/chunk-BRPFVRAD.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-V5IWBPYO.mjs → chunk-EFIWBQDF.mjs} +43 -26
- package/dist/lib/node-esm/chunk-EFIWBQDF.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-KUWWHMOA.mjs +10 -0
- package/dist/lib/node-esm/chunk-KUWWHMOA.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-5E2MR5XK.mjs → chunk-MFJPEIVB.mjs} +4 -4
- package/dist/lib/node-esm/chunk-MFJPEIVB.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-4KC3E5T4.mjs → chunk-PR7EYODX.mjs} +136 -92
- package/dist/lib/node-esm/chunk-PR7EYODX.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-X4DDJIVL.mjs → chunk-TXMDLLBR.mjs} +3 -3
- package/dist/lib/node-esm/{chunk-X4DDJIVL.mjs.map → chunk-TXMDLLBR.mjs.map} +1 -1
- package/dist/lib/node-esm/index.mjs +8 -31
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-HFVAL274.mjs → intent-resolver-WOZKOEBW.mjs} +4 -8
- package/dist/lib/node-esm/intent-resolver-WOZKOEBW.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-UEJELL7I.mjs → react-surface-7MXUUTAL.mjs} +9 -19
- package/dist/lib/node-esm/react-surface-7MXUUTAL.mjs.map +7 -0
- package/dist/lib/node-esm/transcriber-5WSI6DYK.mjs +57 -0
- package/dist/lib/node-esm/transcriber-5WSI6DYK.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +4 -8
- package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +8 -8
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +1 -4
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/transcriber.d.ts +2 -1
- package/dist/types/src/capabilities/transcriber.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/stories/FileTranscription.stories.d.ts +17 -0
- package/dist/types/src/components/stories/FileTranscription.stories.d.ts.map +1 -0
- package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts +10 -0
- package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts.map +1 -0
- package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts +19 -0
- package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts.map +1 -0
- package/dist/types/src/components/stories/TranscriptionStory.d.ts +11 -0
- package/dist/types/src/components/stories/TranscriptionStory.d.ts.map +1 -0
- package/dist/types/src/components/stories/useIsSpeaking.d.ts +3 -0
- package/dist/types/src/components/stories/useIsSpeaking.d.ts.map +1 -0
- package/dist/types/src/hooks/useAudioFile.d.ts +1 -1
- package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
- package/dist/types/src/hooks/useAudioTrack.d.ts +1 -1
- package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -1
- package/dist/types/src/hooks/useQueueModelAdapter.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/model/model.d.ts.map +1 -1
- package/dist/types/src/segments-normalization/index.d.ts +4 -0
- package/dist/types/src/segments-normalization/index.d.ts.map +1 -0
- package/dist/types/src/segments-normalization/message-normalizer.d.ts +26 -0
- package/dist/types/src/segments-normalization/message-normalizer.d.ts.map +1 -0
- package/dist/types/src/segments-normalization/normalization.d.ts +520 -0
- package/dist/types/src/segments-normalization/normalization.d.ts.map +1 -0
- package/dist/types/src/segments-normalization/normalization.test.d.ts +2 -0
- package/dist/types/src/segments-normalization/normalization.test.d.ts.map +1 -0
- package/dist/types/src/segments-normalization/utils.d.ts +3 -0
- package/dist/types/src/segments-normalization/utils.d.ts.map +1 -0
- package/dist/types/src/testing/testing.d.ts.map +1 -1
- package/dist/types/src/transcriber/media-stream-recorder.d.ts +8 -5
- package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
- package/dist/types/src/transcriber/transcriber.d.ts +4 -0
- package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
- package/dist/types/src/transcriber/transcription-manager.d.ts +2 -0
- package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +0 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +0 -3
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +1 -5
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +54 -50
- package/src/TranscriptionPlugin.tsx +2 -24
- package/src/capabilities/capabilities.ts +15 -9
- package/src/capabilities/index.ts +0 -3
- package/src/capabilities/intent-resolver.ts +0 -2
- package/src/capabilities/react-surface.tsx +4 -11
- package/src/capabilities/transcriber.ts +34 -7
- package/src/components/Transcript/deprecated/OldTranscript.tsx +1 -1
- package/src/components/Transcript/transcript-extension.ts +2 -2
- package/src/components/index.ts +0 -1
- package/src/components/stories/FileTranscription.stories.tsx +240 -0
- package/src/components/stories/KeyWordRecognition.stories.tsx +128 -0
- package/src/components/stories/MicrophoneTranscription.stories.tsx +274 -0
- package/src/components/stories/TranscriptionStory.tsx +41 -0
- package/src/components/stories/useIsSpeaking.tsx +40 -0
- package/src/hooks/useAudioFile.ts +39 -9
- package/src/hooks/useAudioTrack.ts +2 -2
- package/src/hooks/useQueueModelAdapter.ts +7 -5
- package/src/hooks/useTranscriber.ts +4 -3
- package/src/meta.ts +2 -2
- package/src/model/model.ts +1 -1
- package/src/segments-normalization/index.ts +7 -0
- package/src/segments-normalization/message-normalizer.ts +108 -0
- package/src/segments-normalization/normalization.test.ts +142 -0
- package/src/segments-normalization/normalization.ts +103 -0
- package/src/segments-normalization/utils.ts +9 -0
- package/src/testing/testing.ts +17 -17
- package/src/transcriber/media-stream-recorder.ts +14 -7
- package/src/transcriber/transcriber.browser.test.ts +4 -4
- package/src/transcriber/transcriber.ts +13 -9
- package/src/transcriber/transcription-manager.ts +21 -14
- package/src/translations.ts +0 -3
- package/src/types/schema.ts +1 -2
- package/src/types/types.ts +1 -15
- package/dist/lib/browser/TranscriptContainer-CXA4ZBHW.mjs +0 -11
- 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.map +0 -7
- package/dist/lib/browser/chunk-K2LS2QOM.mjs.map +0 -7
- package/dist/lib/browser/chunk-KLD7O5GJ.mjs +0 -25
- 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 +0 -18
- package/dist/lib/browser/meeting-transcription-state-MNA2XROE.mjs.map +0 -7
- package/dist/lib/browser/react-surface-PUXZNAZL.mjs +0 -44
- 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/browser/transcriber-YWWIV6KP.mjs +0 -37
- package/dist/lib/browser/transcriber-YWWIV6KP.mjs.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.map +0 -7
- package/dist/lib/node/chunk-J72PUQ3C.cjs +0 -46
- 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 +0 -34
- 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/transcriber-AFUXFHCR.cjs +0 -50
- package/dist/lib/node/transcriber-AFUXFHCR.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.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 +0 -27
- package/dist/lib/node-esm/chunk-QMHMEKB3.mjs.map +0 -7
- 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 +0 -19
- 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/lib/node-esm/transcriber-7RJEFPDI.mjs +0 -38
- package/dist/lib/node-esm/transcriber-7RJEFPDI.mjs.map +0 -7
- package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/capabilities/meeting-transcription-state.d.ts +0 -4
- package/dist/types/src/capabilities/meeting-transcription-state.d.ts.map +0 -1
- 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/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/components/transcription.stories.d.ts +0 -18
- package/dist/types/src/components/transcription.stories.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/src/capabilities/app-graph-builder.ts +0 -233
- package/src/capabilities/meeting-transcription-state.ts +0 -16
- package/src/capabilities/settings.ts +0 -20
- package/src/components/TranscriptionSettings/TranscriptionSettings.tsx +0 -26
- package/src/components/TranscriptionSettings/index.ts +0 -5
- package/src/components/transcription.stories.tsx +0 -295
- 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/dist/lib/browser/{TranscriptContainer-CXA4ZBHW.mjs.map → TranscriptContainer-PFKLKRPQ.mjs.map} +0 -0
- /package/dist/lib/node-esm/{TranscriptContainer-M53LI2TX.mjs.map → TranscriptContainer-DLNRFVTA.mjs.map} +0 -0
|
@@ -19,6 +19,13 @@ const initializeExtendableMediaRecorder = async () => {
|
|
|
19
19
|
await register(await connect());
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
+
export type MediaStreamRecorderParams = {
|
|
23
|
+
mediaStreamTrack: MediaStreamTrack;
|
|
24
|
+
config: {
|
|
25
|
+
interval: number;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
|
|
22
29
|
/**
|
|
23
30
|
* Recorder that uses the MediaContext API and AudioNode API to record audio.
|
|
24
31
|
*
|
|
@@ -30,14 +37,14 @@ export class MediaStreamRecorder implements AudioRecorder {
|
|
|
30
37
|
/**
|
|
31
38
|
* Default MediaRecorder implementation do not support wav encoding.
|
|
32
39
|
*/
|
|
33
|
-
private readonly
|
|
40
|
+
private readonly _config: MediaStreamRecorderParams['config'];
|
|
34
41
|
private _mediaRecorder?: IMediaRecorder = undefined;
|
|
35
42
|
private _header?: Uint8Array = undefined;
|
|
36
43
|
private _onChunk?: (chunk: AudioChunk) => void;
|
|
37
44
|
|
|
38
|
-
constructor({ mediaStreamTrack,
|
|
45
|
+
constructor({ mediaStreamTrack, config }: MediaStreamRecorderParams) {
|
|
39
46
|
this._mediaStreamTrack = mediaStreamTrack;
|
|
40
|
-
this.
|
|
47
|
+
this._config = config;
|
|
41
48
|
}
|
|
42
49
|
|
|
43
50
|
get wavConfig(): WavConfig {
|
|
@@ -57,7 +64,7 @@ export class MediaStreamRecorder implements AudioRecorder {
|
|
|
57
64
|
this._onChunk = onChunk;
|
|
58
65
|
}
|
|
59
66
|
|
|
60
|
-
async start() {
|
|
67
|
+
async start(): Promise<void> {
|
|
61
68
|
await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) =>
|
|
62
69
|
log.info('initializeExtendableMediaRecorder', { err }),
|
|
63
70
|
);
|
|
@@ -72,10 +79,10 @@ export class MediaStreamRecorder implements AudioRecorder {
|
|
|
72
79
|
}
|
|
73
80
|
invariant(this._onChunk, 'MediaStreamRecorder: onChunk is not set');
|
|
74
81
|
this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);
|
|
75
|
-
this._mediaRecorder.start(this.
|
|
82
|
+
this._mediaRecorder.start(this._config.interval);
|
|
76
83
|
}
|
|
77
84
|
|
|
78
|
-
async stop() {
|
|
85
|
+
async stop(): Promise<void> {
|
|
79
86
|
if (this._mediaRecorder?.state !== 'recording') {
|
|
80
87
|
return;
|
|
81
88
|
}
|
|
@@ -83,7 +90,7 @@ export class MediaStreamRecorder implements AudioRecorder {
|
|
|
83
90
|
}
|
|
84
91
|
|
|
85
92
|
@synchronized
|
|
86
|
-
private async _ondataavailable(event: IBlobEvent) {
|
|
93
|
+
private async _ondataavailable(event: IBlobEvent): Promise<void> {
|
|
87
94
|
const blob = event.data;
|
|
88
95
|
const uint8Array = new Uint8Array(await blob.arrayBuffer());
|
|
89
96
|
|
|
@@ -194,14 +194,14 @@ class MockAudioRecorder implements AudioRecorder {
|
|
|
194
194
|
};
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
-
setOnChunk(onChunk: (chunk: AudioChunk) => void) {
|
|
197
|
+
setOnChunk(onChunk: (chunk: AudioChunk) => void): void {
|
|
198
198
|
this._onChunk = onChunk;
|
|
199
199
|
}
|
|
200
200
|
|
|
201
201
|
/**
|
|
202
202
|
* Emit a chunk in controlled manner for testing purposes.
|
|
203
203
|
*/
|
|
204
|
-
emitChunk() {
|
|
204
|
+
emitChunk(): void {
|
|
205
205
|
const chunk = this.chunks.shift();
|
|
206
206
|
if (!chunk) {
|
|
207
207
|
return;
|
|
@@ -211,7 +211,7 @@ class MockAudioRecorder implements AudioRecorder {
|
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
@trace.span()
|
|
214
|
-
async start() {
|
|
214
|
+
async start(): Promise<void> {
|
|
215
215
|
log.info('start mock audio recorder', { wavParams: this.wav.fmt });
|
|
216
216
|
const now = Date.now();
|
|
217
217
|
const samples = this.wav.getSamples();
|
|
@@ -226,5 +226,5 @@ class MockAudioRecorder implements AudioRecorder {
|
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
async stop() {}
|
|
229
|
+
async stop(): Promise<void> {}
|
|
230
230
|
}
|
|
@@ -65,6 +65,10 @@ export type TranscribeConfig = {
|
|
|
65
65
|
export type TranscriberParams = {
|
|
66
66
|
config: TranscribeConfig;
|
|
67
67
|
recorder: AudioRecorder;
|
|
68
|
+
/**
|
|
69
|
+
* Callback to handle the transcribed segments, after all segment transformers are applied.
|
|
70
|
+
* @param segments - The transcribed segments.
|
|
71
|
+
*/
|
|
68
72
|
onSegments: (segments: DataType.MessageBlock.Transcription[]) => Promise<void>;
|
|
69
73
|
};
|
|
70
74
|
|
|
@@ -93,7 +97,7 @@ export class Transcriber extends Resource {
|
|
|
93
97
|
this._onSegments = onSegments;
|
|
94
98
|
}
|
|
95
99
|
|
|
96
|
-
protected override async _open(ctx: Context) {
|
|
100
|
+
protected override async _open(ctx: Context): Promise<void> {
|
|
97
101
|
log.info('opening');
|
|
98
102
|
this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));
|
|
99
103
|
await this._recorder.start();
|
|
@@ -101,14 +105,14 @@ export class Transcriber extends Resource {
|
|
|
101
105
|
this._openTrigger.wake();
|
|
102
106
|
}
|
|
103
107
|
|
|
104
|
-
protected override async _close() {
|
|
108
|
+
protected override async _close(): Promise<void> {
|
|
105
109
|
log.info('closing');
|
|
106
110
|
this._recording = false;
|
|
107
111
|
this._transcribeTask = undefined;
|
|
108
112
|
await this._recorder.stop();
|
|
109
113
|
}
|
|
110
114
|
|
|
111
|
-
startChunksRecording() {
|
|
115
|
+
startChunksRecording(): void {
|
|
112
116
|
log.info('starting');
|
|
113
117
|
if (this._lifecycleState !== LifecycleState.OPEN) {
|
|
114
118
|
return;
|
|
@@ -117,7 +121,7 @@ export class Transcriber extends Resource {
|
|
|
117
121
|
this._recording = true;
|
|
118
122
|
}
|
|
119
123
|
|
|
120
|
-
stopChunksRecording() {
|
|
124
|
+
stopChunksRecording(): void {
|
|
121
125
|
if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {
|
|
122
126
|
return;
|
|
123
127
|
}
|
|
@@ -127,7 +131,7 @@ export class Transcriber extends Resource {
|
|
|
127
131
|
log.info('stopped');
|
|
128
132
|
}
|
|
129
133
|
|
|
130
|
-
private _saveAudioChunk(chunk: AudioChunk) {
|
|
134
|
+
private _saveAudioChunk(chunk: AudioChunk): void {
|
|
131
135
|
log('saving audio chunk', { chunk });
|
|
132
136
|
this._audioChunks.push(chunk);
|
|
133
137
|
|
|
@@ -143,7 +147,7 @@ export class Transcriber extends Resource {
|
|
|
143
147
|
}
|
|
144
148
|
}
|
|
145
149
|
|
|
146
|
-
private async _transcribe() {
|
|
150
|
+
private async _transcribe(): Promise<void> {
|
|
147
151
|
log('transcribing', { chunks: this._audioChunks.length });
|
|
148
152
|
const chunks = this._audioChunks;
|
|
149
153
|
this._audioChunks = this._dropOldChunks();
|
|
@@ -163,14 +167,14 @@ export class Transcriber extends Resource {
|
|
|
163
167
|
}
|
|
164
168
|
}
|
|
165
169
|
|
|
166
|
-
private _dropOldChunks() {
|
|
170
|
+
private _dropOldChunks(): AudioChunk[] {
|
|
167
171
|
return this._config.prefixBufferChunksAmount > 0
|
|
168
172
|
? this._audioChunks.slice(-this._config.prefixBufferChunksAmount)
|
|
169
173
|
: [];
|
|
170
174
|
}
|
|
171
175
|
|
|
172
176
|
@trace.span({ showInBrowserTimeline: true })
|
|
173
|
-
private async _mergeAudioChunks(chunks: AudioChunk[]) {
|
|
177
|
+
private async _mergeAudioChunks(chunks: AudioChunk[]): Promise<string> {
|
|
174
178
|
const file = new WaveFile();
|
|
175
179
|
const wavConfig = this._recorder.wavConfig;
|
|
176
180
|
|
|
@@ -185,7 +189,7 @@ export class Transcriber extends Resource {
|
|
|
185
189
|
}
|
|
186
190
|
|
|
187
191
|
@trace.span({ showInBrowserTimeline: true })
|
|
188
|
-
private async _fetchTranscription(audio: string) {
|
|
192
|
+
private async _fetchTranscription(audio: string): Promise<WhisperSegment[]> {
|
|
189
193
|
if (audio.length === 0) {
|
|
190
194
|
this._audioChunks = [];
|
|
191
195
|
throw new Error('No audio to send for transcribing');
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { signal } from '@preact/signals-core';
|
|
6
|
+
|
|
5
7
|
import { synchronized } from '@dxos/async';
|
|
6
8
|
import { Resource } from '@dxos/context';
|
|
7
9
|
import { QueueImpl, type Queue } from '@dxos/echo-db';
|
|
@@ -52,7 +54,7 @@ export class TranscriptionManager extends Resource {
|
|
|
52
54
|
private _mediaRecorder?: MediaStreamRecorder = undefined;
|
|
53
55
|
private _transcriber?: Transcriber = undefined;
|
|
54
56
|
private _queue?: Queue<DataType.Message> = undefined;
|
|
55
|
-
private _enabled = false;
|
|
57
|
+
private _enabled = signal(false);
|
|
56
58
|
|
|
57
59
|
constructor(options: TranscriptionManagerOptions) {
|
|
58
60
|
super();
|
|
@@ -60,14 +62,19 @@ export class TranscriptionManager extends Resource {
|
|
|
60
62
|
this._messageEnricher = options.messageEnricher;
|
|
61
63
|
}
|
|
62
64
|
|
|
63
|
-
protected override async _open() {
|
|
65
|
+
protected override async _open(): Promise<void> {
|
|
64
66
|
await this._toggleTranscriber();
|
|
65
67
|
}
|
|
66
68
|
|
|
67
|
-
protected override async _close() {
|
|
69
|
+
protected override async _close(): Promise<void> {
|
|
68
70
|
void this._transcriber?.close();
|
|
69
71
|
}
|
|
70
72
|
|
|
73
|
+
/** @reactive */
|
|
74
|
+
get enabled() {
|
|
75
|
+
return this._enabled.value;
|
|
76
|
+
}
|
|
77
|
+
|
|
71
78
|
setQueue(queueDxn: DXN): TranscriptionManager {
|
|
72
79
|
if (this._queue?.dxn.toString() !== queueDxn.toString()) {
|
|
73
80
|
log.info('setQueue', { queueDxn: queueDxn.toString() });
|
|
@@ -84,7 +91,7 @@ export class TranscriptionManager extends Resource {
|
|
|
84
91
|
}
|
|
85
92
|
|
|
86
93
|
setRecording(recording?: boolean): TranscriptionManager {
|
|
87
|
-
if (!this.isOpen || !this._enabled) {
|
|
94
|
+
if (!this.isOpen || !this._enabled.value) {
|
|
88
95
|
return this;
|
|
89
96
|
}
|
|
90
97
|
|
|
@@ -101,18 +108,18 @@ export class TranscriptionManager extends Resource {
|
|
|
101
108
|
* @param enabled - Whether to enable transcription.
|
|
102
109
|
*/
|
|
103
110
|
@synchronized
|
|
104
|
-
async setEnabled(enabled?: boolean) {
|
|
105
|
-
if (this._enabled === enabled) {
|
|
111
|
+
async setEnabled(enabled?: boolean): Promise<void> {
|
|
112
|
+
if (this._enabled.value === enabled) {
|
|
106
113
|
return;
|
|
107
114
|
}
|
|
108
115
|
|
|
109
|
-
this._enabled = enabled ?? false;
|
|
116
|
+
this._enabled.value = enabled ?? false;
|
|
110
117
|
// TODO(burdon): Why is toggle called here?
|
|
111
118
|
this.isOpen && (await this._toggleTranscriber());
|
|
112
119
|
}
|
|
113
120
|
|
|
114
121
|
@synchronized
|
|
115
|
-
async setAudioTrack(track?: MediaStreamTrack) {
|
|
122
|
+
async setAudioTrack(track?: MediaStreamTrack): Promise<void> {
|
|
116
123
|
if (this._audioStreamTrack === track) {
|
|
117
124
|
return;
|
|
118
125
|
}
|
|
@@ -122,11 +129,11 @@ export class TranscriptionManager extends Resource {
|
|
|
122
129
|
}
|
|
123
130
|
|
|
124
131
|
// TODO(burdon): Change this to setEnables (explicit), not toggle.
|
|
125
|
-
private async _toggleTranscriber() {
|
|
132
|
+
private async _toggleTranscriber(): Promise<void> {
|
|
126
133
|
await this._maybeReinitTranscriber();
|
|
127
134
|
|
|
128
135
|
// Open or close transcriber if transcription is enabled or disabled.
|
|
129
|
-
if (this._enabled) {
|
|
136
|
+
if (this._enabled.value) {
|
|
130
137
|
await this._transcriber?.open();
|
|
131
138
|
// TODO(burdon): Started and stopped blocks appear twice.
|
|
132
139
|
const block = create(DataType.Message, {
|
|
@@ -146,8 +153,8 @@ export class TranscriptionManager extends Resource {
|
|
|
146
153
|
}
|
|
147
154
|
}
|
|
148
155
|
|
|
149
|
-
private async _maybeReinitTranscriber() {
|
|
150
|
-
if (!this._audioStreamTrack || !this._enabled) {
|
|
156
|
+
private async _maybeReinitTranscriber(): Promise<void> {
|
|
157
|
+
if (!this._audioStreamTrack || !this._enabled.value) {
|
|
151
158
|
return;
|
|
152
159
|
}
|
|
153
160
|
|
|
@@ -156,7 +163,7 @@ export class TranscriptionManager extends Resource {
|
|
|
156
163
|
if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {
|
|
157
164
|
this._mediaRecorder = new MediaStreamRecorder({
|
|
158
165
|
mediaStreamTrack: this._audioStreamTrack,
|
|
159
|
-
interval: RECORD_INTERVAL,
|
|
166
|
+
config: { interval: RECORD_INTERVAL },
|
|
160
167
|
});
|
|
161
168
|
needReinit = true;
|
|
162
169
|
}
|
|
@@ -173,7 +180,7 @@ export class TranscriptionManager extends Resource {
|
|
|
173
180
|
}
|
|
174
181
|
}
|
|
175
182
|
|
|
176
|
-
private async _onSegments(segments: DataType.MessageBlock.Transcription[]) {
|
|
183
|
+
private async _onSegments(segments: DataType.MessageBlock.Transcription[]): Promise<void> {
|
|
177
184
|
if (!this.isOpen || !this._queue) {
|
|
178
185
|
return;
|
|
179
186
|
}
|
package/src/translations.ts
CHANGED
|
@@ -16,9 +16,6 @@ export default [
|
|
|
16
16
|
'plugin name': 'Transcription',
|
|
17
17
|
'transcript companion label': 'Transcript',
|
|
18
18
|
|
|
19
|
-
'start transcription label': 'Start transcription',
|
|
20
|
-
'stop transcription label': 'Stop transcription',
|
|
21
|
-
|
|
22
19
|
'delete button': 'Delete',
|
|
23
20
|
'bookmark button': 'Bookmark',
|
|
24
21
|
'scroll to end label': 'Scroll to latest',
|
package/src/types/schema.ts
CHANGED
|
@@ -10,8 +10,7 @@ import { Expando, Ref, TypedObject } from '@dxos/echo-schema';
|
|
|
10
10
|
* Root transcript object created when the user starts a transcription.
|
|
11
11
|
*/
|
|
12
12
|
export const TranscriptSchema = Schema.Struct({
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
// TODO(wittjosiah): Remove?
|
|
15
14
|
// TODO(burdon): Use Date or string?
|
|
16
15
|
started: Schema.optional(Schema.String),
|
|
17
16
|
ended: Schema.optional(Schema.String),
|
package/src/types/types.ts
CHANGED
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { Schema } from 'effect';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import { isLiveObject, SpaceId } from '@dxos/react-client/echo';
|
|
7
|
+
import { SpaceId } from '@dxos/react-client/echo';
|
|
9
8
|
|
|
10
9
|
import { TranscriptType } from './schema';
|
|
11
10
|
import { TRANSCRIPTION_PLUGIN } from '../meta';
|
|
@@ -31,16 +30,3 @@ export namespace TranscriptionAction {
|
|
|
31
30
|
}),
|
|
32
31
|
}) {}
|
|
33
32
|
}
|
|
34
|
-
|
|
35
|
-
export const isTranscript = (object: unknown): object is typeof TranscriptType => {
|
|
36
|
-
return isLiveObject(object) && isInstanceOf(TranscriptType, object);
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
// TODO(burdon): Create with decode consistently: Schema.decodeSync(TranscriptionSettingsSchema)({}))
|
|
40
|
-
export const TranscriptionSettingsSchema = Schema.mutable(
|
|
41
|
-
Schema.Struct({
|
|
42
|
-
entityExtraction: Schema.optional(Schema.Boolean).pipe(Schema.withConstructorDefault(() => true)),
|
|
43
|
-
}),
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
export type TranscriptionSettingsProps = Schema.Schema.Type<typeof TranscriptionSettingsSchema>;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
TranscriptContainer_default,
|
|
3
|
-
TranscriptionContainer
|
|
4
|
-
} from "./chunk-K2LS2QOM.mjs";
|
|
5
|
-
import "./chunk-LTIQFX4W.mjs";
|
|
6
|
-
import "./chunk-6ZR5MDK3.mjs";
|
|
7
|
-
export {
|
|
8
|
-
TranscriptionContainer,
|
|
9
|
-
TranscriptContainer_default as default
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=TranscriptContainer-CXA4ZBHW.mjs.map
|