@dxos/plugin-transcription 0.8.2-staging.7ac8446 → 0.8.3-main.672df60

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 (258) hide show
  1. package/dist/lib/browser/TranscriptContainer-3EH6QHPJ.mjs +11 -0
  2. package/dist/lib/browser/{chunk-K7FOYAXO.mjs → chunk-DL2276CA.mjs} +2 -2
  3. package/dist/lib/browser/{chunk-6ZR5MDK3.mjs → chunk-GOF7MJNV.mjs} +3 -3
  4. package/dist/lib/browser/{chunk-6ZR5MDK3.mjs.map → chunk-GOF7MJNV.mjs.map} +1 -1
  5. package/dist/lib/browser/{chunk-YCZISX63.mjs → chunk-LMLE2QYX.mjs} +130 -99
  6. package/dist/lib/browser/chunk-LMLE2QYX.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-NODIXNQP.mjs +54 -0
  8. package/dist/lib/browser/chunk-NODIXNQP.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-RULOUJHH.mjs +764 -0
  10. package/dist/lib/browser/chunk-RULOUJHH.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-YEPT334A.mjs → chunk-W2KNYJD6.mjs} +4 -4
  12. package/dist/lib/browser/chunk-W2KNYJD6.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +31 -219
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/{intent-resolver-4R66ZCKT.mjs → intent-resolver-I2LJSQDR.mjs} +7 -11
  16. package/dist/lib/browser/intent-resolver-I2LJSQDR.mjs.map +7 -0
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/{react-surface-FQUHU5G7.mjs → react-surface-FPVBUAW4.mjs} +11 -9
  19. package/dist/lib/browser/react-surface-FPVBUAW4.mjs.map +7 -0
  20. package/dist/lib/browser/transcriber-KV5VJ6EZ.mjs +56 -0
  21. package/dist/lib/browser/transcriber-KV5VJ6EZ.mjs.map +7 -0
  22. package/dist/lib/browser/types/index.mjs +4 -8
  23. package/dist/lib/node/{TranscriptContainer-QEYTTT2V.cjs → TranscriptContainer-JXOIM6N6.cjs} +9 -8
  24. package/dist/lib/node/TranscriptContainer-JXOIM6N6.cjs.map +7 -0
  25. package/dist/lib/node/{chunk-NVZWGFJL.cjs → chunk-AFUZI63A.cjs} +6 -6
  26. package/dist/lib/node/{chunk-NVZWGFJL.cjs.map → chunk-AFUZI63A.cjs.map} +1 -1
  27. package/dist/lib/node/chunk-CQSQI53U.cjs +778 -0
  28. package/dist/lib/node/chunk-CQSQI53U.cjs.map +7 -0
  29. package/dist/lib/node/chunk-EIMUQYCZ.cjs +74 -0
  30. package/dist/lib/node/chunk-EIMUQYCZ.cjs.map +7 -0
  31. package/dist/lib/node/{chunk-CZMLKKWT.cjs → chunk-FKDJNJ57.cjs} +8 -8
  32. package/dist/lib/node/chunk-FKDJNJ57.cjs.map +7 -0
  33. package/dist/lib/node/{chunk-LP4FG423.cjs → chunk-IY6IM7GC.cjs} +5 -5
  34. package/dist/lib/node/{chunk-FCCJALOT.cjs → chunk-JABOFOJ5.cjs} +129 -99
  35. package/dist/lib/node/chunk-JABOFOJ5.cjs.map +7 -0
  36. package/dist/lib/node/index.cjs +60 -254
  37. package/dist/lib/node/index.cjs.map +4 -4
  38. package/dist/lib/node/{intent-resolver-WMMCOUEH.cjs → intent-resolver-LLMGF5I5.cjs} +10 -11
  39. package/dist/lib/node/intent-resolver-LLMGF5I5.cjs.map +7 -0
  40. package/dist/lib/node/meta.json +1 -1
  41. package/dist/lib/node/{react-surface-WI2MGWCC.cjs → react-surface-REQZMCYO.cjs} +13 -11
  42. package/dist/lib/node/react-surface-REQZMCYO.cjs.map +7 -0
  43. package/dist/lib/node/transcriber-ZSDN6GMP.cjs +68 -0
  44. package/dist/lib/node/transcriber-ZSDN6GMP.cjs.map +7 -0
  45. package/dist/lib/node/types/index.cjs +7 -11
  46. package/dist/lib/node/types/index.cjs.map +2 -2
  47. package/dist/lib/node-esm/{TranscriptContainer-ZXUCOWGY.mjs → TranscriptContainer-K5VZZ4OB.mjs} +4 -3
  48. package/dist/lib/node-esm/chunk-BRPFVRAD.mjs +55 -0
  49. package/dist/lib/node-esm/chunk-BRPFVRAD.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-YQYBLFNI.mjs → chunk-GD5IZDKD.mjs} +130 -99
  51. package/dist/lib/node-esm/chunk-GD5IZDKD.mjs.map +7 -0
  52. package/dist/lib/node-esm/{chunk-PTZHDZ36.mjs → chunk-MFJPEIVB.mjs} +4 -4
  53. package/dist/lib/node-esm/chunk-MFJPEIVB.mjs.map +7 -0
  54. package/dist/lib/node-esm/{chunk-J4D2RBBH.mjs → chunk-SKK7VDQZ.mjs} +2 -2
  55. package/dist/lib/node-esm/{chunk-X4DDJIVL.mjs → chunk-TXMDLLBR.mjs} +3 -3
  56. package/dist/lib/node-esm/{chunk-X4DDJIVL.mjs.map → chunk-TXMDLLBR.mjs.map} +1 -1
  57. package/dist/lib/node-esm/chunk-V54MCG5P.mjs +765 -0
  58. package/dist/lib/node-esm/chunk-V54MCG5P.mjs.map +7 -0
  59. package/dist/lib/node-esm/index.mjs +31 -219
  60. package/dist/lib/node-esm/index.mjs.map +4 -4
  61. package/dist/lib/node-esm/{intent-resolver-QN2LO5TX.mjs → intent-resolver-WOZKOEBW.mjs} +7 -11
  62. package/dist/lib/node-esm/intent-resolver-WOZKOEBW.mjs.map +7 -0
  63. package/dist/lib/node-esm/meta.json +1 -1
  64. package/dist/lib/node-esm/{react-surface-PCH6NTVB.mjs → react-surface-ROQN77NT.mjs} +11 -9
  65. package/dist/lib/node-esm/react-surface-ROQN77NT.mjs.map +7 -0
  66. package/dist/lib/node-esm/transcriber-JHPFZVJJ.mjs +57 -0
  67. package/dist/lib/node-esm/transcriber-JHPFZVJJ.mjs.map +7 -0
  68. package/dist/lib/node-esm/types/index.mjs +4 -8
  69. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  70. package/dist/types/src/capabilities/capabilities.d.ts +8 -10
  71. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  72. package/dist/types/src/capabilities/index.d.ts +2 -183
  73. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
  75. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/transcriber.d.ts +2 -1
  78. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  79. package/dist/types/src/components/Transcript/Transcript.d.ts +14 -4
  80. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  81. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +19 -4
  82. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +27 -0
  84. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +1 -0
  85. package/dist/types/src/components/Transcript/transcript-extension.d.ts +19 -0
  86. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -0
  87. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  88. package/dist/types/src/components/stories/FileTranscription.stories.d.ts +17 -0
  89. package/dist/types/src/components/stories/FileTranscription.stories.d.ts.map +1 -0
  90. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts +10 -0
  91. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts.map +1 -0
  92. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts +19 -0
  93. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts.map +1 -0
  94. package/dist/types/src/components/stories/TranscriptionStory.d.ts +11 -0
  95. package/dist/types/src/components/stories/TranscriptionStory.d.ts.map +1 -0
  96. package/dist/types/src/components/stories/useIsSpeaking.d.ts +3 -0
  97. package/dist/types/src/components/stories/useIsSpeaking.d.ts.map +1 -0
  98. package/dist/types/src/hooks/index.d.ts +1 -0
  99. package/dist/types/src/hooks/index.d.ts.map +1 -1
  100. package/dist/types/src/hooks/useAudioFile.d.ts +1 -1
  101. package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
  102. package/dist/types/src/hooks/useAudioTrack.d.ts +1 -1
  103. package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -1
  104. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +7 -0
  105. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -0
  106. package/dist/types/src/hooks/useTranscriber.d.ts +1 -1
  107. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  108. package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -1
  109. package/dist/types/src/model/index.d.ts +2 -0
  110. package/dist/types/src/model/index.d.ts.map +1 -0
  111. package/dist/types/src/model/model.d.ts +68 -0
  112. package/dist/types/src/model/model.d.ts.map +1 -0
  113. package/dist/types/src/model/model.test.d.ts +2 -0
  114. package/dist/types/src/model/model.test.d.ts.map +1 -0
  115. package/dist/types/src/segments-normalization/index.d.ts +4 -0
  116. package/dist/types/src/segments-normalization/index.d.ts.map +1 -0
  117. package/dist/types/src/segments-normalization/message-normalizer.d.ts +26 -0
  118. package/dist/types/src/segments-normalization/message-normalizer.d.ts.map +1 -0
  119. package/dist/types/src/segments-normalization/normalization.d.ts +520 -0
  120. package/dist/types/src/segments-normalization/normalization.d.ts.map +1 -0
  121. package/dist/types/src/segments-normalization/normalization.test.d.ts +2 -0
  122. package/dist/types/src/segments-normalization/normalization.test.d.ts.map +1 -0
  123. package/dist/types/src/segments-normalization/utils.d.ts +3 -0
  124. package/dist/types/src/segments-normalization/utils.d.ts.map +1 -0
  125. package/dist/types/src/testing/index.d.ts +2 -0
  126. package/dist/types/src/testing/index.d.ts.map +1 -0
  127. package/dist/types/src/testing/testing.d.ts +40 -0
  128. package/dist/types/src/testing/testing.d.ts.map +1 -0
  129. package/dist/types/src/transcriber/media-stream-recorder.d.ts +8 -5
  130. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  131. package/dist/types/src/transcriber/transcriber.browser.test.d.ts +2 -0
  132. package/dist/types/src/transcriber/transcriber.browser.test.d.ts.map +1 -0
  133. package/dist/types/src/transcriber/transcriber.d.ts +6 -2
  134. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  135. package/dist/types/src/transcriber/transcription-manager.d.ts +20 -16
  136. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  137. package/dist/types/src/translations.d.ts +3 -20
  138. package/dist/types/src/translations.d.ts.map +1 -1
  139. package/dist/types/src/types/schema.d.ts +23 -40
  140. package/dist/types/src/types/schema.d.ts.map +1 -1
  141. package/dist/types/src/types/types.d.ts +15 -8
  142. package/dist/types/src/types/types.d.ts.map +1 -1
  143. package/dist/types/src/util/array.d.ts.map +1 -1
  144. package/dist/types/src/util/get-time-str.d.ts.map +1 -1
  145. package/dist/types/src/util/index.d.ts +0 -1
  146. package/dist/types/src/util/index.d.ts.map +1 -1
  147. package/dist/types/src/util/monitor-audio-level.d.ts.map +1 -1
  148. package/dist/types/tsconfig.tsbuildinfo +1 -1
  149. package/package.json +62 -41
  150. package/src/TranscriptionPlugin.tsx +14 -21
  151. package/src/capabilities/capabilities.ts +15 -8
  152. package/src/capabilities/index.ts +0 -2
  153. package/src/capabilities/intent-resolver.ts +7 -8
  154. package/src/capabilities/react-surface.tsx +5 -4
  155. package/src/capabilities/transcriber.ts +34 -6
  156. package/src/components/Transcript/Transcript.stories.tsx +201 -43
  157. package/src/components/Transcript/Transcript.tsx +83 -208
  158. package/src/components/Transcript/deprecated/OldTranscript.tsx +260 -0
  159. package/src/components/Transcript/transcript-extension.ts +236 -0
  160. package/src/components/TranscriptContainer.tsx +11 -6
  161. package/src/components/stories/FileTranscription.stories.tsx +240 -0
  162. package/src/components/stories/KeyWordRecognition.stories.tsx +128 -0
  163. package/src/components/stories/MicrophoneTranscription.stories.tsx +274 -0
  164. package/src/components/stories/TranscriptionStory.tsx +41 -0
  165. package/src/components/stories/useIsSpeaking.tsx +40 -0
  166. package/src/hooks/index.ts +1 -0
  167. package/src/hooks/useAudioFile.ts +39 -9
  168. package/src/hooks/useAudioTrack.ts +2 -2
  169. package/src/hooks/useQueueModelAdapter.ts +65 -0
  170. package/src/hooks/useTranscriber.ts +4 -2
  171. package/src/meta.ts +2 -2
  172. package/src/model/index.ts +5 -0
  173. package/src/model/model.test.ts +169 -0
  174. package/src/model/model.ts +229 -0
  175. package/src/segments-normalization/index.ts +7 -0
  176. package/src/segments-normalization/message-normalizer.ts +108 -0
  177. package/src/segments-normalization/normalization.test.ts +142 -0
  178. package/src/segments-normalization/normalization.ts +103 -0
  179. package/src/segments-normalization/utils.ts +9 -0
  180. package/src/testing/index.ts +5 -0
  181. package/src/testing/testing.ts +216 -0
  182. package/src/transcriber/media-stream-recorder.ts +14 -7
  183. package/src/transcriber/{transcriber.test.ts → transcriber.browser.test.ts} +7 -7
  184. package/src/transcriber/transcriber.ts +33 -20
  185. package/src/transcriber/transcription-manager.ts +81 -70
  186. package/src/translations.ts +2 -3
  187. package/src/types/schema.ts +11 -33
  188. package/src/types/types.ts +8 -12
  189. package/src/util/index.ts +0 -1
  190. package/dist/lib/browser/TranscriptContainer-JQ3HFHLQ.mjs +0 -10
  191. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs +0 -191
  192. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs.map +0 -7
  193. package/dist/lib/browser/chunk-G4B6CPC2.mjs +0 -253
  194. package/dist/lib/browser/chunk-G4B6CPC2.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-GU2BNYKZ.mjs +0 -35
  196. package/dist/lib/browser/chunk-GU2BNYKZ.mjs.map +0 -7
  197. package/dist/lib/browser/chunk-OGNXNGJB.mjs +0 -73
  198. package/dist/lib/browser/chunk-OGNXNGJB.mjs.map +0 -7
  199. package/dist/lib/browser/chunk-YCZISX63.mjs.map +0 -7
  200. package/dist/lib/browser/chunk-YEPT334A.mjs.map +0 -7
  201. package/dist/lib/browser/intent-resolver-4R66ZCKT.mjs.map +0 -7
  202. package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs +0 -18
  203. package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs.map +0 -7
  204. package/dist/lib/browser/react-surface-FQUHU5G7.mjs.map +0 -7
  205. package/dist/lib/browser/transcriber-LGMIWDYI.mjs +0 -36
  206. package/dist/lib/browser/transcriber-LGMIWDYI.mjs.map +0 -7
  207. package/dist/lib/node/TranscriptContainer-QEYTTT2V.cjs.map +0 -7
  208. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs +0 -200
  209. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs.map +0 -7
  210. package/dist/lib/node/chunk-3KHUSQNW.cjs +0 -55
  211. package/dist/lib/node/chunk-3KHUSQNW.cjs.map +0 -7
  212. package/dist/lib/node/chunk-CZMLKKWT.cjs.map +0 -7
  213. package/dist/lib/node/chunk-FCCJALOT.cjs.map +0 -7
  214. package/dist/lib/node/chunk-P4VVD6ZO.cjs +0 -95
  215. package/dist/lib/node/chunk-P4VVD6ZO.cjs.map +0 -7
  216. package/dist/lib/node/chunk-UOFHT4GZ.cjs +0 -280
  217. package/dist/lib/node/chunk-UOFHT4GZ.cjs.map +0 -7
  218. package/dist/lib/node/intent-resolver-WMMCOUEH.cjs.map +0 -7
  219. package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs +0 -34
  220. package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs.map +0 -7
  221. package/dist/lib/node/react-surface-WI2MGWCC.cjs.map +0 -7
  222. package/dist/lib/node/transcriber-QG5WPKX4.cjs +0 -49
  223. package/dist/lib/node/transcriber-QG5WPKX4.cjs.map +0 -7
  224. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs +0 -192
  225. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs +0 -254
  227. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs +0 -74
  229. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs.map +0 -7
  230. package/dist/lib/node-esm/chunk-HKATMD34.mjs +0 -37
  231. package/dist/lib/node-esm/chunk-HKATMD34.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-PTZHDZ36.mjs.map +0 -7
  233. package/dist/lib/node-esm/chunk-YQYBLFNI.mjs.map +0 -7
  234. package/dist/lib/node-esm/intent-resolver-QN2LO5TX.mjs.map +0 -7
  235. package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs +0 -19
  236. package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs.map +0 -7
  237. package/dist/lib/node-esm/react-surface-PCH6NTVB.mjs.map +0 -7
  238. package/dist/lib/node-esm/transcriber-TMPYZ5L4.mjs +0 -37
  239. package/dist/lib/node-esm/transcriber-TMPYZ5L4.mjs.map +0 -7
  240. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -181
  241. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  242. package/dist/types/src/capabilities/meeting-transcription-state.d.ts +0 -6
  243. package/dist/types/src/capabilities/meeting-transcription-state.d.ts.map +0 -1
  244. package/dist/types/src/components/transcription.stories.d.ts +0 -15
  245. package/dist/types/src/components/transcription.stories.d.ts.map +0 -1
  246. package/dist/types/src/transcriber/transcriber.test.d.ts +0 -2
  247. package/dist/types/src/transcriber/transcriber.test.d.ts.map +0 -1
  248. package/dist/types/src/util/random-queue-dxn.d.ts +0 -3
  249. package/dist/types/src/util/random-queue-dxn.d.ts.map +0 -1
  250. package/src/capabilities/app-graph-builder.ts +0 -152
  251. package/src/capabilities/meeting-transcription-state.ts +0 -16
  252. package/src/components/transcription.stories.tsx +0 -196
  253. package/src/util/random-queue-dxn.ts +0 -9
  254. /package/dist/lib/browser/{TranscriptContainer-JQ3HFHLQ.mjs.map → TranscriptContainer-3EH6QHPJ.mjs.map} +0 -0
  255. /package/dist/lib/browser/{chunk-K7FOYAXO.mjs.map → chunk-DL2276CA.mjs.map} +0 -0
  256. /package/dist/lib/node/{chunk-LP4FG423.cjs.map → chunk-IY6IM7GC.cjs.map} +0 -0
  257. /package/dist/lib/node-esm/{TranscriptContainer-ZXUCOWGY.mjs.map → TranscriptContainer-K5VZZ4OB.mjs.map} +0 -0
  258. /package/dist/lib/node-esm/{chunk-J4D2RBBH.mjs.map → chunk-SKK7VDQZ.mjs.map} +0 -0
