@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.
Files changed (243) hide show
  1. package/dist/lib/browser/TranscriptContainer-PFKLKRPQ.mjs +11 -0
  2. package/dist/lib/browser/{chunk-3TKXI6TQ.mjs → chunk-4KCUYW2F.mjs} +43 -26
  3. package/dist/lib/browser/chunk-4KCUYW2F.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-6ZR5MDK3.mjs → chunk-GOF7MJNV.mjs} +3 -3
  5. package/dist/lib/browser/{chunk-6ZR5MDK3.mjs.map → chunk-GOF7MJNV.mjs.map} +1 -1
  6. package/dist/lib/browser/chunk-IGEKO7ZU.mjs +8 -0
  7. package/dist/lib/browser/chunk-IGEKO7ZU.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-JHWEZRWC.mjs → chunk-NODIXNQP.mjs} +6 -15
  9. package/dist/lib/browser/chunk-NODIXNQP.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-K2LS2QOM.mjs → chunk-TJPJBE45.mjs} +136 -92
  11. package/dist/lib/browser/chunk-TJPJBE45.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-LTIQFX4W.mjs → chunk-W2KNYJD6.mjs} +4 -4
  13. package/dist/lib/browser/chunk-W2KNYJD6.mjs.map +7 -0
  14. package/dist/lib/browser/index.mjs +8 -31
  15. package/dist/lib/browser/index.mjs.map +3 -3
  16. package/dist/lib/browser/{intent-resolver-DZ62CJPC.mjs → intent-resolver-I2LJSQDR.mjs} +4 -8
  17. package/dist/lib/browser/intent-resolver-I2LJSQDR.mjs.map +7 -0
  18. package/dist/lib/browser/meta.json +1 -1
  19. package/dist/lib/browser/react-surface-ID2MLJHZ.mjs +34 -0
  20. package/dist/lib/browser/react-surface-ID2MLJHZ.mjs.map +7 -0
  21. package/dist/lib/browser/transcriber-NA7CIFIT.mjs +56 -0
  22. package/dist/lib/browser/transcriber-NA7CIFIT.mjs.map +7 -0
  23. package/dist/lib/browser/types/index.mjs +4 -8
  24. package/dist/lib/node/{TranscriptContainer-SSJVLRM6.cjs → TranscriptContainer-LHMC7553.cjs} +9 -9
  25. package/dist/lib/node/{TranscriptContainer-SSJVLRM6.cjs.map → TranscriptContainer-LHMC7553.cjs.map} +2 -2
  26. package/dist/lib/node/{chunk-EVE3H46F.cjs → chunk-3GS5UNO5.cjs} +141 -100
  27. package/dist/lib/node/chunk-3GS5UNO5.cjs.map +7 -0
  28. package/dist/lib/node/{chunk-L27AK6FQ.cjs → chunk-5J3FBCON.cjs} +8 -23
  29. package/dist/lib/node/chunk-5J3FBCON.cjs.map +7 -0
  30. package/dist/lib/node/{chunk-NVZWGFJL.cjs → chunk-AFUZI63A.cjs} +6 -6
  31. package/dist/lib/node/{chunk-NVZWGFJL.cjs.map → chunk-AFUZI63A.cjs.map} +1 -1
  32. package/dist/lib/node/{chunk-EJWB53WK.cjs → chunk-EIMUQYCZ.cjs} +10 -21
  33. package/dist/lib/node/chunk-EIMUQYCZ.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-JUGOXWES.cjs → chunk-FKDJNJ57.cjs} +8 -8
  35. package/dist/lib/node/chunk-FKDJNJ57.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-WKZLGVEJ.cjs → chunk-ZFTXJZXH.cjs} +44 -29
  37. package/dist/lib/node/chunk-ZFTXJZXH.cjs.map +7 -0
  38. package/dist/lib/node/index.cjs +36 -56
  39. package/dist/lib/node/index.cjs.map +3 -3
  40. package/dist/lib/node/{intent-resolver-TRBKI24D.cjs → intent-resolver-LLMGF5I5.cjs} +9 -11
  41. package/dist/lib/node/intent-resolver-LLMGF5I5.cjs.map +7 -0
  42. package/dist/lib/node/meta.json +1 -1
  43. package/dist/lib/node/{react-surface-SZAMHCX7.cjs → react-surface-SEQLEL4K.cjs} +13 -21
  44. package/dist/lib/node/react-surface-SEQLEL4K.cjs.map +7 -0
  45. package/dist/lib/node/transcriber-RKKN7LDU.cjs +68 -0
  46. package/dist/lib/node/transcriber-RKKN7LDU.cjs.map +7 -0
  47. package/dist/lib/node/types/index.cjs +7 -11
  48. package/dist/lib/node/types/index.cjs.map +2 -2
  49. package/dist/lib/node-esm/{TranscriptContainer-M53LI2TX.mjs → TranscriptContainer-DLNRFVTA.mjs} +4 -4
  50. package/dist/lib/node-esm/{chunk-QYG2FOXA.mjs → chunk-BRPFVRAD.mjs} +6 -15
  51. package/dist/lib/node-esm/chunk-BRPFVRAD.mjs.map +7 -0
  52. package/dist/lib/node-esm/{chunk-V5IWBPYO.mjs → chunk-EFIWBQDF.mjs} +43 -26
  53. package/dist/lib/node-esm/chunk-EFIWBQDF.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-KUWWHMOA.mjs +10 -0
  55. package/dist/lib/node-esm/chunk-KUWWHMOA.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-5E2MR5XK.mjs → chunk-MFJPEIVB.mjs} +4 -4
  57. package/dist/lib/node-esm/chunk-MFJPEIVB.mjs.map +7 -0
  58. package/dist/lib/node-esm/{chunk-4KC3E5T4.mjs → chunk-PR7EYODX.mjs} +136 -92
  59. package/dist/lib/node-esm/chunk-PR7EYODX.mjs.map +7 -0
  60. package/dist/lib/node-esm/{chunk-X4DDJIVL.mjs → chunk-TXMDLLBR.mjs} +3 -3
  61. package/dist/lib/node-esm/{chunk-X4DDJIVL.mjs.map → chunk-TXMDLLBR.mjs.map} +1 -1
  62. package/dist/lib/node-esm/index.mjs +8 -31
  63. package/dist/lib/node-esm/index.mjs.map +3 -3
  64. package/dist/lib/node-esm/{intent-resolver-HFVAL274.mjs → intent-resolver-WOZKOEBW.mjs} +4 -8
  65. package/dist/lib/node-esm/intent-resolver-WOZKOEBW.mjs.map +7 -0
  66. package/dist/lib/node-esm/meta.json +1 -1
  67. package/dist/lib/node-esm/{react-surface-UEJELL7I.mjs → react-surface-7MXUUTAL.mjs} +9 -19
  68. package/dist/lib/node-esm/react-surface-7MXUUTAL.mjs.map +7 -0
  69. package/dist/lib/node-esm/transcriber-5WSI6DYK.mjs +57 -0
  70. package/dist/lib/node-esm/transcriber-5WSI6DYK.mjs.map +7 -0
  71. package/dist/lib/node-esm/types/index.mjs +4 -8
  72. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/capabilities.d.ts +8 -8
  74. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/index.d.ts +1 -4
  76. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/transcriber.d.ts +2 -1
  80. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  81. package/dist/types/src/components/index.d.ts +0 -1
  82. package/dist/types/src/components/index.d.ts.map +1 -1
  83. package/dist/types/src/components/stories/FileTranscription.stories.d.ts +17 -0
  84. package/dist/types/src/components/stories/FileTranscription.stories.d.ts.map +1 -0
  85. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts +10 -0
  86. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts.map +1 -0
  87. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts +19 -0
  88. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts.map +1 -0
  89. package/dist/types/src/components/stories/TranscriptionStory.d.ts +11 -0
  90. package/dist/types/src/components/stories/TranscriptionStory.d.ts.map +1 -0
  91. package/dist/types/src/components/stories/useIsSpeaking.d.ts +3 -0
  92. package/dist/types/src/components/stories/useIsSpeaking.d.ts.map +1 -0
  93. package/dist/types/src/hooks/useAudioFile.d.ts +1 -1
  94. package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
  95. package/dist/types/src/hooks/useAudioTrack.d.ts +1 -1
  96. package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -1
  97. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -1
  98. package/dist/types/src/hooks/useTranscriber.d.ts +1 -1
  99. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  100. package/dist/types/src/model/model.d.ts.map +1 -1
  101. package/dist/types/src/segments-normalization/index.d.ts +4 -0
  102. package/dist/types/src/segments-normalization/index.d.ts.map +1 -0
  103. package/dist/types/src/segments-normalization/message-normalizer.d.ts +26 -0
  104. package/dist/types/src/segments-normalization/message-normalizer.d.ts.map +1 -0
  105. package/dist/types/src/segments-normalization/normalization.d.ts +520 -0
  106. package/dist/types/src/segments-normalization/normalization.d.ts.map +1 -0
  107. package/dist/types/src/segments-normalization/normalization.test.d.ts +2 -0
  108. package/dist/types/src/segments-normalization/normalization.test.d.ts.map +1 -0
  109. package/dist/types/src/segments-normalization/utils.d.ts +3 -0
  110. package/dist/types/src/segments-normalization/utils.d.ts.map +1 -0
  111. package/dist/types/src/testing/testing.d.ts.map +1 -1
  112. package/dist/types/src/transcriber/media-stream-recorder.d.ts +8 -5
  113. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  114. package/dist/types/src/transcriber/transcriber.d.ts +4 -0
  115. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  116. package/dist/types/src/transcriber/transcription-manager.d.ts +2 -0
  117. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  118. package/dist/types/src/translations.d.ts +0 -2
  119. package/dist/types/src/translations.d.ts.map +1 -1
  120. package/dist/types/src/types/schema.d.ts +0 -3
  121. package/dist/types/src/types/schema.d.ts.map +1 -1
  122. package/dist/types/src/types/types.d.ts +1 -5
  123. package/dist/types/src/types/types.d.ts.map +1 -1
  124. package/package.json +54 -50
  125. package/src/TranscriptionPlugin.tsx +2 -24
  126. package/src/capabilities/capabilities.ts +15 -9
  127. package/src/capabilities/index.ts +0 -3
  128. package/src/capabilities/intent-resolver.ts +0 -2
  129. package/src/capabilities/react-surface.tsx +4 -11
  130. package/src/capabilities/transcriber.ts +34 -7
  131. package/src/components/Transcript/deprecated/OldTranscript.tsx +1 -1
  132. package/src/components/Transcript/transcript-extension.ts +2 -2
  133. package/src/components/index.ts +0 -1
  134. package/src/components/stories/FileTranscription.stories.tsx +240 -0
  135. package/src/components/stories/KeyWordRecognition.stories.tsx +128 -0
  136. package/src/components/stories/MicrophoneTranscription.stories.tsx +274 -0
  137. package/src/components/stories/TranscriptionStory.tsx +41 -0
  138. package/src/components/stories/useIsSpeaking.tsx +40 -0
  139. package/src/hooks/useAudioFile.ts +39 -9
  140. package/src/hooks/useAudioTrack.ts +2 -2
  141. package/src/hooks/useQueueModelAdapter.ts +7 -5
  142. package/src/hooks/useTranscriber.ts +4 -3
  143. package/src/meta.ts +2 -2
  144. package/src/model/model.ts +1 -1
  145. package/src/segments-normalization/index.ts +7 -0
  146. package/src/segments-normalization/message-normalizer.ts +108 -0
  147. package/src/segments-normalization/normalization.test.ts +142 -0
  148. package/src/segments-normalization/normalization.ts +103 -0
  149. package/src/segments-normalization/utils.ts +9 -0
  150. package/src/testing/testing.ts +17 -17
  151. package/src/transcriber/media-stream-recorder.ts +14 -7
  152. package/src/transcriber/transcriber.browser.test.ts +4 -4
  153. package/src/transcriber/transcriber.ts +13 -9
  154. package/src/transcriber/transcription-manager.ts +21 -14
  155. package/src/translations.ts +0 -3
  156. package/src/types/schema.ts +1 -2
  157. package/src/types/types.ts +1 -15
  158. package/dist/lib/browser/TranscriptContainer-CXA4ZBHW.mjs +0 -11
  159. package/dist/lib/browser/app-graph-builder-REQZ5SC5.mjs +0 -351
  160. package/dist/lib/browser/app-graph-builder-REQZ5SC5.mjs.map +0 -7
  161. package/dist/lib/browser/chunk-3TKXI6TQ.mjs.map +0 -7
  162. package/dist/lib/browser/chunk-JHWEZRWC.mjs.map +0 -7
  163. package/dist/lib/browser/chunk-K2LS2QOM.mjs.map +0 -7
  164. package/dist/lib/browser/chunk-KLD7O5GJ.mjs +0 -25
  165. package/dist/lib/browser/chunk-KLD7O5GJ.mjs.map +0 -7
  166. package/dist/lib/browser/chunk-LCTMCTYY.mjs +0 -27
  167. package/dist/lib/browser/chunk-LCTMCTYY.mjs.map +0 -7
  168. package/dist/lib/browser/chunk-LTIQFX4W.mjs.map +0 -7
  169. package/dist/lib/browser/intent-resolver-DZ62CJPC.mjs.map +0 -7
  170. package/dist/lib/browser/meeting-transcription-state-MNA2XROE.mjs +0 -18
  171. package/dist/lib/browser/meeting-transcription-state-MNA2XROE.mjs.map +0 -7
  172. package/dist/lib/browser/react-surface-PUXZNAZL.mjs +0 -44
  173. package/dist/lib/browser/react-surface-PUXZNAZL.mjs.map +0 -7
  174. package/dist/lib/browser/settings-JWDS4J3F.mjs +0 -24
  175. package/dist/lib/browser/settings-JWDS4J3F.mjs.map +0 -7
  176. package/dist/lib/browser/transcriber-YWWIV6KP.mjs +0 -37
  177. package/dist/lib/browser/transcriber-YWWIV6KP.mjs.map +0 -7
  178. package/dist/lib/node/app-graph-builder-OAPU4GDH.cjs +0 -352
  179. package/dist/lib/node/app-graph-builder-OAPU4GDH.cjs.map +0 -7
  180. package/dist/lib/node/chunk-EJWB53WK.cjs.map +0 -7
  181. package/dist/lib/node/chunk-EVE3H46F.cjs.map +0 -7
  182. package/dist/lib/node/chunk-J72PUQ3C.cjs +0 -46
  183. package/dist/lib/node/chunk-J72PUQ3C.cjs.map +0 -7
  184. package/dist/lib/node/chunk-JUGOXWES.cjs.map +0 -7
  185. package/dist/lib/node/chunk-L27AK6FQ.cjs.map +0 -7
  186. package/dist/lib/node/chunk-WKZLGVEJ.cjs.map +0 -7
  187. package/dist/lib/node/intent-resolver-TRBKI24D.cjs.map +0 -7
  188. package/dist/lib/node/meeting-transcription-state-5XLTMWPA.cjs +0 -34
  189. package/dist/lib/node/meeting-transcription-state-5XLTMWPA.cjs.map +0 -7
  190. package/dist/lib/node/react-surface-SZAMHCX7.cjs.map +0 -7
  191. package/dist/lib/node/settings-AWWMOSCV.cjs +0 -38
  192. package/dist/lib/node/settings-AWWMOSCV.cjs.map +0 -7
  193. package/dist/lib/node/transcriber-AFUXFHCR.cjs +0 -50
  194. package/dist/lib/node/transcriber-AFUXFHCR.cjs.map +0 -7
  195. package/dist/lib/node-esm/app-graph-builder-UBP6EOBR.mjs +0 -352
  196. package/dist/lib/node-esm/app-graph-builder-UBP6EOBR.mjs.map +0 -7
  197. package/dist/lib/node-esm/chunk-4KC3E5T4.mjs.map +0 -7
  198. package/dist/lib/node-esm/chunk-5E2MR5XK.mjs.map +0 -7
  199. package/dist/lib/node-esm/chunk-MHQP2PAF.mjs +0 -28
  200. package/dist/lib/node-esm/chunk-MHQP2PAF.mjs.map +0 -7
  201. package/dist/lib/node-esm/chunk-QMHMEKB3.mjs +0 -27
  202. package/dist/lib/node-esm/chunk-QMHMEKB3.mjs.map +0 -7
  203. package/dist/lib/node-esm/chunk-QYG2FOXA.mjs.map +0 -7
  204. package/dist/lib/node-esm/chunk-V5IWBPYO.mjs.map +0 -7
  205. package/dist/lib/node-esm/intent-resolver-HFVAL274.mjs.map +0 -7
  206. package/dist/lib/node-esm/meeting-transcription-state-3WOZ52BQ.mjs +0 -19
  207. package/dist/lib/node-esm/meeting-transcription-state-3WOZ52BQ.mjs.map +0 -7
  208. package/dist/lib/node-esm/react-surface-UEJELL7I.mjs.map +0 -7
  209. package/dist/lib/node-esm/settings-QFNFGFJ5.mjs +0 -25
  210. package/dist/lib/node-esm/settings-QFNFGFJ5.mjs.map +0 -7
  211. package/dist/lib/node-esm/transcriber-7RJEFPDI.mjs +0 -38
  212. package/dist/lib/node-esm/transcriber-7RJEFPDI.mjs.map +0 -7
  213. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  214. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  215. package/dist/types/src/capabilities/meeting-transcription-state.d.ts +0 -4
  216. package/dist/types/src/capabilities/meeting-transcription-state.d.ts.map +0 -1
  217. package/dist/types/src/capabilities/settings.d.ts +0 -4
  218. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  219. package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts +0 -6
  220. package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts.map +0 -1
  221. package/dist/types/src/components/TranscriptionSettings/index.d.ts +0 -2
  222. package/dist/types/src/components/TranscriptionSettings/index.d.ts.map +0 -1
  223. package/dist/types/src/components/transcription.stories.d.ts +0 -18
  224. package/dist/types/src/components/transcription.stories.d.ts.map +0 -1
  225. package/dist/types/src/entity-extraction/entity-extraction.d.ts +0 -42
  226. package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +0 -1
  227. package/dist/types/src/entity-extraction/entity-extraction.test.d.ts +0 -2
  228. package/dist/types/src/entity-extraction/entity-extraction.test.d.ts.map +0 -1
  229. package/dist/types/src/entity-extraction/index.d.ts +0 -2
  230. package/dist/types/src/entity-extraction/index.d.ts.map +0 -1
  231. package/src/capabilities/app-graph-builder.ts +0 -233
  232. package/src/capabilities/meeting-transcription-state.ts +0 -16
  233. package/src/capabilities/settings.ts +0 -20
  234. package/src/components/TranscriptionSettings/TranscriptionSettings.tsx +0 -26
  235. package/src/components/TranscriptionSettings/index.ts +0 -5
  236. package/src/components/transcription.stories.tsx +0 -295
  237. package/src/entity-extraction/entity-extraction.test.ts +0 -97
  238. package/src/entity-extraction/entity-extraction.ts +0 -149
  239. package/src/entity-extraction/index.ts +0 -5
  240. package/src/entity-extraction/system-prompt.tpl +0 -38
  241. package/src/entity-extraction/types.d.ts +0 -8
  242. /package/dist/lib/browser/{TranscriptContainer-CXA4ZBHW.mjs.map → TranscriptContainer-PFKLKRPQ.mjs.map} +0 -0
  243. /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 _interval: number;
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, interval }: { mediaStreamTrack: MediaStreamTrack; interval: number }) {
45
+ constructor({ mediaStreamTrack, config }: MediaStreamRecorderParams) {
39
46
  this._mediaStreamTrack = mediaStreamTrack;
40
- this._interval = interval;
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._interval);
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
  }
@@ -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',
@@ -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
- name: Schema.String,
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),
@@ -4,8 +4,7 @@
4
4
 
5
5
  import { Schema } from 'effect';
6
6
 
7
- import { isInstanceOf } from '@dxos/echo-schema';
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