@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,428 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TranscriptionModal = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const studio_shared_1 = require("@remotion/studio-shared");
6
+ const whisper_webgpu_1 = require("@remotion/whisper-webgpu");
7
+ const react_1 = require("react");
8
+ const browser_studio_operations_1 = require("../../helpers/browser-studio-operations");
9
+ const colors_1 = require("../../helpers/colors");
10
+ const get_file_manager_name_1 = require("../../helpers/get-file-manager-name");
11
+ const Checkmark_1 = require("../../icons/Checkmark");
12
+ const folder_1 = require("../../icons/folder");
13
+ const gear_1 = require("../../icons/gear");
14
+ const models_1 = require("../../icons/models");
15
+ const transcription_1 = require("../../icons/transcription");
16
+ const modals_1 = require("../../state/modals");
17
+ const sidebar_1 = require("../../state/sidebar");
18
+ const Button_1 = require("../Button");
19
+ const Checkbox_1 = require("../Checkbox");
20
+ const InlineAction_1 = require("../InlineAction");
21
+ const layout_1 = require("../layout");
22
+ const is_menu_item_1 = require("../Menu/is-menu-item");
23
+ const ModalHeader_1 = require("../ModalHeader");
24
+ const ComboBox_1 = require("../NewComposition/ComboBox");
25
+ const DismissableModal_1 = require("../NewComposition/DismissableModal");
26
+ const RemInput_1 = require("../NewComposition/RemInput");
27
+ const ValidationMessage_1 = require("../NewComposition/ValidationMessage");
28
+ const NotificationCenter_1 = require("../Notifications/NotificationCenter");
29
+ const options_sidebar_tabs_1 = require("../options-sidebar-tabs");
30
+ const OptionsPanel_1 = require("../OptionsPanel");
31
+ const InfoBubble_1 = require("../RenderModal/InfoBubble");
32
+ const layout_2 = require("../RenderModal/layout");
33
+ const NumberSetting_1 = require("../RenderModal/NumberSetting");
34
+ const render_modals_1 = require("../RenderModal/render-modals");
35
+ const RenderModalHr_1 = require("../RenderModal/RenderModalHr");
36
+ const actions_1 = require("../RenderQueue/actions");
37
+ const context_1 = require("../RenderQueue/context");
38
+ const vertical_1 = require("../Tabs/vertical");
39
+ const use_model_cache_status_1 = require("../use-model-cache-status");
40
+ const use_static_files_1 = require("../use-static-files");
41
+ const caption_output_name_1 = require("./caption-output-name");
42
+ const Models_1 = require("./Models");
43
+ const whisper_languages_1 = require("./whisper-languages");
44
+ const TRANSCRIPTION_OUTPUT_MESSAGE_ID = 'remotion-transcription-output-message';
45
+ const TRANSCRIPTION_CHUNK_MESSAGE_ID = 'remotion-transcription-chunk-message';
46
+ const TRANSCRIPTION_DECODING_MESSAGE_ID = 'remotion-transcription-decoding-message';
47
+ const TRANSCRIPTION_TASK_MESSAGE_ID = 'remotion-transcription-task-message';
48
+ const DEFAULT_CHUNK_LENGTH_IN_SECONDS = 30;
49
+ const DEFAULT_STRIDE_LENGTH_IN_SECONDS = 5;
50
+ const DEFAULT_TEMPERATURE = 1;
51
+ const DEFAULT_TOP_K = 50;
52
+ const DEFAULT_REPETITION_PENALTY = 1;
53
+ const DEFAULT_NO_REPEAT_NGRAM_SIZE = 0;
54
+ const MAX_CHUNK_LENGTH_IN_SECONDS = 30;
55
+ const AVAILABLE_MODELS = (0, whisper_webgpu_1.getAvailableModels)();
56
+ const settingsPanel = {
57
+ ...render_modals_1.optionsPanel,
58
+ flexDirection: 'column',
59
+ paddingTop: 16,
60
+ };
61
+ const advancedPanel = {
62
+ ...settingsPanel,
63
+ paddingTop: 0,
64
+ };
65
+ const transcriptionModalStyle = {
66
+ ...render_modals_1.outerModalStyle,
67
+ outline: 'none',
68
+ };
69
+ const transcriptionLayout = {
70
+ ...render_modals_1.horizontalLayout,
71
+ flex: '1 1 auto',
72
+ };
73
+ const controlStyle = {
74
+ width: 330,
75
+ maxWidth: '100%',
76
+ };
77
+ const nestedLabelStyle = {
78
+ color: 'inherit',
79
+ fontFamily: 'inherit',
80
+ fontSize: 'inherit',
81
+ lineHeight: 'inherit',
82
+ };
83
+ const taskMessageRow = {
84
+ display: 'flex',
85
+ justifyContent: 'flex-end',
86
+ padding: '0 16px 8px',
87
+ };
88
+ const outputRow = {
89
+ display: 'flex',
90
+ flexDirection: 'row',
91
+ alignItems: 'flex-start',
92
+ paddingLeft: 16,
93
+ paddingRight: 16,
94
+ paddingTop: 4,
95
+ paddingBottom: 12,
96
+ };
97
+ const outputRightRow = {
98
+ display: 'flex',
99
+ flex: 1,
100
+ flexDirection: 'row',
101
+ alignItems: 'flex-start',
102
+ justifyContent: 'flex-end',
103
+ minWidth: 0,
104
+ };
105
+ const tooltipContent = {
106
+ color: colors_1.LIGHT_TEXT,
107
+ fontSize: 13,
108
+ lineHeight: 1.5,
109
+ maxWidth: 360,
110
+ padding: 12,
111
+ };
112
+ const tooltipInlineCode = {
113
+ color: colors_1.WHITE,
114
+ fontFamily: 'monospace',
115
+ fontSize: 'inherit',
116
+ lineHeight: 'inherit',
117
+ };
118
+ const hiddenPanel = {
119
+ display: 'none',
120
+ };
121
+ const existsMessageStyle = {
122
+ display: 'inline-flex',
123
+ alignItems: 'center',
124
+ minWidth: 0,
125
+ fontFamily: 'sans-serif',
126
+ fontSize: 13,
127
+ lineHeight: '18px',
128
+ color: colors_1.WHITE,
129
+ whiteSpace: 'nowrap',
130
+ };
131
+ const openIconStyle = {
132
+ width: 12,
133
+ height: 12,
134
+ flexShrink: 0,
135
+ };
136
+ const TranscriptionSettingLabel = ({ children, inputId, name }) => {
137
+ return (jsx_runtime_1.jsxs("div", { style: layout_2.label, children: [inputId === null ? (name) : (jsx_runtime_1.jsx("label", { htmlFor: inputId, style: nestedLabelStyle, children: name })), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(InfoBubble_1.InfoBubble, { title: `Learn more about ${name}`, children: jsx_runtime_1.jsx("div", { style: tooltipContent, children: children }) })
138
+ ] }));
139
+ };
140
+ const ModelSettings = ({ cachedModels, selectedLanguage, selectedModel, selectedTask, setSelectedLanguage, setSelectedModel, setSelectedTask, supportState, }) => {
141
+ const selectedModelInfo = AVAILABLE_MODELS.find(({ name }) => name === selectedModel);
142
+ if (!selectedModelInfo) {
143
+ throw new Error(`Unknown Whisper model: ${selectedModel}`);
144
+ }
145
+ const modelOptions = (0, react_1.useMemo)(() => {
146
+ return AVAILABLE_MODELS.map((model) => {
147
+ return {
148
+ type: 'item',
149
+ id: model.name,
150
+ value: model.name,
151
+ label: `${model.name} · ${(0, studio_shared_1.formatBytes)(model.webGpuDownloadSize)}${cachedModels.has(model.name) ? ' · Downloaded' : ''}`,
152
+ leftItem: model.name === selectedModel ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
153
+ keyHint: null,
154
+ quickSwitcherLabel: null,
155
+ subMenu: null,
156
+ disabled: false,
157
+ onClick: () => setSelectedModel(model.name),
158
+ };
159
+ });
160
+ }, [cachedModels, selectedModel, setSelectedModel]);
161
+ const languageOptions = (0, react_1.useMemo)(() => {
162
+ return whisper_languages_1.WHISPER_LANGUAGES.map(([languageCode, languageName]) => ({
163
+ type: 'item',
164
+ id: languageCode,
165
+ value: languageCode,
166
+ label: languageName,
167
+ leftItem: languageCode === selectedLanguage ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
168
+ keyHint: null,
169
+ quickSwitcherLabel: null,
170
+ subMenu: null,
171
+ disabled: false,
172
+ onClick: () => setSelectedLanguage(languageCode),
173
+ }));
174
+ }, [selectedLanguage, setSelectedLanguage]);
175
+ const effectiveTask = selectedModelInfo.supportsTranslation
176
+ ? selectedTask
177
+ : 'transcribe';
178
+ const taskOptions = (0, react_1.useMemo)(() => {
179
+ return [
180
+ {
181
+ type: 'item',
182
+ id: 'transcribe',
183
+ value: 'transcribe',
184
+ label: (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
185
+ jsx_runtime_1.jsx("span", { "aria-hidden": "true", style: nestedLabelStyle, children: "Transcribe" }), jsx_runtime_1.jsx("span", { style: { position: 'absolute', clip: 'rect(0 0 0 0)' }, children: "Task: Transcribe" })
186
+ ] })),
187
+ leftItem: effectiveTask === 'transcribe' ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
188
+ keyHint: null,
189
+ quickSwitcherLabel: null,
190
+ subMenu: null,
191
+ disabled: false,
192
+ onClick: () => setSelectedTask('transcribe'),
193
+ },
194
+ {
195
+ type: 'item',
196
+ id: 'translate',
197
+ value: 'translate',
198
+ label: (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
199
+ jsx_runtime_1.jsx("span", { "aria-hidden": "true", style: nestedLabelStyle, children: "Translate to English" }), jsx_runtime_1.jsx("span", { style: { position: 'absolute', clip: 'rect(0 0 0 0)' }, children: "Task: Translate to English" })
200
+ ] })),
201
+ leftItem: effectiveTask === 'translate' ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
202
+ keyHint: null,
203
+ quickSwitcherLabel: null,
204
+ subMenu: null,
205
+ disabled: false,
206
+ onClick: () => setSelectedTask('translate'),
207
+ },
208
+ ];
209
+ }, [effectiveTask, setSelectedTask]);
210
+ (0, react_1.useEffect)(() => {
211
+ if (!selectedModelInfo.supportsTranslation) {
212
+ setSelectedTask('transcribe');
213
+ }
214
+ }, [selectedModelInfo.supportsTranslation, setSelectedTask]);
215
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
216
+ jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
217
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Whisper model" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: modelOptions, selectedId: selectedModel, title: "Whisper model", style: controlStyle }) })
218
+ ] }), selectedModelInfo.multilingual ? (jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
219
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Spoken language" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: languageOptions, selectedId: selectedLanguage, title: "Spoken language", style: controlStyle }) })
220
+ ] })) : null, selectedModelInfo.supportsTranslation ? (jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
221
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Task" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: taskOptions, selectedId: effectiveTask, title: "Task", style: controlStyle }) })
222
+ ] })) : null, effectiveTask === 'translate' ? (jsx_runtime_1.jsx("div", { id: TRANSCRIPTION_TASK_MESSAGE_ID, "aria-live": "polite", style: taskMessageRow, children: jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-end", message: "Word timings may be less accurate when translating to English.", type: "warning" }) })) : null, supportState.type === 'unsupported' ? (jsx_runtime_1.jsx("div", { style: { padding: '0 16px' }, children: jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-end", message: supportState.message, type: "error" }) })) : null] }));
223
+ };
224
+ const OutputSettings = ({ exists, onOutNameChange, outName, validationMessage }) => {
225
+ const openExistingOutput = (0, react_1.useCallback)(() => {
226
+ if (!window.remotion_publicFolderExists) {
227
+ (0, NotificationCenter_1.showNotification)('Could not find the public folder', 2000);
228
+ return;
229
+ }
230
+ (0, actions_1.openInFileExplorer)({
231
+ directory: `${window.remotion_publicFolderExists}/${outName}`,
232
+ }).catch((err) => {
233
+ (0, NotificationCenter_1.showNotification)(`Could not open file: ${err.message}`, 2000);
234
+ });
235
+ }, [outName]);
236
+ const renderOpenIcon = (0, react_1.useCallback)((color) => {
237
+ return jsx_runtime_1.jsx(folder_1.ExpandedFolderIconSolid, { style: openIconStyle, color: color });
238
+ }, []);
239
+ const fileManagerName = (0, get_file_manager_name_1.getFileManagerName)(window.remotion_fileSystemPlatform);
240
+ const isBrowserStudio = (0, browser_studio_operations_1.getBrowserStudioOperations)() !== null;
241
+ return (jsx_runtime_1.jsxs("div", { style: outputRow, children: [
242
+ jsx_runtime_1.jsxs(TranscriptionSettingLabel, { inputId: null, name: "Output in public/", children: ["Studio writes a JSON array compatible with", ' ', jsx_runtime_1.jsx("code", { style: tooltipInlineCode, children: "Caption[]" }),
243
+ ". Load it from your composition with ",
244
+ jsx_runtime_1.jsx("code", { style: tooltipInlineCode, children: "staticFile()" }),
245
+ "."] }), jsx_runtime_1.jsx("div", { style: outputRightRow, children: jsx_runtime_1.jsxs("div", { style: controlStyle, children: [
246
+ jsx_runtime_1.jsx(RemInput_1.RemotionInput, { "aria-label": "Caption output file", "aria-describedby": validationMessage || exists
247
+ ? TRANSCRIPTION_OUTPUT_MESSAGE_ID
248
+ : undefined, "aria-invalid": validationMessage ? true : undefined, status: validationMessage ? 'error' : exists ? 'warning' : 'ok', style: layout_2.input, type: "text", value: outName, onChange: onOutNameChange, rightAlign: true }), validationMessage || exists ? (jsx_runtime_1.jsxs("div", { id: TRANSCRIPTION_OUTPUT_MESSAGE_ID, "aria-live": "polite", children: [
249
+ jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-end", message: validationMessage !== null && validationMessage !== void 0 ? validationMessage : (jsx_runtime_1.jsxs("span", { style: existsMessageStyle, children: [isBrowserStudio ? null : (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { onClick: openExistingOutput, renderAction: renderOpenIcon, title: `Open in ${fileManagerName}`, variant: null })), "Exists, will be overwritten"] })), type: validationMessage ? 'error' : 'warning' })] })) : null] }) })
250
+ ] }));
251
+ };
252
+ const AdvancedSettings = ({ chunkLengthInSeconds, doSample, forceFullSequences, noRepeatNgramSize, repetitionPenalty, setChunkLengthInSeconds, setDoSample, setForceFullSequences, setNoRepeatNgramSize, setRepetitionPenalty, setStrideLengthInSeconds, setTemperature, setTopK, strideLengthInSeconds, temperature, topK, decodingValidationMessage, validationMessage, }) => {
253
+ const onForceFullSequencesChange = (0, react_1.useCallback)((event) => setForceFullSequences(event.target.checked), [setForceFullSequences]);
254
+ const onDoSampleChange = (0, react_1.useCallback)((event) => setDoSample(event.target.checked), [setDoSample]);
255
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
256
+ jsx_runtime_1.jsxs("div", { "aria-describedby": validationMessage ? TRANSCRIPTION_CHUNK_MESSAGE_ID : undefined, "aria-invalid": validationMessage ? true : undefined, "aria-label": "Chunk settings", role: "group", children: [jsx_runtime_1.jsx(NumberSetting_1.NumberSetting, { formatter: (value) => `${value}s`, hint: {
257
+ content: (jsx_runtime_1.jsx("div", { style: tooltipContent, children: "Studio splits long audio into chunks of up to 30 seconds. Longer chunks need fewer transcription passes." })),
258
+ title: 'Learn more about Chunk length',
259
+ }, max: MAX_CHUNK_LENGTH_IN_SECONDS, min: 1, name: "Chunk length", onValueChanged: setChunkLengthInSeconds, step: 1, value: chunkLengthInSeconds }), jsx_runtime_1.jsx(NumberSetting_1.NumberSetting, { formatter: (value) => `${value}s`, hint: {
260
+ content: (jsx_runtime_1.jsx("div", { style: tooltipContent, children: "Overlaps both sides of each chunk to help preserve words at the boundaries." })),
261
+ title: 'Learn more about Stride length',
262
+ }, min: 0, name: "Stride length", onValueChanged: setStrideLengthInSeconds, step: 1, value: strideLengthInSeconds })] }), validationMessage ? (jsx_runtime_1.jsx("div", { id: TRANSCRIPTION_CHUNK_MESSAGE_ID, "aria-live": "polite", style: { padding: '0 16px' }, children: jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-end", message: validationMessage, type: "error" }) })) : null, jsx_runtime_1.jsxs("div", { "aria-describedby": decodingValidationMessage
263
+ ? TRANSCRIPTION_DECODING_MESSAGE_ID
264
+ : undefined, "aria-invalid": decodingValidationMessage ? true : undefined, "aria-label": "Decoding settings", role: "group", children: [
265
+ jsx_runtime_1.jsx(RenderModalHr_1.RenderModalHr, {}), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
266
+ jsx_runtime_1.jsx(TranscriptionSettingLabel, { inputId: "force-full-sequences", name: "Force full sequences", children: "Makes the job fail if Whisper leaves an incomplete timestamp sequence." }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx(Checkbox_1.Checkbox, { checked: forceFullSequences, inputId: "force-full-sequences", name: "force-full-sequences", onChange: onForceFullSequencesChange }) })
267
+ ] }), jsx_runtime_1.jsx(RenderModalHr_1.RenderModalHr, {}), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
268
+ jsx_runtime_1.jsx(TranscriptionSettingLabel, { inputId: "use-sampling", name: "Use sampling", children: "Makes decoding nondeterministic." }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx(Checkbox_1.Checkbox, { checked: doSample, inputId: "use-sampling", name: "use-sampling", onChange: onDoSampleChange }) })
269
+ ] }), doSample ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [jsx_runtime_1.jsx(NumberSetting_1.NumberSetting, { hint: {
270
+ content: (jsx_runtime_1.jsx("div", { style: tooltipContent, children: "Controls randomness when sampling." })),
271
+ title: 'Learn more about Temperature',
272
+ }, min: 0.1, name: "Temperature", onValueChanged: setTemperature, step: 0.1, value: temperature }), jsx_runtime_1.jsx(NumberSetting_1.NumberSetting, { hint: {
273
+ content: (jsx_runtime_1.jsx("div", { style: tooltipContent, children: "Limits the candidate tokens when sampling." })),
274
+ title: 'Learn more about Top K',
275
+ }, min: 0, name: "Top K", onValueChanged: setTopK, step: 1, value: topK })] })) : null, jsx_runtime_1.jsx(NumberSetting_1.NumberSetting, { hint: {
276
+ content: (jsx_runtime_1.jsx("div", { style: tooltipContent, children: "Discourages repeated tokens. A value of 1 disables the penalty." })),
277
+ title: 'Learn more about Repetition penalty',
278
+ }, min: 0.1, name: "Repetition penalty", onValueChanged: setRepetitionPenalty, step: 0.1, value: repetitionPenalty }), jsx_runtime_1.jsx(NumberSetting_1.NumberSetting, { hint: {
279
+ content: (jsx_runtime_1.jsx("div", { style: tooltipContent, children: "Prevents repeated phrases of this many tokens. A value of 0 disables the filter." })),
280
+ title: 'Learn more about No-repeat n-gram size',
281
+ }, min: 0, name: "No-repeat n-gram size", onValueChanged: setNoRepeatNgramSize, step: 1, value: noRepeatNgramSize })] }), decodingValidationMessage ? (jsx_runtime_1.jsx("div", { id: TRANSCRIPTION_DECODING_MESSAGE_ID, "aria-live": "polite", style: { padding: '0 16px' }, children: jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-end", message: decodingValidationMessage, type: "error" }) })) : null] }));
282
+ };
283
+ const TranscriptionModal = ({ audioStreamIndex, displayName, requestInit, src, }) => {
284
+ var _a, _b, _c;
285
+ const [tab, setTab] = (0, react_1.useState)('transcribe');
286
+ const isModelCached = (0, react_1.useCallback)((model) => (0, whisper_webgpu_1.isWhisperModelCached)({ model }), []);
287
+ const cachedModels = (0, use_model_cache_status_1.useModelCacheStatus)({
288
+ isModelCached,
289
+ models: AVAILABLE_MODELS,
290
+ refreshKey: tab,
291
+ });
292
+ const [selectedModel, setSelectedModel] = (0, react_1.useState)('small.en');
293
+ const [selectedLanguage, setSelectedLanguage] = (0, react_1.useState)('en');
294
+ const [selectedTask, setSelectedTask] = (0, react_1.useState)('transcribe');
295
+ const [chunkLengthInSeconds, setChunkLengthInSeconds] = (0, react_1.useState)(DEFAULT_CHUNK_LENGTH_IN_SECONDS);
296
+ const [strideLengthInSeconds, setStrideLengthInSeconds] = (0, react_1.useState)(DEFAULT_STRIDE_LENGTH_IN_SECONDS);
297
+ const [forceFullSequences, setForceFullSequences] = (0, react_1.useState)(false);
298
+ const [doSample, setDoSample] = (0, react_1.useState)(false);
299
+ const [temperature, setTemperature] = (0, react_1.useState)(DEFAULT_TEMPERATURE);
300
+ const [topK, setTopK] = (0, react_1.useState)(DEFAULT_TOP_K);
301
+ const [repetitionPenalty, setRepetitionPenalty] = (0, react_1.useState)(DEFAULT_REPETITION_PENALTY);
302
+ const [noRepeatNgramSize, setNoRepeatNgramSize] = (0, react_1.useState)(DEFAULT_NO_REPEAT_NGRAM_SIZE);
303
+ const [supportState, setSupportState] = (0, react_1.useState)({
304
+ type: 'checking',
305
+ });
306
+ const [outName, setOutName] = (0, react_1.useState)(() => (0, caption_output_name_1.getDefaultCaptionOutputName)(src, displayName));
307
+ const { addCaptionJob, captionJobs } = (0, react_1.useContext)(context_1.RenderQueueContext);
308
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
309
+ const { setSidebarCollapsedState } = (0, react_1.useContext)(sidebar_1.SidebarContext);
310
+ const staticFiles = (0, use_static_files_1.useStaticFiles)();
311
+ (0, react_1.useEffect)(() => {
312
+ let cancelled = false;
313
+ (0, whisper_webgpu_1.canUseWhisperWebGpu)().then((result) => {
314
+ if (cancelled) {
315
+ return;
316
+ }
317
+ setSupportState(result.supported
318
+ ? { type: 'supported' }
319
+ : { type: 'unsupported', message: result.detailedReason });
320
+ });
321
+ return () => {
322
+ cancelled = true;
323
+ };
324
+ }, []);
325
+ const normalizedOutName = outName.normalize('NFC').toLowerCase();
326
+ const queuedOutputExists = captionJobs.some((job) => (job.status === 'idle' || job.status === 'running') &&
327
+ job.outName.normalize('NFC').toLowerCase() === normalizedOutName);
328
+ const outputValidationMessage = (_a = (0, caption_output_name_1.validateCaptionOutputName)(outName)) !== null && _a !== void 0 ? _a : (queuedOutputExists
329
+ ? 'Another caption job is already using this output file'
330
+ : null);
331
+ const exists = staticFiles.some((file) => file.name.normalize('NFC').toLowerCase() === normalizedOutName);
332
+ const chunkValidationMessage = strideLengthInSeconds * 2 >= chunkLengthInSeconds
333
+ ? 'Stride length must be less than half of chunk length'
334
+ : null;
335
+ const decodingValidationMessage = !Number.isFinite(temperature)
336
+ ? 'Temperature must be a finite number greater than 0'
337
+ : temperature <= 0
338
+ ? 'Temperature must be greater than 0'
339
+ : !Number.isInteger(topK) || topK < 0
340
+ ? 'Top K must be a non-negative integer'
341
+ : !Number.isFinite(repetitionPenalty)
342
+ ? 'Repetition penalty must be a finite number greater than 0'
343
+ : repetitionPenalty <= 0
344
+ ? 'Repetition penalty must be greater than 0'
345
+ : !Number.isInteger(noRepeatNgramSize) || noRepeatNgramSize < 0
346
+ ? 'No-repeat n-gram size must be a non-negative integer'
347
+ : null;
348
+ const canTranscribe = supportState.type === 'supported' &&
349
+ outputValidationMessage === null &&
350
+ chunkValidationMessage === null &&
351
+ decodingValidationMessage === null;
352
+ const transcribeDisabledReason = supportState.type === 'checking'
353
+ ? 'Checking WebGPU support'
354
+ : supportState.type === 'unsupported'
355
+ ? supportState.message
356
+ : ((_c = (_b = outputValidationMessage !== null && outputValidationMessage !== void 0 ? outputValidationMessage : chunkValidationMessage) !== null && _b !== void 0 ? _b : decodingValidationMessage) !== null && _c !== void 0 ? _c : undefined);
357
+ const onOutNameChange = (0, react_1.useCallback)((event) => {
358
+ setOutName(event.target.value);
359
+ }, []);
360
+ const onAddToQueue = (0, react_1.useCallback)(() => {
361
+ var _a;
362
+ if (!canTranscribe) {
363
+ return;
364
+ }
365
+ const modelInfo = AVAILABLE_MODELS.find(({ name }) => name === selectedModel);
366
+ if (!modelInfo) {
367
+ throw new Error(`Unknown Whisper model: ${selectedModel}`);
368
+ }
369
+ addCaptionJob({
370
+ src,
371
+ displayName,
372
+ audioStreamIndex,
373
+ requestInit,
374
+ outName,
375
+ model: selectedModel,
376
+ language: modelInfo.multilingual ? selectedLanguage : null,
377
+ task: modelInfo.supportsTranslation ? selectedTask : 'transcribe',
378
+ chunkLengthInSeconds,
379
+ strideLengthInSeconds,
380
+ forceFullSequences,
381
+ doSample,
382
+ temperature,
383
+ topK,
384
+ repetitionPenalty,
385
+ noRepeatNgramSize,
386
+ });
387
+ setSidebarCollapsedState({ left: null, right: 'expanded' });
388
+ (0, OptionsPanel_1.persistSelectedOptionsSidebarPanel)('renders');
389
+ (_a = options_sidebar_tabs_1.optionsSidebarTabs.current) === null || _a === void 0 ? void 0 : _a.selectRendersPanel();
390
+ setSelectedModal(null);
391
+ }, [
392
+ addCaptionJob,
393
+ audioStreamIndex,
394
+ canTranscribe,
395
+ chunkLengthInSeconds,
396
+ displayName,
397
+ doSample,
398
+ forceFullSequences,
399
+ noRepeatNgramSize,
400
+ outName,
401
+ repetitionPenalty,
402
+ requestInit,
403
+ src,
404
+ selectedLanguage,
405
+ selectedModel,
406
+ selectedTask,
407
+ setSelectedModal,
408
+ setSidebarCollapsedState,
409
+ strideLengthInSeconds,
410
+ temperature,
411
+ topK,
412
+ ]);
413
+ return (jsx_runtime_1.jsx(DismissableModal_1.DismissableModal, { ariaLabel: `Transcribe ${displayName}`, children: jsx_runtime_1.jsxs("div", { style: transcriptionModalStyle, children: [
414
+ jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: `Transcribe ${displayName}` }), jsx_runtime_1.jsxs("div", { style: render_modals_1.container, children: [
415
+ jsx_runtime_1.jsx("div", { style: render_modals_1.flexer }), jsx_runtime_1.jsx(Button_1.Button, { onClick: onAddToQueue, disabled: !canTranscribe, title: transcribeDisabledReason, style: {
416
+ ...render_modals_1.buttonStyle,
417
+ backgroundColor: canTranscribe
418
+ ? render_modals_1.buttonStyle.backgroundColor
419
+ : colors_1.BLUE_DISABLED,
420
+ }, children: "Transcribe" })
421
+ ] }), jsx_runtime_1.jsxs("div", { style: transcriptionLayout, children: [
422
+ jsx_runtime_1.jsxs("div", { style: render_modals_1.leftSidebar, children: [jsx_runtime_1.jsx(vertical_1.VerticalTab, { autoFocus: true, style: render_modals_1.horizontalTab, selected: tab === 'transcribe', onClick: () => setTab('transcribe'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(transcription_1.TranscriptionIcon, { color: color, style: render_modals_1.icon }) })), children: "Transcribe" }), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'models', onClick: () => setTab('models'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(models_1.ModelsIcon, { color: color, style: render_modals_1.icon }) })), children: "Models" }), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'advanced', onClick: () => setTab('advanced'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(gear_1.GearIcon, { color: color, style: render_modals_1.icon }) })), children: "Advanced" })] }), jsx_runtime_1.jsxs("div", { style: tab === 'transcribe' ? settingsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: [
423
+ jsx_runtime_1.jsx(OutputSettings, { exists: exists, onOutNameChange: onOutNameChange, outName: outName, validationMessage: outputValidationMessage }), jsx_runtime_1.jsx(RenderModalHr_1.RenderModalHr, {}), jsx_runtime_1.jsx(ModelSettings, { cachedModels: cachedModels, selectedLanguage: selectedLanguage, selectedModel: selectedModel, selectedTask: selectedTask, setSelectedLanguage: setSelectedLanguage, setSelectedModel: setSelectedModel, setSelectedTask: setSelectedTask, supportState: supportState })
424
+ ] }), jsx_runtime_1.jsx("div", { style: tab === 'advanced' ? advancedPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(AdvancedSettings, { chunkLengthInSeconds: chunkLengthInSeconds, decodingValidationMessage: decodingValidationMessage, doSample: doSample, forceFullSequences: forceFullSequences, noRepeatNgramSize: noRepeatNgramSize, repetitionPenalty: repetitionPenalty, setChunkLengthInSeconds: setChunkLengthInSeconds, setDoSample: setDoSample, setForceFullSequences: setForceFullSequences, setNoRepeatNgramSize: setNoRepeatNgramSize, setRepetitionPenalty: setRepetitionPenalty, setStrideLengthInSeconds: setStrideLengthInSeconds, setTemperature: setTemperature, setTopK: setTopK, strideLengthInSeconds: strideLengthInSeconds, temperature: temperature, topK: topK, validationMessage: chunkValidationMessage }) }), jsx_runtime_1.jsx(Models_1.Models, { description: 'Models are downloaded automatically when needed.\nYou can also manage the browser cache here.', indent: true, visible: tab === 'models' })
425
+ ] })
426
+ ] }) }));
427
+ };
428
+ exports.TranscriptionModal = TranscriptionModal;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { TranscriptionModalState } from '../../state/modals';
3
+ export declare const TranscriptionModalWithOptionalWhisper: React.FC<{
4
+ readonly state: TranscriptionModalState;
5
+ }>;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TranscriptionModalWithOptionalWhisper = void 0;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const react_1 = __importStar(require("react"));
39
+ const OptionalPackageModal_1 = require("../OptionalPackageModal");
40
+ const whisper_webgpu_capability_1 = require("./whisper-webgpu-capability");
41
+ const LazyTranscriptionModal = react_1.default.lazy(async () => {
42
+ const { TranscriptionModal } = await Promise.resolve().then(() => __importStar(require('./TranscriptionModal')));
43
+ return { default: TranscriptionModal };
44
+ });
45
+ const TranscriptionModalWithOptionalWhisper = ({ state }) => {
46
+ return (jsx_runtime_1.jsx(OptionalPackageModal_1.OptionalPackageModal, { ariaLabel: "Install transcription package", packageName: whisper_webgpu_capability_1.WHISPER_WEBGPU_PACKAGE, title: "Transcribe", children: jsx_runtime_1.jsx(react_1.Suspense, { fallback: null, children: jsx_runtime_1.jsx(LazyTranscriptionModal, { ...state }) }) }));
47
+ };
48
+ exports.TranscriptionModalWithOptionalWhisper = TranscriptionModalWithOptionalWhisper;
@@ -0,0 +1,2 @@
1
+ export declare const getDefaultCaptionOutputName: (src: string, displayName?: string) => string;
2
+ export declare const validateCaptionOutputName: (outName: string) => string | null;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateCaptionOutputName = exports.getDefaultCaptionOutputName = void 0;
4
+ const public_output_name_1 = require("../public-output-name");
5
+ const getDefaultCaptionOutputName = (src, displayName = 'captions') => {
6
+ return `${(0, public_output_name_1.getDefaultOutputBaseName)(src, displayName, 'captions')}-captions.json`;
7
+ };
8
+ exports.getDefaultCaptionOutputName = getDefaultCaptionOutputName;
9
+ const validateCaptionOutputName = (outName) => (0, public_output_name_1.validatePublicOutputName)({ extension: '.json', outName });
10
+ exports.validateCaptionOutputName = validateCaptionOutputName;
@@ -0,0 +1,6 @@
1
+ export declare const resampleMediaTo16Khz: ({ src, audioStreamIndex, requestInit, onProgress, }: {
2
+ readonly src: string;
3
+ readonly audioStreamIndex: number | null;
4
+ readonly requestInit: Omit<RequestInit, "signal"> | null;
5
+ readonly onProgress: (progress: number) => void;
6
+ }) => Promise<Float32Array<ArrayBufferLike>>;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resampleMediaTo16Khz = void 0;
4
+ const whisper_webgpu_1 = require("@remotion/whisper-webgpu");
5
+ const mediabunny_1 = require("mediabunny");
6
+ const resampleMediaTo16Khz = async ({ src, audioStreamIndex, requestInit, onProgress, }) => {
7
+ var _a, _b;
8
+ const input = new mediabunny_1.Input({
9
+ formats: mediabunny_1.ALL_FORMATS,
10
+ source: new mediabunny_1.UrlSource(src, requestInit === null ? {} : { requestInit }),
11
+ });
12
+ const waveformChunks = [];
13
+ try {
14
+ onProgress(0);
15
+ const audioTracks = await input.getAudioTracks();
16
+ const primaryVideoTrack = audioStreamIndex === null ? await input.getPrimaryVideoTrack() : null;
17
+ const audioTrack = audioStreamIndex !== null
18
+ ? ((_a = audioTracks[audioStreamIndex]) !== null && _a !== void 0 ? _a : null)
19
+ : primaryVideoTrack
20
+ ? await primaryVideoTrack.getPrimaryPairableAudioTrack()
21
+ : ((_b = audioTracks[0]) !== null && _b !== void 0 ? _b : null);
22
+ if (audioTrack === null) {
23
+ throw new Error('The selected media does not have an audio track.');
24
+ }
25
+ if (await audioTrack.isLive()) {
26
+ throw new Error('Live media cannot be transcribed.');
27
+ }
28
+ const output = new mediabunny_1.Output({
29
+ format: new mediabunny_1.WavOutputFormat(),
30
+ target: new mediabunny_1.NullTarget(),
31
+ });
32
+ const conversion = await mediabunny_1.Conversion.init({
33
+ input,
34
+ output,
35
+ tracks: 'all',
36
+ video: { discard: true },
37
+ audio: (track) => {
38
+ if (track.id !== audioTrack.id) {
39
+ return { discard: true };
40
+ }
41
+ return {
42
+ codec: 'pcm-f32',
43
+ forceTranscode: true,
44
+ numberOfChannels: 1,
45
+ process: (sample) => {
46
+ const floats = new Float32Array(sample.allocationSize({ format: 'f32', planeIndex: 0 }) /
47
+ Float32Array.BYTES_PER_ELEMENT);
48
+ sample.copyTo(floats, { format: 'f32', planeIndex: 0 });
49
+ waveformChunks.push({
50
+ startFrame: Math.round(sample.timestamp * whisper_webgpu_1.WHISPER_WEBGPU_SAMPLE_RATE),
51
+ waveform: floats,
52
+ });
53
+ return sample;
54
+ },
55
+ sampleFormat: 'f32',
56
+ sampleRate: whisper_webgpu_1.WHISPER_WEBGPU_SAMPLE_RATE,
57
+ };
58
+ },
59
+ });
60
+ if (!conversion.isValid) {
61
+ throw new Error('The audio track cannot be decoded in this browser. Try converting the media to WAV first.');
62
+ }
63
+ conversion.onProgress = (progress) => onProgress(progress);
64
+ await conversion.execute();
65
+ onProgress(1);
66
+ }
67
+ finally {
68
+ input.dispose();
69
+ }
70
+ const waveformLength = waveformChunks.reduce((maximum, chunk) => Math.max(maximum, chunk.startFrame + chunk.waveform.length), 0);
71
+ const waveform = new Float32Array(waveformLength);
72
+ for (const chunk of waveformChunks) {
73
+ const destinationStart = Math.max(0, chunk.startFrame);
74
+ const sourceStart = Math.max(0, -chunk.startFrame);
75
+ const availableLength = Math.min(chunk.waveform.length - sourceStart, waveform.length - destinationStart);
76
+ if (availableLength > 0) {
77
+ waveform.set(chunk.waveform.subarray(sourceStart, sourceStart + availableLength), destinationStart);
78
+ }
79
+ }
80
+ return waveform;
81
+ };
82
+ exports.resampleMediaTo16Khz = resampleMediaTo16Khz;
@@ -0,0 +1,2 @@
1
+ export declare const WHISPER_LANGUAGES: readonly [readonly ["af", "Afrikaans"], readonly ["sq", "Albanian"], readonly ["am", "Amharic"], readonly ["ar", "Arabic"], readonly ["hy", "Armenian"], readonly ["as", "Assamese"], readonly ["az", "Azerbaijani"], readonly ["ba", "Bashkir"], readonly ["eu", "Basque"], readonly ["be", "Belarusian"], readonly ["bn", "Bengali"], readonly ["bs", "Bosnian"], readonly ["br", "Breton"], readonly ["bg", "Bulgarian"], readonly ["my", "Burmese"], readonly ["ca", "Catalan"], readonly ["zh", "Chinese"], readonly ["hr", "Croatian"], readonly ["cs", "Czech"], readonly ["da", "Danish"], readonly ["nl", "Dutch"], readonly ["en", "English"], readonly ["et", "Estonian"], readonly ["fo", "Faroese"], readonly ["fi", "Finnish"], readonly ["fr", "French"], readonly ["gl", "Galician"], readonly ["ka", "Georgian"], readonly ["de", "German"], readonly ["el", "Greek"], readonly ["gu", "Gujarati"], readonly ["ht", "Haitian Creole"], readonly ["ha", "Hausa"], readonly ["haw", "Hawaiian"], readonly ["he", "Hebrew"], readonly ["hi", "Hindi"], readonly ["hu", "Hungarian"], readonly ["is", "Icelandic"], readonly ["id", "Indonesian"], readonly ["it", "Italian"], readonly ["ja", "Japanese"], readonly ["jw", "Javanese"], readonly ["kn", "Kannada"], readonly ["kk", "Kazakh"], readonly ["km", "Khmer"], readonly ["ko", "Korean"], readonly ["lo", "Lao"], readonly ["la", "Latin"], readonly ["lv", "Latvian"], readonly ["ln", "Lingala"], readonly ["lt", "Lithuanian"], readonly ["lb", "Luxembourgish"], readonly ["mk", "Macedonian"], readonly ["mg", "Malagasy"], readonly ["ms", "Malay"], readonly ["ml", "Malayalam"], readonly ["mt", "Maltese"], readonly ["mi", "Maori"], readonly ["mr", "Marathi"], readonly ["mn", "Mongolian"], readonly ["ne", "Nepali"], readonly ["no", "Norwegian"], readonly ["nn", "Nynorsk"], readonly ["oc", "Occitan"], readonly ["ps", "Pashto"], readonly ["fa", "Persian"], readonly ["pl", "Polish"], readonly ["pt", "Portuguese"], readonly ["pa", "Punjabi"], readonly ["ro", "Romanian"], readonly ["ru", "Russian"], readonly ["sa", "Sanskrit"], readonly ["sr", "Serbian"], readonly ["sn", "Shona"], readonly ["sd", "Sindhi"], readonly ["si", "Sinhala"], readonly ["sk", "Slovak"], readonly ["sl", "Slovenian"], readonly ["so", "Somali"], readonly ["es", "Spanish"], readonly ["su", "Sundanese"], readonly ["sw", "Swahili"], readonly ["sv", "Swedish"], readonly ["tl", "Tagalog"], readonly ["tg", "Tajik"], readonly ["ta", "Tamil"], readonly ["tt", "Tatar"], readonly ["te", "Telugu"], readonly ["th", "Thai"], readonly ["bo", "Tibetan"], readonly ["tr", "Turkish"], readonly ["tk", "Turkmen"], readonly ["uk", "Ukrainian"], readonly ["ur", "Urdu"], readonly ["uz", "Uzbek"], readonly ["vi", "Vietnamese"], readonly ["cy", "Welsh"], readonly ["yi", "Yiddish"], readonly ["yo", "Yoruba"]];
2
+ export type WhisperLanguage = (typeof WHISPER_LANGUAGES)[number][0];