@@ -26,15 +26,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_FCCJALOT_exports = {};
30
- __export(chunk_FCCJALOT_exports, {
29
+ var chunk_JABOFOJ5_exports = {};
30
+ __export(chunk_JABOFOJ5_exports, {
31
31
  MediaStreamRecorder: () => MediaStreamRecorder,
32
32
  Transcriber: () => Transcriber,
33
33
  TranscriptionManager: () => TranscriptionManager
34
34
  });
35
- module.exports = __toCommonJS(chunk_FCCJALOT_exports);
36
- var import_chunk_3KHUSQNW = require("./chunk-3KHUSQNW.cjs");
37
- var import_chunk_P4VVD6ZO = require("./chunk-P4VVD6ZO.cjs");
35
+ module.exports = __toCommonJS(chunk_JABOFOJ5_exports);
36
+ var import_chunk_EIMUQYCZ = require("./chunk-EIMUQYCZ.cjs");
38
37
  var import_extendable_media_recorder = require("extendable-media-recorder");
39
38
  var import_wavefile = require("wavefile");
40
39
  var import_async = require("@dxos/async");
@@ -46,12 +45,11 @@ var import_async2 = require("@dxos/async");
46
45
  var import_context = require("@dxos/context");
47
46
  var import_log2 = require("@dxos/log");
48
47
  var import_tracing2 = require("@dxos/tracing");
48
+ var import_signals_core = require("@preact/signals-core");
49
49
  var import_async3 = require("@dxos/async");
50
50
  var import_context2 = require("@dxos/context");
51
- var import_echo_db = require("@dxos/echo-db");
52
51
  var import_echo_schema = require("@dxos/echo-schema");
53
- var import_invariant2 = require("@dxos/invariant");
54
- var import_keys = require("@dxos/keys");
52
+ var import_schema = require("@dxos/schema");
55
53
  function _ts_decorate(decorators, target, key, desc) {
56
54
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
57
55
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -65,11 +63,11 @@ var initializeExtendableMediaRecorder = async () => {
65
63
  await (0, import_extendable_media_recorder.register)(await connect());
66
64
  };
67
65
  var MediaStreamRecorder = class {
68
- constructor({ mediaStreamTrack, interval }) {
66
+ constructor({ mediaStreamTrack, config }) {
69
67
  this._mediaRecorder = void 0;
70
68
  this._header = void 0;
71
69
  this._mediaStreamTrack = mediaStreamTrack;
72
- this._interval = interval;
70
+ this._config = config;
73
71
  }
74
72
  get wavConfig() {
75
73
  const settings = this._mediaStreamTrack.getSettings();
@@ -90,7 +88,7 @@ var MediaStreamRecorder = class {
90
88
  err
91
89
  }, {
92
90
  F: __dxlog_file,
93
- L: 62,
91
+ L: 69,
94
92
  S: this,
95
93
  C: (f, a) => f(...a)
96
94
  }));
@@ -107,7 +105,7 @@ var MediaStreamRecorder = class {
107
105
  }
108
106
  (0, import_invariant.invariant)(this._onChunk, "MediaStreamRecorder: onChunk is not set", {
109
107
  F: __dxlog_file,
110
- L: 73,
108
+ L: 80,
111
109
  S: this,
112
110
  A: [
113
111
  "this._onChunk",
@@ -115,7 +113,7 @@ var MediaStreamRecorder = class {
115
113
  ]
116
114
  });
117
115
  this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);
118
- this._mediaRecorder.start(this._interval);
116
+ this._mediaRecorder.start(this._config.interval);
119
117
  }
120
118
  async stop() {
121
119
  if (this._mediaRecorder?.state !== "recording") {
@@ -142,7 +140,7 @@ var MediaStreamRecorder = class {
142
140
  } else {
143
141
  import_log.log.warn("MediaStreamRecorder: no header", void 0, {
144
142
  F: __dxlog_file,
145
- L: 104,
143
+ L: 111,
146
144
  S: this,
147
145
  C: (f, a) => f(...a)
148
146
  });
@@ -160,6 +158,15 @@ _ts_decorate([
160
158
  MediaStreamRecorder = _ts_decorate([
161
159
  import_tracing.trace.resource()
162
160
  ], MediaStreamRecorder);
161
+ var mergeFloat64Arrays = (arrays) => {
162
+ const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));
163
+ let offset = 0;
164
+ for (const array of arrays) {
165
+ newArray.set(array, offset);
166
+ offset += array.length;
167
+ }
168
+ return newArray;
169
+ };
163
170
  function _ts_decorate2(decorators, target, key, desc) {
164
171
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
165
172
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -182,17 +189,35 @@ var Transcriber = class extends import_context.Resource {
182
189
  this._onSegments = onSegments;
183
190
  }
184
191
  async _open(ctx) {
192
+ import_log2.log.info("opening", void 0, {
193
+ F: __dxlog_file2,
194
+ L: 101,
195
+ S: this,
196
+ C: (f, a) => f(...a)
197
+ });
185
198
  this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));
186
199
  await this._recorder.start();
187
200
  this._transcribeTask = new import_async2.DeferredTask(ctx, async () => this._transcribe());
188
201
  this._openTrigger.wake();
189
202
  }
190
203
  async _close() {
204
+ import_log2.log.info("closing", void 0, {
205
+ F: __dxlog_file2,
206
+ L: 109,
207
+ S: this,
208
+ C: (f, a) => f(...a)
209
+ });
191
210
  this._recording = false;
192
211
  this._transcribeTask = void 0;
193
212
  await this._recorder.stop();
194
213
  }
195
214
  startChunksRecording() {
215
+ import_log2.log.info("starting", void 0, {
216
+ F: __dxlog_file2,
217
+ L: 116,
218
+ S: this,
219
+ C: (f, a) => f(...a)
220
+ });
196
221
  if (this._lifecycleState !== import_context.LifecycleState.OPEN) {
197
222
  return;
198
223
  }
@@ -204,13 +229,19 @@ var Transcriber = class extends import_context.Resource {
204
229
  }
205
230
  this._recording = false;
206
231
  this._transcribeTask?.schedule();
232
+ import_log2.log.info("stopped", void 0, {
233
+ F: __dxlog_file2,
234
+ L: 131,
235
+ S: this,
236
+ C: (f, a) => f(...a)
237
+ });
207
238
  }
208
239
  _saveAudioChunk(chunk) {
209
240
  (0, import_log2.log)("saving audio chunk", {
210
241
  chunk
211
242
  }, {
212
243
  F: __dxlog_file2,
213
- L: 124,
244
+ L: 135,
214
245
  S: this,
215
246
  C: (f, a) => f(...a)
216
247
  });
@@ -226,7 +257,7 @@ var Transcriber = class extends import_context.Resource {
226
257
  chunks: this._audioChunks.length
227
258
  }, {
228
259
  F: __dxlog_file2,
229
- L: 140,
260
+ L: 151,
230
261
  S: this,
231
262
  C: (f, a) => f(...a)
232
263
  });
@@ -251,7 +282,7 @@ var Transcriber = class extends import_context.Resource {
251
282
  async _mergeAudioChunks(chunks) {
252
283
  const file = new import_wavefile2.WaveFile();
253
284
  const wavConfig = this._recorder.wavConfig;
254
- file.fromScratch(wavConfig.channels, wavConfig.sampleRate, wavConfig.bitDepthCode, (0, import_chunk_3KHUSQNW.mergeFloat64Arrays)(chunks.map(({ data }) => data)));
285
+ file.fromScratch(wavConfig.channels, wavConfig.sampleRate, wavConfig.bitDepthCode, mergeFloat64Arrays(chunks.map(({ data }) => data)));
255
286
  return file.toBase64();
256
287
  }
257
288
  async _fetchTranscription(audio) {
@@ -259,7 +290,7 @@ var Transcriber = class extends import_context.Resource {
259
290
  this._audioChunks = [];
260
291
  throw new Error("No audio to send for transcribing");
261
292
  }
262
- const response = await fetch(`${import_chunk_P4VVD6ZO.TRANSCRIPTION_URL}/transcribe`, {
293
+ const response = await fetch(`${import_chunk_EIMUQYCZ.TRANSCRIPTION_URL}/transcribe`, {
263
294
  method: "POST",
264
295
  body: JSON.stringify({
265
296
  audio
@@ -270,15 +301,15 @@ var Transcriber = class extends import_context.Resource {
270
301
  });
271
302
  if (!response.ok) {
272
303
  this._audioChunks = [];
273
- throw new Error("Failed to transcribe");
304
+ throw new Error(`Transcription failed: ${response.statusText}`);
274
305
  }
275
306
  const { segments } = await response.json();
276
307
  import_log2.log.info("transcription response", {
277
- segments,
308
+ segments: segments.length,
278
309
  string: segments.map((segments2) => segments2.text).join(" ")
279
310
  }, {
280
311
  F: __dxlog_file2,
281
- L: 206,
312
+ L: 215,
282
313
  S: this,
283
314
  C: (f, a) => f(...a)
284
315
  });
@@ -300,8 +331,9 @@ var Transcriber = class extends import_context.Resource {
300
331
  }
301
332
  this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1).end * 1e3;
302
333
  return filteredSegments.map((segment) => ({
303
- started: new Date(zeroTimestamp + segment.start * 1e3),
304
- text: segment.text
334
+ type: "transcription",
335
+ started: new Date(zeroTimestamp + segment.start * 1e3).toISOString(),
336
+ text: segment.text.trim()
305
337
  }));
306
338
  }
307
339
  };
@@ -321,47 +353,55 @@ function _ts_decorate3(decorators, target, key, desc) {
321
353
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
322
354
  return c > 3 && r && Object.defineProperty(target, key, r), r;
323
355
  }
324
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/transcriber/transcription-manager.ts";
325
356
  var RECORD_INTERVAL = 200;
326
357
  var PREFIXED_CHUNKS_AMOUNT = 10;
327
358
  var TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;
328
359
  var TranscriptionManager = class extends import_context2.Resource {
329
- constructor(edgeClient) {
360
+ constructor(options) {
330
361
  super();
331
362
  this._audioStreamTrack = void 0;
332
- this._name = void 0;
333
- this._hue = void 0;
363
+ this._identityDid = void 0;
334
364
  this._mediaRecorder = void 0;
335
365
  this._transcriber = void 0;
336
- this._enabled = false;
337
366
  this._queue = void 0;
338
- this._edgeClient = edgeClient;
367
+ this._enabled = (0, import_signals_core.signal)(false);
368
+ this._edgeClient = options.edgeClient;
369
+ this._messageEnricher = options.messageEnricher;
339
370
  }
340
- async _open() {
341
- await this._toggleTranscriber();
371
+ /** @reactive */
372
+ get enabled() {
373
+ return this._enabled.value;
342
374
  }
343
- async _close() {
344
- void this._transcriber?.close();
375
+ setQueue(queue) {
376
+ this._queue = queue;
377
+ return this;
378
+ }
379
+ setIdentityDid(did) {
380
+ if (this._identityDid !== did) {
381
+ this._identityDid = did;
382
+ }
383
+ return this;
345
384
  }
346
385
  setRecording(recording) {
347
- if (!this.isOpen || !this._enabled) {
348
- return;
386
+ if (!this.isOpen || !this._enabled.value) {
387
+ return this;
349
388
  }
350
389
  if (recording) {
351
390
  this._transcriber?.startChunksRecording();
352
391
  } else {
353
392
  this._transcriber?.stopChunksRecording();
354
393
  }
394
+ return this;
355
395
  }
356
396
  /**
357
397
  * Enable or disable transcription.
358
398
  * @param enabled - Whether to enable transcription.
359
399
  */
360
400
  async setEnabled(enabled) {
361
- if (this._enabled === enabled) {
401
+ if (this._enabled.value === enabled) {
362
402
  return;
363
403
  }
364
- this._enabled = enabled ?? false;
404
+ this._enabled.value = enabled ?? false;
365
405
  this.isOpen && await this._toggleTranscriber();
366
406
  }
367
407
  async setAudioTrack(track) {
@@ -371,67 +411,64 @@ var TranscriptionManager = class extends import_context2.Resource {
371
411
  this._audioStreamTrack = track;
372
412
  this.isOpen && await this._toggleTranscriber();
373
413
  }
374
- /**
375
- * Set the queue to save the transcription to.
376
- * @param queue - The queue to save the transcription to or the DXN of the queue.
377
- */
378
- setQueue(queue) {
379
- switch (typeof queue) {
380
- case "string":
381
- if (this._queue?.dxn.toString() === queue) {
382
- return;
383
- }
384
- this._queue = new import_echo_db.QueueImpl(this._edgeClient, import_keys.DXN.parse(queue));
385
- break;
386
- case "object":
387
- if (this._queue === queue) {
388
- return;
389
- }
390
- (0, import_invariant2.invariant)(queue instanceof import_echo_db.QueueImpl, void 0, {
391
- F: __dxlog_file3,
392
- L: 113,
393
- S: this,
394
- A: [
395
- "queue instanceof QueueImpl",
396
- ""
397
- ]
398
- });
399
- this._queue = queue;
400
- break;
401
- case "undefined":
402
- this._queue = void 0;
403
- break;
404
- }
405
- }
406
- setName(name) {
407
- if (this._name === name) {
408
- return;
409
- }
410
- this._name = name;
414
+ async _open() {
415
+ await this._toggleTranscriber();
411
416
  }
412
- setHue(hue) {
413
- if (this._hue === hue) {
414
- return;
415
- }
416
- this._hue = hue;
417
+ async _close() {
418
+ void this._transcriber?.close();
417
419
  }
420
+ // TODO(burdon): Change this to setEnables (explicit), not toggle.
418
421
  async _toggleTranscriber() {
419
422
  await this._maybeReinitTranscriber();
420
- if (this._enabled) {
423
+ if (this._enabled.value) {
421
424
  await this._transcriber?.open();
425
+ const block = (0, import_echo_schema.create)(import_schema.DataType.Message, {
426
+ created: (/* @__PURE__ */ new Date()).toISOString(),
427
+ blocks: [
428
+ {
429
+ type: "transcription",
430
+ text: "Started",
431
+ started: (/* @__PURE__ */ new Date()).toISOString()
432
+ }
433
+ ],
434
+ sender: {
435
+ role: "assistant"
436
+ }
437
+ });
438
+ this._queue?.append([
439
+ block
440
+ ]);
422
441
  } else {
423
442
  await this._transcriber?.close();
443
+ const block = (0, import_echo_schema.create)(import_schema.DataType.Message, {
444
+ created: (/* @__PURE__ */ new Date()).toISOString(),
445
+ blocks: [
446
+ {
447
+ type: "transcription",
448
+ text: "Stopped",
449
+ started: (/* @__PURE__ */ new Date()).toISOString()
450
+ }
451
+ ],
452
+ sender: {
453
+ role: "assistant"
454
+ }
455
+ });
456
+ this._queue?.append([
457
+ block
458
+ ]);
424
459
  }
425
460
  }
426
461
  async _maybeReinitTranscriber() {
427
- if (!this._audioStreamTrack || !this._enabled) {
462
+ if (!this._audioStreamTrack || !this._enabled.value) {
428
463
  return;
429
464
  }
430
465
  let needReinit = false;
431
466
  if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {
432
467
  this._mediaRecorder = new MediaStreamRecorder({
433
468
  mediaStreamTrack: this._audioStreamTrack,
434
- interval: RECORD_INTERVAL
469
+ config: {
470
+ interval: RECORD_INTERVAL
471
+ }
435
472
  });
436
473
  needReinit = true;
437
474
  }
@@ -451,38 +488,31 @@ var TranscriptionManager = class extends import_context2.Resource {
451
488
  if (!this.isOpen || !this._queue) {
452
489
  return;
453
490
  }
454
- const block = (0, import_echo_schema.createStatic)(import_chunk_P4VVD6ZO.TranscriptBlock, {
455
- authorName: this._name,
456
- authorHue: this._hue,
457
- segments
491
+ let block = (0, import_echo_schema.create)(import_schema.DataType.Message, {
492
+ created: (/* @__PURE__ */ new Date()).toISOString(),
493
+ blocks: segments,
494
+ sender: {
495
+ identityDid: this._identityDid
496
+ }
458
497
  });
498
+ if (this._messageEnricher) {
499
+ block = await this._messageEnricher(block);
500
+ }
459
501
  this._queue.append([
460
502
  block
461
503
  ]);
462
504
  }
463
505
  };
464
- _ts_decorate3([
465
- import_async3.synchronized
466
- ], TranscriptionManager.prototype, "setRecording", null);
467
506
  _ts_decorate3([
468
507
  import_async3.synchronized
469
508
  ], TranscriptionManager.prototype, "setEnabled", null);
470
509
  _ts_decorate3([
471
510
  import_async3.synchronized
472
511
  ], TranscriptionManager.prototype, "setAudioTrack", null);
473
- _ts_decorate3([
474
- import_async3.synchronized
475
- ], TranscriptionManager.prototype, "setQueue", null);
476
- _ts_decorate3([
477
- import_async3.synchronized
478
- ], TranscriptionManager.prototype, "setName", null);
479
- _ts_decorate3([
480
- import_async3.synchronized
481
- ], TranscriptionManager.prototype, "setHue", null);
482
512
  // Annotate the CommonJS export names for ESM import in node:
483
513
  0 && (module.exports = {
484
514
  MediaStreamRecorder,
485
515
  Transcriber,
486
516
  TranscriptionManager
487
517
  });
488
- //# sourceMappingURL=chunk-FCCJALOT.cjs.map
518
+ //# sourceMappingURL=chunk-JABOFOJ5.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/transcriber/media-stream-recorder.ts", "../../../src/transcriber/transcriber.ts", "../../../src/util/array.ts", "../../../src/transcriber/transcription-manager.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type IBlobEvent, type IMediaRecorder, MediaRecorder, register } from 'extendable-media-recorder';\nimport { WaveFile } from 'wavefile';\n\nimport { synchronized } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type WavConfig, type AudioChunk, type AudioRecorder } from './audio-recorder';\n\nlet initializingPromise: Promise<void> | undefined;\n\nconst initializeExtendableMediaRecorder = async () => {\n const { connect } = await import('extendable-media-recorder-wav-encoder');\n await register(await connect());\n};\n\nexport type MediaStreamRecorderParams = {\n mediaStreamTrack: MediaStreamTrack;\n config: {\n interval: number;\n };\n};\n\n/**\n * Recorder that uses the MediaContext API and AudioNode API to record audio.\n *\n * It records MediaStream using https://www.npmjs.com/package/extendable-media-recorder.\n */\n@trace.resource()\nexport class MediaStreamRecorder implements AudioRecorder {\n private readonly _mediaStreamTrack: MediaStreamTrack;\n /**\n * Default MediaRecorder implementation do not support wav encoding.\n */\n private readonly _config: MediaStreamRecorderParams['config'];\n private _mediaRecorder?: IMediaRecorder = undefined;\n private _header?: Uint8Array = undefined;\n private _onChunk?: (chunk: AudioChunk) => void;\n\n constructor({ mediaStreamTrack, config }: MediaStreamRecorderParams) {\n this._mediaStreamTrack = mediaStreamTrack;\n this._config = config;\n }\n\n get wavConfig(): WavConfig {\n const settings = this._mediaStreamTrack.getSettings();\n return {\n channels: settings.channelCount ?? 1,\n sampleRate: settings.sampleRate ?? 16000,\n bitDepthCode: settings.sampleSize ? String(settings.sampleSize) : '16',\n };\n }\n\n get mediaStreamTrack() {\n return this._mediaStreamTrack;\n }\n\n setOnChunk(onChunk: (chunk: AudioChunk) => void): void {\n this._onChunk = onChunk;\n }\n\n async start(): Promise<void> {\n await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) =>\n log.info('initializeExtendableMediaRecorder', { err }),\n );\n\n if (!this._mediaRecorder) {\n const stream = new MediaStream([this._mediaStreamTrack]);\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: 'audio/wav' });\n }\n\n if (this._mediaRecorder.state === 'recording') {\n return;\n }\n invariant(this._onChunk, 'MediaStreamRecorder: onChunk is not set');\n this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);\n this._mediaRecorder.start(this._config.interval);\n }\n\n async stop(): Promise<void> {\n if (this._mediaRecorder?.state !== 'recording') {\n return;\n }\n this._mediaRecorder.stop();\n }\n\n @synchronized\n private async _ondataavailable(event: IBlobEvent): Promise<void> {\n const blob = event.data;\n const uint8Array = new Uint8Array(await blob.arrayBuffer());\n\n // First chunk from the MediaRecorder has a header.\n const isHeader =\n uint8Array[0] === 0x52 && // R\n uint8Array[1] === 0x49 && // I\n uint8Array[2] === 0x46 && // F\n uint8Array[3] === 0x46; // F\n let wav: WaveFile;\n\n if (isHeader) {\n wav = new WaveFile(uint8Array);\n this._header = uint8Array.slice(0, 44);\n } else if (this._header) {\n wav = new WaveFile(new Uint8Array([...this._header, ...uint8Array]));\n } else {\n log.warn('MediaStreamRecorder: no header');\n return;\n }\n\n this._onChunk!({\n timestamp: Date.now(),\n data: wav.getSamples(),\n });\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { WaveFile } from 'wavefile';\n\nimport { DeferredTask, Trigger } from '@dxos/async';\nimport { type Context, LifecycleState, Resource } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { type DataType } from '@dxos/schema';\nimport { trace } from '@dxos/tracing';\n\nimport { type AudioRecorder, type AudioChunk } from './audio-recorder';\nimport { TRANSCRIPTION_URL } from '../types';\nimport { mergeFloat64Arrays } from '../util';\n\ntype WhisperWord = {\n word: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n};\n\ntype WhisperSegment = {\n text: string;\n\n /**\n * Time in seconds from the start of the audio.\n */\n start: number;\n\n /**\n * Time in seconds from the start of the audio.\n */\n end: number;\n\n /**\n * Probability of no speech in the segment.\n */\n no_speech_prob: number;\n\n words: WhisperWord[];\n};\n\nexport type TranscribeConfig = {\n /**\n * Number of chunks to transcribe automatically after.\n */\n transcribeAfterChunksAmount: number;\n\n /**\n * Number of chunks to save before the user starts speaking.\n * This is needed to catch the beginning of the user's speech.\n */\n prefixBufferChunksAmount: number;\n};\n\nexport type TranscriberParams = {\n config: TranscribeConfig;\n recorder: AudioRecorder;\n /**\n * Callback to handle the transcribed segments, after all segment transformers are applied.\n * @param segments - The transcribed segments.\n */\n onSegments: (segments: DataType.MessageBlock.Transcription[]) => Promise<void>;\n};\n\n/**\n * Handles transcription of audio chunks.\n * If user is not speaking, the last `minChunksAmount` chunks are saved and transcribed.\n * If user is speaking, the chunks are added to the buffer until the user is done talking.\n */\nexport class Transcriber extends Resource {\n private _audioChunks: AudioChunk[] = [];\n private _lastUsedTimestamp = 0;\n\n private readonly _openTrigger = new Trigger({ autoReset: true });\n\n private readonly _config: TranscribeConfig;\n private readonly _recorder: AudioRecorder;\n private readonly _onSegments: TranscriberParams['onSegments'];\n\n private _recording = false;\n private _transcribeTask?: DeferredTask = undefined;\n\n constructor({ config, recorder, onSegments }: TranscriberParams) {\n super();\n this._config = config;\n this._recorder = recorder;\n this._onSegments = onSegments;\n }\n\n protected override async _open(ctx: Context): Promise<void> {\n log.info('opening');\n this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));\n await this._recorder.start();\n this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());\n this._openTrigger.wake();\n }\n\n protected override async _close(): Promise<void> {\n log.info('closing');\n this._recording = false;\n this._transcribeTask = undefined;\n await this._recorder.stop();\n }\n\n startChunksRecording(): void {\n log.info('starting');\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n\n this._recording = true;\n }\n\n stopChunksRecording(): void {\n if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {\n return;\n }\n\n this._recording = false;\n this._transcribeTask?.schedule();\n log.info('stopped');\n }\n\n private _saveAudioChunk(chunk: AudioChunk): void {\n log('saving audio chunk', { chunk });\n this._audioChunks.push(chunk);\n\n // Clean the buffer if the user is not speaking and the transcription task is not scheduled.\n if (\n !this._recording &&\n (!this._transcribeTask || !this._transcribeTask.scheduled) &&\n this._audioChunks.length >= this._config.prefixBufferChunksAmount\n ) {\n this._audioChunks = this._dropOldChunks();\n } else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {\n this._transcribeTask?.schedule();\n }\n }\n\n private async _transcribe(): Promise<void> {\n log('transcribing', { chunks: this._audioChunks.length });\n const chunks = this._audioChunks;\n this._audioChunks = this._dropOldChunks();\n if (chunks.length === 0) {\n return;\n }\n\n const audio = await this._mergeAudioChunks(chunks);\n const segments = await this._fetchTranscription(audio);\n if (!Array.isArray(segments) || segments.length === 0) {\n return;\n }\n\n const alignedSegments = this._alignSegments(segments, chunks);\n if (alignedSegments.length > 0) {\n await this._onSegments(alignedSegments);\n }\n }\n\n private _dropOldChunks(): AudioChunk[] {\n return this._config.prefixBufferChunksAmount > 0\n ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount)\n : [];\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _mergeAudioChunks(chunks: AudioChunk[]): Promise<string> {\n const file = new WaveFile();\n const wavConfig = this._recorder.wavConfig;\n\n file.fromScratch(\n wavConfig.channels,\n wavConfig.sampleRate,\n wavConfig.bitDepthCode,\n mergeFloat64Arrays(chunks.map(({ data }) => data)),\n );\n\n return file.toBase64();\n }\n\n @trace.span({ showInBrowserTimeline: true })\n private async _fetchTranscription(audio: string): Promise<WhisperSegment[]> {\n if (audio.length === 0) {\n this._audioChunks = [];\n throw new Error('No audio to send for transcribing');\n }\n\n const response = await fetch(`${TRANSCRIPTION_URL}/transcribe`, {\n method: 'POST',\n body: JSON.stringify({ audio }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n this._audioChunks = [];\n throw new Error(`Transcription failed: ${response.statusText}`);\n }\n\n const { segments } = (await response.json()) as {\n segments: WhisperSegment[];\n };\n\n log.info('transcription response', {\n segments: segments.length,\n string: segments.map((segments) => segments.text).join(' '),\n });\n\n return segments;\n }\n\n private _alignSegments(\n segments: WhisperSegment[],\n originalChunks: AudioChunk[],\n ): DataType.MessageBlock.Transcription[] {\n // Absolute zero for all relative timestamps in the segments.\n const zeroTimestamp = originalChunks.at(0)!.timestamp;\n\n const filteredSegments = segments\n // Use segments that end after the last used timestamp.\n // Segments could overlap, so we need to filter words that starts after the last used timestamp.\n .filter((segment) => zeroTimestamp + segment.end * 1_000 >= this._lastUsedTimestamp)\n // Use words that starts after the last used timestamp.\n .map((segment) => {\n const words = segment.words.filter((word) => zeroTimestamp + word.start * 1_000 >= this._lastUsedTimestamp);\n return {\n ...segment,\n words,\n text: words.map((word) => word.word).join(''),\n start: words.at(0)?.start ?? segment.end,\n };\n })\n .filter((segment) => segment.words.length > 0);\n\n if (filteredSegments.length === 0) {\n return [];\n }\n\n // Update last timestamp.\n this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1)!.end * 1_000;\n\n // Add absolute timestamp to each segment.\n return filteredSegments.map((segment) => ({\n type: 'transcription',\n started: new Date(zeroTimestamp + segment.start * 1_000).toISOString(),\n text: segment.text.trim(),\n }));\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nexport const mergeFloat64Arrays = (arrays: Float64Array[]) => {\n const newArray = new Float64Array(arrays.reduce((acc, array) => array.length + acc, 0));\n let offset = 0;\n for (const array of arrays) {\n newArray.set(array, offset);\n offset += array.length;\n }\n\n return newArray;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { signal } from '@preact/signals-core';\n\nimport { synchronized } from '@dxos/async';\nimport { Resource } from '@dxos/context';\nimport { type Queue } from '@dxos/echo-db';\nimport { create } from '@dxos/echo-schema';\nimport { type EdgeHttpClient } from '@dxos/react-edge-client';\nimport { DataType } from '@dxos/schema';\n\nimport { MediaStreamRecorder } from './media-stream-recorder';\nimport { Transcriber } from './transcriber';\n\n/**\n * Length of the chunk in ms.\n */\nconst RECORD_INTERVAL = 200;\n\n/**\n * Number of chunks to save before the user starts speaking.\n */\nconst PREFIXED_CHUNKS_AMOUNT = 10;\n\n/**\n * Number of chunks to transcribe automatically after.\n * Combined should be mess than 25MB or whisper would fail.\n */\nconst TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;\n\nexport type TranscriptMessageEnricher = (message: DataType.Message) => Promise<DataType.Message>;\n\nexport type TranscriptionManagerOptions = {\n edgeClient: EdgeHttpClient;\n\n /**\n * Enrich the message before it is written to the transcription queue.\n */\n messageEnricher?: TranscriptMessageEnricher;\n};\n\n/**\n * Manages transcription state for a meeting.\n */\nexport class TranscriptionManager extends Resource {\n private readonly _edgeClient: EdgeHttpClient;\n private readonly _messageEnricher?: TranscriptMessageEnricher;\n private _audioStreamTrack?: MediaStreamTrack = undefined;\n private _identityDid?: string = undefined;\n private _mediaRecorder?: MediaStreamRecorder = undefined;\n private _transcriber?: Transcriber = undefined;\n private _queue?: Queue<DataType.Message> = undefined;\n private _enabled = signal(false);\n\n constructor(options: TranscriptionManagerOptions) {\n super();\n this._edgeClient = options.edgeClient;\n this._messageEnricher = options.messageEnricher;\n }\n\n /** @reactive */\n get enabled() {\n return this._enabled.value;\n }\n\n setQueue(queue: Queue<DataType.Message>): this {\n this._queue = queue;\n return this;\n }\n\n setIdentityDid(did: string): this {\n if (this._identityDid !== did) {\n this._identityDid = did;\n }\n return this;\n }\n\n setRecording(recording?: boolean): this {\n if (!this.isOpen || !this._enabled.value) {\n return this;\n }\n\n if (recording) {\n this._transcriber?.startChunksRecording();\n } else {\n this._transcriber?.stopChunksRecording();\n }\n return this;\n }\n\n /**\n * Enable or disable transcription.\n * @param enabled - Whether to enable transcription.\n */\n @synchronized\n async setEnabled(enabled?: boolean): Promise<void> {\n if (this._enabled.value === enabled) {\n return;\n }\n\n this._enabled.value = enabled ?? false;\n // TODO(burdon): Why is toggle called here?\n this.isOpen && (await this._toggleTranscriber());\n }\n\n @synchronized\n async setAudioTrack(track?: MediaStreamTrack): Promise<void> {\n if (this._audioStreamTrack === track) {\n return;\n }\n\n this._audioStreamTrack = track;\n this.isOpen && (await this._toggleTranscriber());\n }\n\n protected override async _open(): Promise<void> {\n await this._toggleTranscriber();\n }\n\n protected override async _close(): Promise<void> {\n void this._transcriber?.close();\n }\n\n // TODO(burdon): Change this to setEnables (explicit), not toggle.\n private async _toggleTranscriber(): Promise<void> {\n await this._maybeReinitTranscriber();\n\n // Open or close transcriber if transcription is enabled or disabled.\n if (this._enabled.value) {\n await this._transcriber?.open();\n // TODO(burdon): Started and stopped blocks appear twice.\n const block = create(DataType.Message, {\n created: new Date().toISOString(),\n blocks: [{ type: 'transcription', text: 'Started', started: new Date().toISOString() }],\n sender: { role: 'assistant' },\n });\n this._queue?.append([block]);\n } else {\n await this._transcriber?.close();\n const block = create(DataType.Message, {\n created: new Date().toISOString(),\n blocks: [{ type: 'transcription', text: 'Stopped', started: new Date().toISOString() }],\n sender: { role: 'assistant' },\n });\n this._queue?.append([block]);\n }\n }\n\n private async _maybeReinitTranscriber(): Promise<void> {\n if (!this._audioStreamTrack || !this._enabled.value) {\n return;\n }\n\n // Reinitialize transcriber if queue or media stream track has changed.\n let needReinit = false;\n if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {\n this._mediaRecorder = new MediaStreamRecorder({\n mediaStreamTrack: this._audioStreamTrack,\n config: { interval: RECORD_INTERVAL },\n });\n needReinit = true;\n }\n if (needReinit) {\n await this._transcriber?.close();\n this._transcriber = new Transcriber({\n config: {\n transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,\n prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,\n },\n recorder: this._mediaRecorder,\n onSegments: (segments) => this._onSegments(segments),\n });\n }\n }\n\n private async _onSegments(segments: DataType.MessageBlock.Transcription[]): Promise<void> {\n if (!this.isOpen || !this._queue) {\n return;\n }\n\n let block = create(DataType.Message, {\n created: new Date().toISOString(),\n blocks: segments,\n sender: { identityDid: this._identityDid },\n });\n\n if (this._messageEnricher) {\n block = await this._messageEnricher(block);\n }\n\n this._queue.append([block]);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_wavefile", "import_async", "import_log", "import_tracing", "import_context", "initializingPromise", "initializeExtendableMediaRecorder", "connect", "register", "MediaStreamRecorder", "mediaStreamTrack", "config", "_mediaRecorder", "undefined", "_header", "_mediaStreamTrack", "_config", "wavConfig", "settings", "getSettings", "channels", "channelCount", "sampleRate", "bitDepthCode", "sampleSize", "String", "setOnChunk", "onChunk", "_onChunk", "start", "catch", "err", "log", "info", "stream", "MediaStream", "MediaRecorder", "mimeType", "state", "invariant", "ondataavailable", "event", "_ondataavailable", "interval", "stop", "blob", "data", "uint8Array", "Uint8Array", "arrayBuffer", "isHeader", "wav", "WaveFile", "slice", "warn", "timestamp", "Date", "now", "getSamples", "resource", "mergeFloat64Arrays", "arrays", "newArray", "Float64Array", "reduce", "acc", "array", "length", "offset", "set", "Transcriber", "Resource", "recorder", "onSegments", "_audioChunks", "_lastUsedTimestamp", "_openTrigger", "Trigger", "autoReset", "_recording", "_transcribeTask", "_recorder", "_onSegments", "_open", "ctx", "chunk", "_saveAudioChunk", "DeferredTask", "_transcribe", "wake", "_close", "startChunksRecording", "_lifecycleState", "LifecycleState", "OPEN", "stopChunksRecording", "schedule", "push", "scheduled", "prefixBufferChunksAmount", "_dropOldChunks", "transcribeAfterChunksAmount", "chunks", "audio", "_mergeAudioChunks", "segments", "_fetchTranscription", "Array", "isArray", "alignedSegments", "_alignSegments", "file", "fromScratch", "map", "toBase64", "Error", "response", "fetch", "TRANSCRIPTION_URL", "method", "body", "JSON", "stringify", "headers", "ok", "statusText", "json", "string", "text", "join", "originalChunks", "zeroTimestamp", "at", "filteredSegments", "filter", "segment", "end", "words", "word", "type", "started", "toISOString", "trim", "span", "showInBrowserTimeline", "RECORD_INTERVAL", "PREFIXED_CHUNKS_AMOUNT", "TRANSCRIBE_AFTER_CHUNKS_AMOUNT", "TranscriptionManager", "options", "_audioStreamTrack", "_identityDid", "_transcriber", "_queue", "_enabled", "signal", "_edgeClient", "edgeClient", "_messageEnricher", "messageEnricher", "enabled", "value", "setQueue", "queue", "setIdentityDid", "did", "setRecording", "recording", "isOpen", "setEnabled", "_toggleTranscriber", "setAudioTrack", "track", "close", "_maybeReinitTranscriber", "open", "block", "create", "DataType", "Message", "created", "blocks", "sender", "role", "append", "needReinit", "identityDid"]
7
+ }