@remotion/studio 4.0.521 → 4.0.523

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 (264) hide show
  1. package/dist/api/install-package.js +4 -2
  2. package/dist/components/AssetAudioVolume.d.ts +5 -0
  3. package/dist/components/AssetAudioVolume.js +33 -0
  4. package/dist/components/Canvas.js +5 -6
  5. package/dist/components/CanvasIfSizeIsAvailable.js +7 -0
  6. package/dist/components/CaptionInspector.js +74 -20
  7. package/dist/components/CheckboardToggle.js +8 -6
  8. package/dist/components/Checkbox.d.ts +1 -0
  9. package/dist/components/Checkbox.js +2 -2
  10. package/dist/components/CompositionContextButton.js +4 -1
  11. package/dist/components/CompositionSelectorItem.js +2 -2
  12. package/dist/components/ConfigureLicenseModal.js +1 -1
  13. package/dist/components/CopyButton.js +7 -14
  14. package/dist/components/CurrentAsset.js +40 -6
  15. package/dist/components/Editor.js +6 -5
  16. package/dist/components/EditorContent.js +1 -1
  17. package/dist/components/EditorContexts.js +3 -1
  18. package/dist/components/ElementInstallConfirmation.js +290 -136
  19. package/dist/components/FixComputedValueModal.js +56 -16
  20. package/dist/components/FullscreenToggle.js +9 -8
  21. package/dist/components/GlobalKeybindings.js +50 -49
  22. package/dist/components/HighlightedElementSource.d.ts +5 -0
  23. package/dist/components/HighlightedElementSource.js +78 -0
  24. package/dist/components/InspectorLocationCopy.js +10 -5
  25. package/dist/components/InspectorPanel/MultiSequenceField.d.ts +12 -0
  26. package/dist/components/InspectorPanel/MultiSequenceField.js +131 -0
  27. package/dist/components/InspectorPanel/MultiSequenceInspector.d.ts +8 -0
  28. package/dist/components/InspectorPanel/MultiSequenceInspector.js +102 -0
  29. package/dist/components/InspectorPanel/MultiSequenceNumberField.d.ts +9 -0
  30. package/dist/components/InspectorPanel/MultiSequenceNumberField.js +88 -0
  31. package/dist/components/InspectorPanel.js +4 -0
  32. package/dist/components/InspectorSequenceSection.js +64 -1
  33. package/dist/components/InstallPackage.js +4 -5
  34. package/dist/components/KeyboardShortcutsSettings.js +212 -33
  35. package/dist/components/MenuBuildIndicator.js +7 -2
  36. package/dist/components/MenuCompositionName.js +62 -6
  37. package/dist/components/MenuToolbar.js +7 -5
  38. package/dist/components/ModalContainer.d.ts +1 -0
  39. package/dist/components/ModalContainer.js +2 -2
  40. package/dist/components/Modals.js +3 -1
  41. package/dist/components/ModelManager.d.ts +16 -0
  42. package/dist/components/ModelManager.js +200 -0
  43. package/dist/components/ModelsSettings.d.ts +2 -0
  44. package/dist/components/ModelsSettings.js +133 -0
  45. package/dist/components/NewComposition/DismissableModal.d.ts +1 -0
  46. package/dist/components/NewComposition/DismissableModal.js +2 -2
  47. package/dist/components/NewComposition/InputDragger.d.ts +2 -2
  48. package/dist/components/NewComposition/InputDragger.js +6 -6
  49. package/dist/components/NewComposition/NewFolder.js +11 -8
  50. package/dist/components/NewComposition/RenameFolder.js +17 -10
  51. package/dist/components/OptionalPackageModal.d.ts +11 -0
  52. package/dist/components/OptionalPackageModal.js +155 -0
  53. package/dist/components/PlayPause.js +4 -8
  54. package/dist/components/PlaybackKeyboardShortcutsManager.js +3 -6
  55. package/dist/components/PreviewToolbarOverflowButton.js +11 -2
  56. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +5 -2
  57. package/dist/components/RadioButton.d.ts +1 -0
  58. package/dist/components/RadioButton.js +2 -2
  59. package/dist/components/RenderButton.js +5 -1
  60. package/dist/components/RenderModal/CliCopyButton.js +13 -27
  61. package/dist/components/RenderModal/NumberSetting.d.ts +6 -1
  62. package/dist/components/RenderModal/NumberSetting.js +2 -2
  63. package/dist/components/RenderModal/RenderModalBasic.js +1 -1
  64. package/dist/components/RenderModal/RenderModalOutputName.d.ts +3 -1
  65. package/dist/components/RenderModal/RenderModalOutputName.js +4 -4
  66. package/dist/components/RenderModal/SeparateAudioOption.js +1 -1
  67. package/dist/components/RenderModal/WebRenderModalBasic.js +1 -1
  68. package/dist/components/RenderQueue/CaptionQueueItem.d.ts +6 -0
  69. package/dist/components/RenderQueue/CaptionQueueItem.js +129 -0
  70. package/dist/components/RenderQueue/CaptionQueueProcessor.d.ts +1 -0
  71. package/dist/components/RenderQueue/CaptionQueueProcessor.js +110 -0
  72. package/dist/components/RenderQueue/CaptionQueueProcessorLoader.d.ts +2 -0
  73. package/dist/components/RenderQueue/CaptionQueueProcessorLoader.js +54 -0
  74. package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +7 -4
  75. package/dist/components/RenderQueue/RenderQueueItem.js +3 -3
  76. package/dist/components/RenderQueue/VideoMattingQueueItem.d.ts +6 -0
  77. package/dist/components/RenderQueue/VideoMattingQueueItem.js +129 -0
  78. package/dist/components/RenderQueue/VideoMattingQueueProcessor.d.ts +1 -0
  79. package/dist/components/RenderQueue/VideoMattingQueueProcessor.js +105 -0
  80. package/dist/components/RenderQueue/VideoMattingQueueProcessorLoader.d.ts +2 -0
  81. package/dist/components/RenderQueue/VideoMattingQueueProcessorLoader.js +54 -0
  82. package/dist/components/RenderQueue/caption-job-types.d.ts +47 -0
  83. package/dist/components/RenderQueue/caption-job-types.js +7 -0
  84. package/dist/components/RenderQueue/context.d.ts +16 -0
  85. package/dist/components/RenderQueue/context.js +224 -11
  86. package/dist/components/RenderQueue/index.js +34 -10
  87. package/dist/components/RenderQueue/item-style.d.ts +1 -0
  88. package/dist/components/RenderQueue/item-style.js +2 -1
  89. package/dist/components/RenderQueue/load-model-for-job.d.ts +11 -0
  90. package/dist/components/RenderQueue/load-model-for-job.js +14 -0
  91. package/dist/components/RenderQueue/video-matting-job-types.d.ts +38 -0
  92. package/dist/components/RenderQueue/video-matting-job-types.js +5 -0
  93. package/dist/components/RendersTab.js +4 -4
  94. package/dist/components/SegmentedControl.d.ts +2 -2
  95. package/dist/components/SegmentedControl.js +38 -13
  96. package/dist/components/SelectedOutlinePolygon.js +8 -2
  97. package/dist/components/SettingsButton.d.ts +4 -0
  98. package/dist/components/SettingsButton.js +49 -0
  99. package/dist/components/SettingsModal.d.ts +1 -1
  100. package/dist/components/SettingsModal.js +3 -1
  101. package/dist/components/ShowOutlinesProvider.js +12 -0
  102. package/dist/components/SidebarCollapserControls.js +21 -16
  103. package/dist/components/SizeSelector.js +10 -2
  104. package/dist/components/SkillsSettings.js +11 -8
  105. package/dist/components/SnappingToggle.js +5 -2
  106. package/dist/components/Splitter/SplitterContainer.js +63 -10
  107. package/dist/components/Splitter/SplitterContext.d.ts +3 -0
  108. package/dist/components/Splitter/SplitterContext.js +5 -1
  109. package/dist/components/Splitter/SplitterElement.js +11 -2
  110. package/dist/components/Splitter/SplitterHandle.d.ts +1 -0
  111. package/dist/components/Splitter/SplitterHandle.js +55 -25
  112. package/dist/components/Tabs/vertical.d.ts +1 -0
  113. package/dist/components/Tabs/vertical.js +2 -2
  114. package/dist/components/TimeValue.js +2 -3
  115. package/dist/components/Timeline/SequencePropsObserver.js +4 -0
  116. package/dist/components/Timeline/SubscribeToNodePaths.d.ts +2 -1
  117. package/dist/components/Timeline/SubscribeToNodePaths.js +2 -1
  118. package/dist/components/Timeline/Timeline.js +17 -46
  119. package/dist/components/Timeline/TimelineClipboardKeybindings.js +2 -4
  120. package/dist/components/Timeline/TimelineDeleteKeybindings.js +3 -18
  121. package/dist/components/Timeline/TimelineDragHandler.js +11 -6
  122. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +1 -0
  123. package/dist/components/Timeline/TimelinePinchZoom.js +6 -30
  124. package/dist/components/Timeline/TimelinePlayCursorSyncer.js +1 -7
  125. package/dist/components/Timeline/TimelineRowChrome.js +11 -3
  126. package/dist/components/Timeline/TimelineSchemaField.js +8 -4
  127. package/dist/components/Timeline/TimelineSelection.d.ts +2 -0
  128. package/dist/components/Timeline/TimelineSelection.js +55 -2
  129. package/dist/components/Timeline/TimelineSequence.js +148 -25
  130. package/dist/components/Timeline/TimelineSequenceItem.d.ts +0 -1
  131. package/dist/components/Timeline/TimelineSequenceItem.js +220 -112
  132. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +35 -5
  133. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +233 -138
  134. package/dist/components/Timeline/TimelineSlider.js +1 -4
  135. package/dist/components/Timeline/TimelineTimeIndicators.js +1 -0
  136. package/dist/components/Timeline/TimelineWidthProvider.js +2 -5
  137. package/dist/components/Timeline/TimelineZoomControls.js +20 -20
  138. package/dist/components/Timeline/get-sequence-split-menu-item.d.ts +11 -0
  139. package/dist/components/Timeline/get-sequence-split-menu-item.js +55 -0
  140. package/dist/components/Timeline/use-asset-timeline-context-menu.d.ts +2 -0
  141. package/dist/components/Timeline/use-asset-timeline-context-menu.js +52 -0
  142. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -2
  143. package/dist/components/Timeline/use-sequence-props-subscription.js +4 -10
  144. package/dist/components/TimelineInOutToggle.js +20 -17
  145. package/dist/components/TopPanel.js +3 -19
  146. package/dist/components/Transcription/LazyModels.d.ts +1 -0
  147. package/dist/components/Transcription/LazyModels.js +5 -0
  148. package/dist/components/Transcription/Models.d.ts +6 -0
  149. package/dist/components/Transcription/Models.js +18 -0
  150. package/dist/components/Transcription/TranscriptionModal.d.ts +3 -0
  151. package/dist/components/Transcription/TranscriptionModal.js +428 -0
  152. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.d.ts +5 -0
  153. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.js +48 -0
  154. package/dist/components/Transcription/caption-output-name.d.ts +2 -0
  155. package/dist/components/Transcription/caption-output-name.js +10 -0
  156. package/dist/components/Transcription/resample-media-to-16-khz.d.ts +6 -0
  157. package/dist/components/Transcription/resample-media-to-16-khz.js +82 -0
  158. package/dist/components/Transcription/whisper-languages.d.ts +2 -0
  159. package/dist/components/Transcription/whisper-languages.js +104 -0
  160. package/dist/components/Transcription/whisper-webgpu-capability.d.ts +2 -0
  161. package/dist/components/Transcription/whisper-webgpu-capability.js +7 -0
  162. package/dist/components/UndoRedoButtons.js +13 -38
  163. package/dist/components/UpdatesSettings.js +17 -17
  164. package/dist/components/VideoMatting/LazyModels.d.ts +1 -0
  165. package/dist/components/VideoMatting/LazyModels.js +5 -0
  166. package/dist/components/VideoMatting/Models.d.ts +6 -0
  167. package/dist/components/VideoMatting/Models.js +18 -0
  168. package/dist/components/VideoMatting/VideoMattingModal.d.ts +3 -0
  169. package/dist/components/VideoMatting/VideoMattingModal.js +207 -0
  170. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.d.ts +5 -0
  171. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.js +46 -0
  172. package/dist/components/VideoMatting/video-matting-capability.d.ts +2 -0
  173. package/dist/components/VideoMatting/video-matting-capability.js +7 -0
  174. package/dist/components/WebMcp.js +439 -22
  175. package/dist/components/ZoomPersistor.js +6 -3
  176. package/dist/components/composition-menu-items.js +1 -1
  177. package/dist/components/import-assets.d.ts +3 -2
  178. package/dist/components/import-assets.js +5 -9
  179. package/dist/components/keyboard-shortcuts.d.ts +17 -1
  180. package/dist/components/keyboard-shortcuts.js +177 -89
  181. package/dist/components/public-output-name.d.ts +5 -0
  182. package/dist/components/public-output-name.js +60 -0
  183. package/dist/components/use-model-cache-status.d.ts +7 -0
  184. package/dist/components/use-model-cache-status.js +35 -0
  185. package/dist/esm/CaptionQueueProcessor-k0yrm3dj.mjs +211 -0
  186. package/dist/esm/HighlightedElementSource-jfc66k4p.mjs +1236 -0
  187. package/dist/esm/LazyModels-2trdm224.mjs +11 -0
  188. package/dist/esm/LazyModels-fjb5ckaq.mjs +11 -0
  189. package/dist/esm/TranscriptionModal-916jqhry.mjs +1011 -0
  190. package/dist/esm/VideoMattingModal-2tm79s9b.mjs +374 -0
  191. package/dist/esm/VideoMattingQueueProcessor-t1hgm2rm.mjs +109 -0
  192. package/dist/esm/index-1x7bsdh6.mjs +261 -0
  193. package/dist/esm/index-3hgr6gjx.mjs +41 -0
  194. package/dist/esm/index-5qddp5h7.mjs +36 -0
  195. package/dist/esm/index-5zrb1ft4.mjs +39 -0
  196. package/dist/esm/index-6cvm9a65.mjs +45923 -0
  197. package/dist/esm/index-7tt71e8n.mjs +36 -0
  198. package/dist/esm/index-9x6e1dq0.mjs +428 -0
  199. package/dist/esm/index-cw0pnpg5.mjs +50 -0
  200. package/dist/esm/index-czwvnn9g.mjs +35 -0
  201. package/dist/esm/index-hy4xcgty.mjs +1366 -0
  202. package/dist/esm/{chunk-je0h1bgt.js → index-jg13hf2g.mjs} +3 -1
  203. package/dist/esm/{chunk-6jf1natv.js → index-rcv7qkt5.mjs} +18 -1
  204. package/dist/esm/index-sgtmgc4h.mjs +423 -0
  205. package/dist/esm/index-te66vvrp.mjs +142 -0
  206. package/dist/esm/index-v4tr1bft.mjs +20 -0
  207. package/dist/esm/index-x7t2y7ws.mjs +54194 -0
  208. package/dist/esm/index-xhe2m2qr.mjs +1146 -0
  209. package/dist/esm/index.mjs +45 -933
  210. package/dist/esm/internals.mjs +13 -114127
  211. package/dist/esm/previewEntry.mjs +387 -114784
  212. package/dist/esm/renderEntry.mjs +3 -3
  213. package/dist/esm/{chunk-m0jqdbkr.js → resolve-composition-component-location-14148845.mjs} +1 -1
  214. package/dist/helpers/copy-text.js +1 -2
  215. package/dist/helpers/drag-aware-double-click.d.ts +2 -1
  216. package/dist/helpers/drag-aware-double-click.js +12 -1
  217. package/dist/helpers/get-asset-metadata.d.ts +1 -0
  218. package/dist/helpers/get-asset-metadata.js +4 -0
  219. package/dist/helpers/hoverable.js +8 -0
  220. package/dist/helpers/inject-css.js +2 -0
  221. package/dist/helpers/optional-package-dependencies.d.ts +3 -0
  222. package/dist/helpers/optional-package-dependencies.js +24 -0
  223. package/dist/helpers/pointer-session.d.ts +6 -0
  224. package/dist/helpers/pointer-session.js +36 -14
  225. package/dist/helpers/prism-tomorrow.d.ts +1 -0
  226. package/dist/helpers/prism-tomorrow.js +151 -0
  227. package/dist/helpers/sequence-node-path-mutations.js +11 -0
  228. package/dist/helpers/slugify-name.d.ts +1 -0
  229. package/dist/helpers/slugify-name.js +14 -0
  230. package/dist/helpers/studio-runtime-config.d.ts +1 -0
  231. package/dist/helpers/studio-runtime-config.js +6 -1
  232. package/dist/helpers/use-copy-feedback.d.ts +4 -0
  233. package/dist/helpers/use-copy-feedback.js +19 -0
  234. package/dist/helpers/use-keybinding.d.ts +9 -3
  235. package/dist/helpers/use-keybinding.js +8 -9
  236. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -0
  237. package/dist/helpers/use-keyboard-shortcut-label.js +15 -0
  238. package/dist/helpers/use-menu-structure.js +58 -13
  239. package/dist/icons/copy.d.ts +5 -0
  240. package/dist/icons/copy.js +12 -0
  241. package/dist/icons/input-props.d.ts +1 -1
  242. package/dist/icons/input-props.js +2 -2
  243. package/dist/icons/models.d.ts +4 -0
  244. package/dist/icons/models.js +7 -0
  245. package/dist/icons/separation.d.ts +4 -0
  246. package/dist/icons/separation.js +7 -0
  247. package/dist/icons/transcription.d.ts +4 -0
  248. package/dist/icons/transcription.js +7 -0
  249. package/dist/icons/upload.js +1 -1
  250. package/dist/state/canvas-ref.d.ts +1 -0
  251. package/dist/state/canvas-ref.js +2 -1
  252. package/dist/state/modals.d.ts +14 -2
  253. package/dist/state/sidebar.d.ts +3 -0
  254. package/dist/state/sidebar.js +6 -1
  255. package/dist/state/timeline-zoom.d.ts +1 -1
  256. package/dist/state/timeline-zoom.js +3 -3
  257. package/dist/visual-controls/VisualControls.js +4 -0
  258. package/package.json +34 -20
  259. package/dist/components/UpdateCheck.d.ts +0 -1
  260. package/dist/components/UpdateCheck.js +0 -79
  261. package/dist/esm/chunk-emw4k5b0.js +0 -99527
  262. package/dist/esm/chunk-vkrvnx2h.js +0 -99378
  263. package/dist/helpers/use-max-media-duration.d.ts +0 -2
  264. package/dist/helpers/use-max-media-duration.js +0 -61
@@ -0,0 +1,1011 @@
1
+ import {
2
+ useModelCacheStatus
3
+ } from "./index-7tt71e8n.mjs";
4
+ import {
5
+ GearIcon,
6
+ NumberSetting,
7
+ getDefaultCaptionOutputName,
8
+ validateCaptionOutputName
9
+ } from "./index-sgtmgc4h.mjs";
10
+ import {
11
+ Button,
12
+ Checkbox,
13
+ Checkmark,
14
+ Combobox,
15
+ DismissableModal,
16
+ ExpandedFolderIconSolid,
17
+ InfoBubble,
18
+ ModalHeader,
19
+ ModelsIcon,
20
+ RemotionInput,
21
+ RenderModalHr,
22
+ SetSelectedModalContext,
23
+ SidebarContext,
24
+ TranscriptionIcon,
25
+ VerticalTab,
26
+ getFileManagerName,
27
+ input,
28
+ label,
29
+ optionRow,
30
+ optionsSidebarTabs,
31
+ persistSelectedOptionsSidebarPanel,
32
+ rightRow,
33
+ showNotification,
34
+ useStaticFiles
35
+ } from "./index-6cvm9a65.mjs";
36
+ import {
37
+ RenderQueueContext
38
+ } from "./index-9x6e1dq0.mjs";
39
+ import {
40
+ openInFileExplorer
41
+ } from "./index-hy4xcgty.mjs";
42
+ import {
43
+ getBrowserStudioOperations
44
+ } from "./index-cw0pnpg5.mjs";
45
+ import {
46
+ Models
47
+ } from "./index-5qddp5h7.mjs";
48
+ import"./index-1x7bsdh6.mjs";
49
+ import {
50
+ InlineAction,
51
+ Spacing,
52
+ VERTICAL_SCROLLBAR_CLASSNAME,
53
+ ValidationMessage,
54
+ buttonStyle,
55
+ container,
56
+ flexer,
57
+ horizontalLayout,
58
+ horizontalTab,
59
+ icon,
60
+ iconContainer,
61
+ leftSidebar,
62
+ optionsPanel,
63
+ outerModalStyle
64
+ } from "./index-xhe2m2qr.mjs";
65
+ import"./index-5zrb1ft4.mjs";
66
+ import {
67
+ BLUE_DISABLED,
68
+ LIGHT_TEXT,
69
+ WHITE
70
+ } from "./index-jg13hf2g.mjs";
71
+ import"./index-rcv7qkt5.mjs";
72
+
73
+ // src/components/Transcription/TranscriptionModal.tsx
74
+ import { formatBytes } from "@remotion/studio-shared";
75
+ import {
76
+ canUseWhisperWebGpu,
77
+ getAvailableModels,
78
+ isWhisperModelCached
79
+ } from "@remotion/whisper-webgpu";
80
+ import {
81
+ useCallback,
82
+ useContext,
83
+ useEffect,
84
+ useMemo,
85
+ useState
86
+ } from "react";
87
+
88
+ // src/components/Transcription/whisper-languages.ts
89
+ var WHISPER_LANGUAGES = [
90
+ ["af", "Afrikaans"],
91
+ ["sq", "Albanian"],
92
+ ["am", "Amharic"],
93
+ ["ar", "Arabic"],
94
+ ["hy", "Armenian"],
95
+ ["as", "Assamese"],
96
+ ["az", "Azerbaijani"],
97
+ ["ba", "Bashkir"],
98
+ ["eu", "Basque"],
99
+ ["be", "Belarusian"],
100
+ ["bn", "Bengali"],
101
+ ["bs", "Bosnian"],
102
+ ["br", "Breton"],
103
+ ["bg", "Bulgarian"],
104
+ ["my", "Burmese"],
105
+ ["ca", "Catalan"],
106
+ ["zh", "Chinese"],
107
+ ["hr", "Croatian"],
108
+ ["cs", "Czech"],
109
+ ["da", "Danish"],
110
+ ["nl", "Dutch"],
111
+ ["en", "English"],
112
+ ["et", "Estonian"],
113
+ ["fo", "Faroese"],
114
+ ["fi", "Finnish"],
115
+ ["fr", "French"],
116
+ ["gl", "Galician"],
117
+ ["ka", "Georgian"],
118
+ ["de", "German"],
119
+ ["el", "Greek"],
120
+ ["gu", "Gujarati"],
121
+ ["ht", "Haitian Creole"],
122
+ ["ha", "Hausa"],
123
+ ["haw", "Hawaiian"],
124
+ ["he", "Hebrew"],
125
+ ["hi", "Hindi"],
126
+ ["hu", "Hungarian"],
127
+ ["is", "Icelandic"],
128
+ ["id", "Indonesian"],
129
+ ["it", "Italian"],
130
+ ["ja", "Japanese"],
131
+ ["jw", "Javanese"],
132
+ ["kn", "Kannada"],
133
+ ["kk", "Kazakh"],
134
+ ["km", "Khmer"],
135
+ ["ko", "Korean"],
136
+ ["lo", "Lao"],
137
+ ["la", "Latin"],
138
+ ["lv", "Latvian"],
139
+ ["ln", "Lingala"],
140
+ ["lt", "Lithuanian"],
141
+ ["lb", "Luxembourgish"],
142
+ ["mk", "Macedonian"],
143
+ ["mg", "Malagasy"],
144
+ ["ms", "Malay"],
145
+ ["ml", "Malayalam"],
146
+ ["mt", "Maltese"],
147
+ ["mi", "Maori"],
148
+ ["mr", "Marathi"],
149
+ ["mn", "Mongolian"],
150
+ ["ne", "Nepali"],
151
+ ["no", "Norwegian"],
152
+ ["nn", "Nynorsk"],
153
+ ["oc", "Occitan"],
154
+ ["ps", "Pashto"],
155
+ ["fa", "Persian"],
156
+ ["pl", "Polish"],
157
+ ["pt", "Portuguese"],
158
+ ["pa", "Punjabi"],
159
+ ["ro", "Romanian"],
160
+ ["ru", "Russian"],
161
+ ["sa", "Sanskrit"],
162
+ ["sr", "Serbian"],
163
+ ["sn", "Shona"],
164
+ ["sd", "Sindhi"],
165
+ ["si", "Sinhala"],
166
+ ["sk", "Slovak"],
167
+ ["sl", "Slovenian"],
168
+ ["so", "Somali"],
169
+ ["es", "Spanish"],
170
+ ["su", "Sundanese"],
171
+ ["sw", "Swahili"],
172
+ ["sv", "Swedish"],
173
+ ["tl", "Tagalog"],
174
+ ["tg", "Tajik"],
175
+ ["ta", "Tamil"],
176
+ ["tt", "Tatar"],
177
+ ["te", "Telugu"],
178
+ ["th", "Thai"],
179
+ ["bo", "Tibetan"],
180
+ ["tr", "Turkish"],
181
+ ["tk", "Turkmen"],
182
+ ["uk", "Ukrainian"],
183
+ ["ur", "Urdu"],
184
+ ["uz", "Uzbek"],
185
+ ["vi", "Vietnamese"],
186
+ ["cy", "Welsh"],
187
+ ["yi", "Yiddish"],
188
+ ["yo", "Yoruba"]
189
+ ];
190
+
191
+ // src/components/Transcription/TranscriptionModal.tsx
192
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
193
+ var TRANSCRIPTION_OUTPUT_MESSAGE_ID = "remotion-transcription-output-message";
194
+ var TRANSCRIPTION_CHUNK_MESSAGE_ID = "remotion-transcription-chunk-message";
195
+ var TRANSCRIPTION_DECODING_MESSAGE_ID = "remotion-transcription-decoding-message";
196
+ var TRANSCRIPTION_TASK_MESSAGE_ID = "remotion-transcription-task-message";
197
+ var DEFAULT_CHUNK_LENGTH_IN_SECONDS = 30;
198
+ var DEFAULT_STRIDE_LENGTH_IN_SECONDS = 5;
199
+ var DEFAULT_TEMPERATURE = 1;
200
+ var DEFAULT_TOP_K = 50;
201
+ var DEFAULT_REPETITION_PENALTY = 1;
202
+ var DEFAULT_NO_REPEAT_NGRAM_SIZE = 0;
203
+ var MAX_CHUNK_LENGTH_IN_SECONDS = 30;
204
+ var AVAILABLE_MODELS = getAvailableModels();
205
+ var settingsPanel = {
206
+ ...optionsPanel,
207
+ flexDirection: "column",
208
+ paddingTop: 16
209
+ };
210
+ var advancedPanel = {
211
+ ...settingsPanel,
212
+ paddingTop: 0
213
+ };
214
+ var transcriptionModalStyle = {
215
+ ...outerModalStyle,
216
+ outline: "none"
217
+ };
218
+ var transcriptionLayout = {
219
+ ...horizontalLayout,
220
+ flex: "1 1 auto"
221
+ };
222
+ var controlStyle = {
223
+ width: 330,
224
+ maxWidth: "100%"
225
+ };
226
+ var nestedLabelStyle = {
227
+ color: "inherit",
228
+ fontFamily: "inherit",
229
+ fontSize: "inherit",
230
+ lineHeight: "inherit"
231
+ };
232
+ var taskMessageRow = {
233
+ display: "flex",
234
+ justifyContent: "flex-end",
235
+ padding: "0 16px 8px"
236
+ };
237
+ var outputRow = {
238
+ display: "flex",
239
+ flexDirection: "row",
240
+ alignItems: "flex-start",
241
+ paddingLeft: 16,
242
+ paddingRight: 16,
243
+ paddingTop: 4,
244
+ paddingBottom: 12
245
+ };
246
+ var outputRightRow = {
247
+ display: "flex",
248
+ flex: 1,
249
+ flexDirection: "row",
250
+ alignItems: "flex-start",
251
+ justifyContent: "flex-end",
252
+ minWidth: 0
253
+ };
254
+ var tooltipContent = {
255
+ color: LIGHT_TEXT,
256
+ fontSize: 13,
257
+ lineHeight: 1.5,
258
+ maxWidth: 360,
259
+ padding: 12
260
+ };
261
+ var tooltipInlineCode = {
262
+ color: WHITE,
263
+ fontFamily: "monospace",
264
+ fontSize: "inherit",
265
+ lineHeight: "inherit"
266
+ };
267
+ var hiddenPanel = {
268
+ display: "none"
269
+ };
270
+ var existsMessageStyle = {
271
+ display: "inline-flex",
272
+ alignItems: "center",
273
+ minWidth: 0,
274
+ fontFamily: "sans-serif",
275
+ fontSize: 13,
276
+ lineHeight: "18px",
277
+ color: WHITE,
278
+ whiteSpace: "nowrap"
279
+ };
280
+ var openIconStyle = {
281
+ width: 12,
282
+ height: 12,
283
+ flexShrink: 0
284
+ };
285
+ var TranscriptionSettingLabel = ({ children, inputId, name }) => {
286
+ return /* @__PURE__ */ jsxs("div", {
287
+ style: label,
288
+ children: [
289
+ inputId === null ? name : /* @__PURE__ */ jsx("label", {
290
+ htmlFor: inputId,
291
+ style: nestedLabelStyle,
292
+ children: name
293
+ }),
294
+ /* @__PURE__ */ jsx(Spacing, {
295
+ x: 0.5
296
+ }),
297
+ /* @__PURE__ */ jsx(InfoBubble, {
298
+ title: `Learn more about ${name}`,
299
+ children: /* @__PURE__ */ jsx("div", {
300
+ style: tooltipContent,
301
+ children
302
+ })
303
+ })
304
+ ]
305
+ });
306
+ };
307
+ var ModelSettings = ({
308
+ cachedModels,
309
+ selectedLanguage,
310
+ selectedModel,
311
+ selectedTask,
312
+ setSelectedLanguage,
313
+ setSelectedModel,
314
+ setSelectedTask,
315
+ supportState
316
+ }) => {
317
+ const selectedModelInfo = AVAILABLE_MODELS.find(({ name }) => name === selectedModel);
318
+ if (!selectedModelInfo) {
319
+ throw new Error(`Unknown Whisper model: ${selectedModel}`);
320
+ }
321
+ const modelOptions = useMemo(() => {
322
+ return AVAILABLE_MODELS.map((model) => {
323
+ return {
324
+ type: "item",
325
+ id: model.name,
326
+ value: model.name,
327
+ label: `${model.name} · ${formatBytes(model.webGpuDownloadSize)}${cachedModels.has(model.name) ? " · Downloaded" : ""}`,
328
+ leftItem: model.name === selectedModel ? /* @__PURE__ */ jsx(Checkmark, {}) : null,
329
+ keyHint: null,
330
+ quickSwitcherLabel: null,
331
+ subMenu: null,
332
+ disabled: false,
333
+ onClick: () => setSelectedModel(model.name)
334
+ };
335
+ });
336
+ }, [cachedModels, selectedModel, setSelectedModel]);
337
+ const languageOptions = useMemo(() => {
338
+ return WHISPER_LANGUAGES.map(([languageCode, languageName]) => ({
339
+ type: "item",
340
+ id: languageCode,
341
+ value: languageCode,
342
+ label: languageName,
343
+ leftItem: languageCode === selectedLanguage ? /* @__PURE__ */ jsx(Checkmark, {}) : null,
344
+ keyHint: null,
345
+ quickSwitcherLabel: null,
346
+ subMenu: null,
347
+ disabled: false,
348
+ onClick: () => setSelectedLanguage(languageCode)
349
+ }));
350
+ }, [selectedLanguage, setSelectedLanguage]);
351
+ const effectiveTask = selectedModelInfo.supportsTranslation ? selectedTask : "transcribe";
352
+ const taskOptions = useMemo(() => {
353
+ return [
354
+ {
355
+ type: "item",
356
+ id: "transcribe",
357
+ value: "transcribe",
358
+ label: /* @__PURE__ */ jsxs(Fragment, {
359
+ children: [
360
+ /* @__PURE__ */ jsx("span", {
361
+ "aria-hidden": "true",
362
+ style: nestedLabelStyle,
363
+ children: "Transcribe"
364
+ }),
365
+ /* @__PURE__ */ jsx("span", {
366
+ style: { position: "absolute", clip: "rect(0 0 0 0)" },
367
+ children: "Task: Transcribe"
368
+ })
369
+ ]
370
+ }),
371
+ leftItem: effectiveTask === "transcribe" ? /* @__PURE__ */ jsx(Checkmark, {}) : null,
372
+ keyHint: null,
373
+ quickSwitcherLabel: null,
374
+ subMenu: null,
375
+ disabled: false,
376
+ onClick: () => setSelectedTask("transcribe")
377
+ },
378
+ {
379
+ type: "item",
380
+ id: "translate",
381
+ value: "translate",
382
+ label: /* @__PURE__ */ jsxs(Fragment, {
383
+ children: [
384
+ /* @__PURE__ */ jsx("span", {
385
+ "aria-hidden": "true",
386
+ style: nestedLabelStyle,
387
+ children: "Translate to English"
388
+ }),
389
+ /* @__PURE__ */ jsx("span", {
390
+ style: { position: "absolute", clip: "rect(0 0 0 0)" },
391
+ children: "Task: Translate to English"
392
+ })
393
+ ]
394
+ }),
395
+ leftItem: effectiveTask === "translate" ? /* @__PURE__ */ jsx(Checkmark, {}) : null,
396
+ keyHint: null,
397
+ quickSwitcherLabel: null,
398
+ subMenu: null,
399
+ disabled: false,
400
+ onClick: () => setSelectedTask("translate")
401
+ }
402
+ ];
403
+ }, [effectiveTask, setSelectedTask]);
404
+ useEffect(() => {
405
+ if (!selectedModelInfo.supportsTranslation) {
406
+ setSelectedTask("transcribe");
407
+ }
408
+ }, [selectedModelInfo.supportsTranslation, setSelectedTask]);
409
+ return /* @__PURE__ */ jsxs(Fragment, {
410
+ children: [
411
+ /* @__PURE__ */ jsxs("div", {
412
+ style: optionRow,
413
+ children: [
414
+ /* @__PURE__ */ jsx("div", {
415
+ style: label,
416
+ children: "Whisper model"
417
+ }),
418
+ /* @__PURE__ */ jsx("div", {
419
+ style: rightRow,
420
+ children: /* @__PURE__ */ jsx(Combobox, {
421
+ values: modelOptions,
422
+ selectedId: selectedModel,
423
+ title: "Whisper model",
424
+ style: controlStyle
425
+ })
426
+ })
427
+ ]
428
+ }),
429
+ selectedModelInfo.multilingual ? /* @__PURE__ */ jsxs("div", {
430
+ style: optionRow,
431
+ children: [
432
+ /* @__PURE__ */ jsx("div", {
433
+ style: label,
434
+ children: "Spoken language"
435
+ }),
436
+ /* @__PURE__ */ jsx("div", {
437
+ style: rightRow,
438
+ children: /* @__PURE__ */ jsx(Combobox, {
439
+ values: languageOptions,
440
+ selectedId: selectedLanguage,
441
+ title: "Spoken language",
442
+ style: controlStyle
443
+ })
444
+ })
445
+ ]
446
+ }) : null,
447
+ selectedModelInfo.supportsTranslation ? /* @__PURE__ */ jsxs("div", {
448
+ style: optionRow,
449
+ children: [
450
+ /* @__PURE__ */ jsx("div", {
451
+ style: label,
452
+ children: "Task"
453
+ }),
454
+ /* @__PURE__ */ jsx("div", {
455
+ style: rightRow,
456
+ children: /* @__PURE__ */ jsx(Combobox, {
457
+ values: taskOptions,
458
+ selectedId: effectiveTask,
459
+ title: "Task",
460
+ style: controlStyle
461
+ })
462
+ })
463
+ ]
464
+ }) : null,
465
+ effectiveTask === "translate" ? /* @__PURE__ */ jsx("div", {
466
+ id: TRANSCRIPTION_TASK_MESSAGE_ID,
467
+ "aria-live": "polite",
468
+ style: taskMessageRow,
469
+ children: /* @__PURE__ */ jsx(ValidationMessage, {
470
+ align: "flex-end",
471
+ message: "Word timings may be less accurate when translating to English.",
472
+ type: "warning"
473
+ })
474
+ }) : null,
475
+ supportState.type === "unsupported" ? /* @__PURE__ */ jsx("div", {
476
+ style: { padding: "0 16px" },
477
+ children: /* @__PURE__ */ jsx(ValidationMessage, {
478
+ align: "flex-end",
479
+ message: supportState.message,
480
+ type: "error"
481
+ })
482
+ }) : null
483
+ ]
484
+ });
485
+ };
486
+ var OutputSettings = ({ exists, onOutNameChange, outName, validationMessage }) => {
487
+ const openExistingOutput = useCallback(() => {
488
+ if (!window.remotion_publicFolderExists) {
489
+ showNotification("Could not find the public folder", 2000);
490
+ return;
491
+ }
492
+ openInFileExplorer({
493
+ directory: `${window.remotion_publicFolderExists}/${outName}`
494
+ }).catch((err) => {
495
+ showNotification(`Could not open file: ${err.message}`, 2000);
496
+ });
497
+ }, [outName]);
498
+ const renderOpenIcon = useCallback((color) => {
499
+ return /* @__PURE__ */ jsx(ExpandedFolderIconSolid, {
500
+ style: openIconStyle,
501
+ color
502
+ });
503
+ }, []);
504
+ const fileManagerName = getFileManagerName(window.remotion_fileSystemPlatform);
505
+ const isBrowserStudio = getBrowserStudioOperations() !== null;
506
+ return /* @__PURE__ */ jsxs("div", {
507
+ style: outputRow,
508
+ children: [
509
+ /* @__PURE__ */ jsxs(TranscriptionSettingLabel, {
510
+ inputId: null,
511
+ name: "Output in public/",
512
+ children: [
513
+ "Studio writes a JSON array compatible with",
514
+ " ",
515
+ /* @__PURE__ */ jsx("code", {
516
+ style: tooltipInlineCode,
517
+ children: "Caption[]"
518
+ }),
519
+ ". Load it from your composition with ",
520
+ /* @__PURE__ */ jsx("code", {
521
+ style: tooltipInlineCode,
522
+ children: "staticFile()"
523
+ }),
524
+ "."
525
+ ]
526
+ }),
527
+ /* @__PURE__ */ jsx("div", {
528
+ style: outputRightRow,
529
+ children: /* @__PURE__ */ jsxs("div", {
530
+ style: controlStyle,
531
+ children: [
532
+ /* @__PURE__ */ jsx(RemotionInput, {
533
+ "aria-label": "Caption output file",
534
+ "aria-describedby": validationMessage || exists ? TRANSCRIPTION_OUTPUT_MESSAGE_ID : undefined,
535
+ "aria-invalid": validationMessage ? true : undefined,
536
+ status: validationMessage ? "error" : exists ? "warning" : "ok",
537
+ style: input,
538
+ type: "text",
539
+ value: outName,
540
+ onChange: onOutNameChange,
541
+ rightAlign: true
542
+ }),
543
+ validationMessage || exists ? /* @__PURE__ */ jsxs("div", {
544
+ id: TRANSCRIPTION_OUTPUT_MESSAGE_ID,
545
+ "aria-live": "polite",
546
+ children: [
547
+ /* @__PURE__ */ jsx(Spacing, {
548
+ y: 1,
549
+ block: true
550
+ }),
551
+ /* @__PURE__ */ jsx(ValidationMessage, {
552
+ align: "flex-end",
553
+ message: validationMessage ?? /* @__PURE__ */ jsxs("span", {
554
+ style: existsMessageStyle,
555
+ children: [
556
+ isBrowserStudio ? null : /* @__PURE__ */ jsx(InlineAction, {
557
+ onClick: openExistingOutput,
558
+ renderAction: renderOpenIcon,
559
+ title: `Open in ${fileManagerName}`,
560
+ variant: null
561
+ }),
562
+ "Exists, will be overwritten"
563
+ ]
564
+ }),
565
+ type: validationMessage ? "error" : "warning"
566
+ })
567
+ ]
568
+ }) : null
569
+ ]
570
+ })
571
+ })
572
+ ]
573
+ });
574
+ };
575
+ var AdvancedSettings = ({
576
+ chunkLengthInSeconds,
577
+ doSample,
578
+ forceFullSequences,
579
+ noRepeatNgramSize,
580
+ repetitionPenalty,
581
+ setChunkLengthInSeconds,
582
+ setDoSample,
583
+ setForceFullSequences,
584
+ setNoRepeatNgramSize,
585
+ setRepetitionPenalty,
586
+ setStrideLengthInSeconds,
587
+ setTemperature,
588
+ setTopK,
589
+ strideLengthInSeconds,
590
+ temperature,
591
+ topK,
592
+ decodingValidationMessage,
593
+ validationMessage
594
+ }) => {
595
+ const onForceFullSequencesChange = useCallback((event) => setForceFullSequences(event.target.checked), [setForceFullSequences]);
596
+ const onDoSampleChange = useCallback((event) => setDoSample(event.target.checked), [setDoSample]);
597
+ return /* @__PURE__ */ jsxs(Fragment, {
598
+ children: [
599
+ /* @__PURE__ */ jsxs("div", {
600
+ "aria-describedby": validationMessage ? TRANSCRIPTION_CHUNK_MESSAGE_ID : undefined,
601
+ "aria-invalid": validationMessage ? true : undefined,
602
+ "aria-label": "Chunk settings",
603
+ role: "group",
604
+ children: [
605
+ /* @__PURE__ */ jsx(NumberSetting, {
606
+ formatter: (value) => `${value}s`,
607
+ hint: {
608
+ content: /* @__PURE__ */ jsx("div", {
609
+ style: tooltipContent,
610
+ children: "Studio splits long audio into chunks of up to 30 seconds. Longer chunks need fewer transcription passes."
611
+ }),
612
+ title: "Learn more about Chunk length"
613
+ },
614
+ max: MAX_CHUNK_LENGTH_IN_SECONDS,
615
+ min: 1,
616
+ name: "Chunk length",
617
+ onValueChanged: setChunkLengthInSeconds,
618
+ step: 1,
619
+ value: chunkLengthInSeconds
620
+ }),
621
+ /* @__PURE__ */ jsx(NumberSetting, {
622
+ formatter: (value) => `${value}s`,
623
+ hint: {
624
+ content: /* @__PURE__ */ jsx("div", {
625
+ style: tooltipContent,
626
+ children: "Overlaps both sides of each chunk to help preserve words at the boundaries."
627
+ }),
628
+ title: "Learn more about Stride length"
629
+ },
630
+ min: 0,
631
+ name: "Stride length",
632
+ onValueChanged: setStrideLengthInSeconds,
633
+ step: 1,
634
+ value: strideLengthInSeconds
635
+ })
636
+ ]
637
+ }),
638
+ validationMessage ? /* @__PURE__ */ jsx("div", {
639
+ id: TRANSCRIPTION_CHUNK_MESSAGE_ID,
640
+ "aria-live": "polite",
641
+ style: { padding: "0 16px" },
642
+ children: /* @__PURE__ */ jsx(ValidationMessage, {
643
+ align: "flex-end",
644
+ message: validationMessage,
645
+ type: "error"
646
+ })
647
+ }) : null,
648
+ /* @__PURE__ */ jsxs("div", {
649
+ "aria-describedby": decodingValidationMessage ? TRANSCRIPTION_DECODING_MESSAGE_ID : undefined,
650
+ "aria-invalid": decodingValidationMessage ? true : undefined,
651
+ "aria-label": "Decoding settings",
652
+ role: "group",
653
+ children: [
654
+ /* @__PURE__ */ jsx(RenderModalHr, {}),
655
+ /* @__PURE__ */ jsxs("div", {
656
+ style: optionRow,
657
+ children: [
658
+ /* @__PURE__ */ jsx(TranscriptionSettingLabel, {
659
+ inputId: "force-full-sequences",
660
+ name: "Force full sequences",
661
+ children: "Makes the job fail if Whisper leaves an incomplete timestamp sequence."
662
+ }),
663
+ /* @__PURE__ */ jsx("div", {
664
+ style: rightRow,
665
+ children: /* @__PURE__ */ jsx(Checkbox, {
666
+ checked: forceFullSequences,
667
+ inputId: "force-full-sequences",
668
+ name: "force-full-sequences",
669
+ onChange: onForceFullSequencesChange
670
+ })
671
+ })
672
+ ]
673
+ }),
674
+ /* @__PURE__ */ jsx(RenderModalHr, {}),
675
+ /* @__PURE__ */ jsxs("div", {
676
+ style: optionRow,
677
+ children: [
678
+ /* @__PURE__ */ jsx(TranscriptionSettingLabel, {
679
+ inputId: "use-sampling",
680
+ name: "Use sampling",
681
+ children: "Makes decoding nondeterministic."
682
+ }),
683
+ /* @__PURE__ */ jsx("div", {
684
+ style: rightRow,
685
+ children: /* @__PURE__ */ jsx(Checkbox, {
686
+ checked: doSample,
687
+ inputId: "use-sampling",
688
+ name: "use-sampling",
689
+ onChange: onDoSampleChange
690
+ })
691
+ })
692
+ ]
693
+ }),
694
+ doSample ? /* @__PURE__ */ jsxs(Fragment, {
695
+ children: [
696
+ /* @__PURE__ */ jsx(NumberSetting, {
697
+ hint: {
698
+ content: /* @__PURE__ */ jsx("div", {
699
+ style: tooltipContent,
700
+ children: "Controls randomness when sampling."
701
+ }),
702
+ title: "Learn more about Temperature"
703
+ },
704
+ min: 0.1,
705
+ name: "Temperature",
706
+ onValueChanged: setTemperature,
707
+ step: 0.1,
708
+ value: temperature
709
+ }),
710
+ /* @__PURE__ */ jsx(NumberSetting, {
711
+ hint: {
712
+ content: /* @__PURE__ */ jsx("div", {
713
+ style: tooltipContent,
714
+ children: "Limits the candidate tokens when sampling."
715
+ }),
716
+ title: "Learn more about Top K"
717
+ },
718
+ min: 0,
719
+ name: "Top K",
720
+ onValueChanged: setTopK,
721
+ step: 1,
722
+ value: topK
723
+ })
724
+ ]
725
+ }) : null,
726
+ /* @__PURE__ */ jsx(NumberSetting, {
727
+ hint: {
728
+ content: /* @__PURE__ */ jsx("div", {
729
+ style: tooltipContent,
730
+ children: "Discourages repeated tokens. A value of 1 disables the penalty."
731
+ }),
732
+ title: "Learn more about Repetition penalty"
733
+ },
734
+ min: 0.1,
735
+ name: "Repetition penalty",
736
+ onValueChanged: setRepetitionPenalty,
737
+ step: 0.1,
738
+ value: repetitionPenalty
739
+ }),
740
+ /* @__PURE__ */ jsx(NumberSetting, {
741
+ hint: {
742
+ content: /* @__PURE__ */ jsx("div", {
743
+ style: tooltipContent,
744
+ children: "Prevents repeated phrases of this many tokens. A value of 0 disables the filter."
745
+ }),
746
+ title: "Learn more about No-repeat n-gram size"
747
+ },
748
+ min: 0,
749
+ name: "No-repeat n-gram size",
750
+ onValueChanged: setNoRepeatNgramSize,
751
+ step: 1,
752
+ value: noRepeatNgramSize
753
+ })
754
+ ]
755
+ }),
756
+ decodingValidationMessage ? /* @__PURE__ */ jsx("div", {
757
+ id: TRANSCRIPTION_DECODING_MESSAGE_ID,
758
+ "aria-live": "polite",
759
+ style: { padding: "0 16px" },
760
+ children: /* @__PURE__ */ jsx(ValidationMessage, {
761
+ align: "flex-end",
762
+ message: decodingValidationMessage,
763
+ type: "error"
764
+ })
765
+ }) : null
766
+ ]
767
+ });
768
+ };
769
+ var TranscriptionModal = ({
770
+ audioStreamIndex,
771
+ displayName,
772
+ requestInit,
773
+ src
774
+ }) => {
775
+ const [tab, setTab] = useState("transcribe");
776
+ const isModelCached = useCallback((model) => isWhisperModelCached({ model }), []);
777
+ const cachedModels = useModelCacheStatus({
778
+ isModelCached,
779
+ models: AVAILABLE_MODELS,
780
+ refreshKey: tab
781
+ });
782
+ const [selectedModel, setSelectedModel] = useState("small.en");
783
+ const [selectedLanguage, setSelectedLanguage] = useState("en");
784
+ const [selectedTask, setSelectedTask] = useState("transcribe");
785
+ const [chunkLengthInSeconds, setChunkLengthInSeconds] = useState(DEFAULT_CHUNK_LENGTH_IN_SECONDS);
786
+ const [strideLengthInSeconds, setStrideLengthInSeconds] = useState(DEFAULT_STRIDE_LENGTH_IN_SECONDS);
787
+ const [forceFullSequences, setForceFullSequences] = useState(false);
788
+ const [doSample, setDoSample] = useState(false);
789
+ const [temperature, setTemperature] = useState(DEFAULT_TEMPERATURE);
790
+ const [topK, setTopK] = useState(DEFAULT_TOP_K);
791
+ const [repetitionPenalty, setRepetitionPenalty] = useState(DEFAULT_REPETITION_PENALTY);
792
+ const [noRepeatNgramSize, setNoRepeatNgramSize] = useState(DEFAULT_NO_REPEAT_NGRAM_SIZE);
793
+ const [supportState, setSupportState] = useState({
794
+ type: "checking"
795
+ });
796
+ const [outName, setOutName] = useState(() => getDefaultCaptionOutputName(src, displayName));
797
+ const { addCaptionJob, captionJobs } = useContext(RenderQueueContext);
798
+ const { setSelectedModal } = useContext(SetSelectedModalContext);
799
+ const { setSidebarCollapsedState } = useContext(SidebarContext);
800
+ const staticFiles = useStaticFiles();
801
+ useEffect(() => {
802
+ let cancelled = false;
803
+ canUseWhisperWebGpu().then((result) => {
804
+ if (cancelled) {
805
+ return;
806
+ }
807
+ setSupportState(result.supported ? { type: "supported" } : { type: "unsupported", message: result.detailedReason });
808
+ });
809
+ return () => {
810
+ cancelled = true;
811
+ };
812
+ }, []);
813
+ const normalizedOutName = outName.normalize("NFC").toLowerCase();
814
+ const queuedOutputExists = captionJobs.some((job) => (job.status === "idle" || job.status === "running") && job.outName.normalize("NFC").toLowerCase() === normalizedOutName);
815
+ const outputValidationMessage = validateCaptionOutputName(outName) ?? (queuedOutputExists ? "Another caption job is already using this output file" : null);
816
+ const exists = staticFiles.some((file) => file.name.normalize("NFC").toLowerCase() === normalizedOutName);
817
+ const chunkValidationMessage = strideLengthInSeconds * 2 >= chunkLengthInSeconds ? "Stride length must be less than half of chunk length" : null;
818
+ const decodingValidationMessage = !Number.isFinite(temperature) ? "Temperature must be a finite number greater than 0" : temperature <= 0 ? "Temperature must be greater than 0" : !Number.isInteger(topK) || topK < 0 ? "Top K must be a non-negative integer" : !Number.isFinite(repetitionPenalty) ? "Repetition penalty must be a finite number greater than 0" : repetitionPenalty <= 0 ? "Repetition penalty must be greater than 0" : !Number.isInteger(noRepeatNgramSize) || noRepeatNgramSize < 0 ? "No-repeat n-gram size must be a non-negative integer" : null;
819
+ const canTranscribe = supportState.type === "supported" && outputValidationMessage === null && chunkValidationMessage === null && decodingValidationMessage === null;
820
+ const transcribeDisabledReason = supportState.type === "checking" ? "Checking WebGPU support" : supportState.type === "unsupported" ? supportState.message : outputValidationMessage ?? chunkValidationMessage ?? decodingValidationMessage ?? undefined;
821
+ const onOutNameChange = useCallback((event) => {
822
+ setOutName(event.target.value);
823
+ }, []);
824
+ const onAddToQueue = useCallback(() => {
825
+ if (!canTranscribe) {
826
+ return;
827
+ }
828
+ const modelInfo = AVAILABLE_MODELS.find(({ name }) => name === selectedModel);
829
+ if (!modelInfo) {
830
+ throw new Error(`Unknown Whisper model: ${selectedModel}`);
831
+ }
832
+ addCaptionJob({
833
+ src,
834
+ displayName,
835
+ audioStreamIndex,
836
+ requestInit,
837
+ outName,
838
+ model: selectedModel,
839
+ language: modelInfo.multilingual ? selectedLanguage : null,
840
+ task: modelInfo.supportsTranslation ? selectedTask : "transcribe",
841
+ chunkLengthInSeconds,
842
+ strideLengthInSeconds,
843
+ forceFullSequences,
844
+ doSample,
845
+ temperature,
846
+ topK,
847
+ repetitionPenalty,
848
+ noRepeatNgramSize
849
+ });
850
+ setSidebarCollapsedState({ left: null, right: "expanded" });
851
+ persistSelectedOptionsSidebarPanel("renders");
852
+ optionsSidebarTabs.current?.selectRendersPanel();
853
+ setSelectedModal(null);
854
+ }, [
855
+ addCaptionJob,
856
+ audioStreamIndex,
857
+ canTranscribe,
858
+ chunkLengthInSeconds,
859
+ displayName,
860
+ doSample,
861
+ forceFullSequences,
862
+ noRepeatNgramSize,
863
+ outName,
864
+ repetitionPenalty,
865
+ requestInit,
866
+ src,
867
+ selectedLanguage,
868
+ selectedModel,
869
+ selectedTask,
870
+ setSelectedModal,
871
+ setSidebarCollapsedState,
872
+ strideLengthInSeconds,
873
+ temperature,
874
+ topK
875
+ ]);
876
+ return /* @__PURE__ */ jsx(DismissableModal, {
877
+ ariaLabel: `Transcribe ${displayName}`,
878
+ children: /* @__PURE__ */ jsxs("div", {
879
+ style: transcriptionModalStyle,
880
+ children: [
881
+ /* @__PURE__ */ jsx(ModalHeader, {
882
+ title: `Transcribe ${displayName}`
883
+ }),
884
+ /* @__PURE__ */ jsxs("div", {
885
+ style: container,
886
+ children: [
887
+ /* @__PURE__ */ jsx("div", {
888
+ style: flexer
889
+ }),
890
+ /* @__PURE__ */ jsx(Button, {
891
+ onClick: onAddToQueue,
892
+ disabled: !canTranscribe,
893
+ title: transcribeDisabledReason,
894
+ style: {
895
+ ...buttonStyle,
896
+ backgroundColor: canTranscribe ? buttonStyle.backgroundColor : BLUE_DISABLED
897
+ },
898
+ children: "Transcribe"
899
+ })
900
+ ]
901
+ }),
902
+ /* @__PURE__ */ jsxs("div", {
903
+ style: transcriptionLayout,
904
+ children: [
905
+ /* @__PURE__ */ jsxs("div", {
906
+ style: leftSidebar,
907
+ children: [
908
+ /* @__PURE__ */ jsx(VerticalTab, {
909
+ autoFocus: true,
910
+ style: horizontalTab,
911
+ selected: tab === "transcribe",
912
+ onClick: () => setTab("transcribe"),
913
+ renderIcon: (color) => /* @__PURE__ */ jsx("div", {
914
+ style: iconContainer,
915
+ children: /* @__PURE__ */ jsx(TranscriptionIcon, {
916
+ color,
917
+ style: icon
918
+ })
919
+ }),
920
+ children: "Transcribe"
921
+ }),
922
+ /* @__PURE__ */ jsx(VerticalTab, {
923
+ style: horizontalTab,
924
+ selected: tab === "models",
925
+ onClick: () => setTab("models"),
926
+ renderIcon: (color) => /* @__PURE__ */ jsx("div", {
927
+ style: iconContainer,
928
+ children: /* @__PURE__ */ jsx(ModelsIcon, {
929
+ color,
930
+ style: icon
931
+ })
932
+ }),
933
+ children: "Models"
934
+ }),
935
+ /* @__PURE__ */ jsx(VerticalTab, {
936
+ style: horizontalTab,
937
+ selected: tab === "advanced",
938
+ onClick: () => setTab("advanced"),
939
+ renderIcon: (color) => /* @__PURE__ */ jsx("div", {
940
+ style: iconContainer,
941
+ children: /* @__PURE__ */ jsx(GearIcon, {
942
+ color,
943
+ style: icon
944
+ })
945
+ }),
946
+ children: "Advanced"
947
+ })
948
+ ]
949
+ }),
950
+ /* @__PURE__ */ jsxs("div", {
951
+ style: tab === "transcribe" ? settingsPanel : hiddenPanel,
952
+ className: VERTICAL_SCROLLBAR_CLASSNAME,
953
+ children: [
954
+ /* @__PURE__ */ jsx(OutputSettings, {
955
+ exists,
956
+ onOutNameChange,
957
+ outName,
958
+ validationMessage: outputValidationMessage
959
+ }),
960
+ /* @__PURE__ */ jsx(RenderModalHr, {}),
961
+ /* @__PURE__ */ jsx(ModelSettings, {
962
+ cachedModels,
963
+ selectedLanguage,
964
+ selectedModel,
965
+ selectedTask,
966
+ setSelectedLanguage,
967
+ setSelectedModel,
968
+ setSelectedTask,
969
+ supportState
970
+ })
971
+ ]
972
+ }),
973
+ /* @__PURE__ */ jsx("div", {
974
+ style: tab === "advanced" ? advancedPanel : hiddenPanel,
975
+ className: VERTICAL_SCROLLBAR_CLASSNAME,
976
+ children: /* @__PURE__ */ jsx(AdvancedSettings, {
977
+ chunkLengthInSeconds,
978
+ decodingValidationMessage,
979
+ doSample,
980
+ forceFullSequences,
981
+ noRepeatNgramSize,
982
+ repetitionPenalty,
983
+ setChunkLengthInSeconds,
984
+ setDoSample,
985
+ setForceFullSequences,
986
+ setNoRepeatNgramSize,
987
+ setRepetitionPenalty,
988
+ setStrideLengthInSeconds,
989
+ setTemperature,
990
+ setTopK,
991
+ strideLengthInSeconds,
992
+ temperature,
993
+ topK,
994
+ validationMessage: chunkValidationMessage
995
+ })
996
+ }),
997
+ /* @__PURE__ */ jsx(Models, {
998
+ description: `Models are downloaded automatically when needed.
999
+ You can also manage the browser cache here.`,
1000
+ indent: true,
1001
+ visible: tab === "models"
1002
+ })
1003
+ ]
1004
+ })
1005
+ ]
1006
+ })
1007
+ });
1008
+ };
1009
+ export {
1010
+ TranscriptionModal
1011
+ };