@gentbajko/slopify 2.5.0 → 3.0.1

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 (542) hide show
  1. package/LICENSE +201 -21
  2. package/NOTICE +12 -0
  3. package/README.md +24 -41
  4. package/SUBTITLES.md +1 -1
  5. package/dist/adapter-registry.js +31 -0
  6. package/dist/adapters/alignment/cache.js +4 -1
  7. package/dist/adapters/alignment/ctc.js +25 -23
  8. package/dist/adapters/alignment/index.js +37 -6
  9. package/dist/adapters/alignment/multilingual.js +267 -0
  10. package/dist/adapters/alignment/protocol.js +11 -0
  11. package/dist/adapters/alignment/quality.js +4 -3
  12. package/dist/adapters/alignment/sentences.js +95 -0
  13. package/dist/adapters/alignment/spec.js +24 -0
  14. package/dist/adapters/alignment/spell.js +769 -0
  15. package/dist/adapters/alignment/text.js +56 -9
  16. package/dist/adapters/alignment/window.js +34 -30
  17. package/dist/adapters/alignment/worker.js +23 -21
  18. package/dist/adapters/explain.js +11 -11
  19. package/dist/adapters/host-cli/index.js +44 -5
  20. package/dist/adapters/host-cli/transport.js +7 -5
  21. package/dist/adapters/image/bytes.js +2 -2
  22. package/dist/adapters/image/codex-output.js +1 -1
  23. package/dist/adapters/image/codex.js +87 -22
  24. package/dist/adapters/image/fal.js +13 -5
  25. package/dist/adapters/image/google.js +11 -8
  26. package/dist/adapters/image/openai.js +14 -7
  27. package/dist/adapters/image/reference.js +34 -0
  28. package/dist/adapters/image/replicate.js +7 -2
  29. package/dist/adapters/image/video.js +2 -2
  30. package/dist/adapters/key-probes.js +85 -0
  31. package/dist/adapters/llm/claude-code.js +168 -32
  32. package/dist/adapters/llm/cli-login-error.js +1 -1
  33. package/dist/adapters/llm/codex-limits.js +157 -0
  34. package/dist/adapters/llm/codex.js +99 -12
  35. package/dist/adapters/llm/document-workspace.js +2 -2
  36. package/dist/adapters/llm/gemini-workspace.js +1 -1
  37. package/dist/adapters/llm/gemini.js +16 -3
  38. package/dist/adapters/llm/image-workspace.js +58 -0
  39. package/dist/adapters/llm/openrouter.js +11 -3
  40. package/dist/adapters/llm/run-cli.js +12 -7
  41. package/dist/adapters/tts/cartesia.js +10 -0
  42. package/dist/adapters/tts/elevenlabs.js +31 -9
  43. package/dist/adapters/tts/gemini.js +206 -0
  44. package/dist/adapters/tts/inworld-async.js +9 -5
  45. package/dist/adapters/tts/inworld.js +17 -3
  46. package/dist/adapters/tts/openai.js +3 -0
  47. package/dist/adapters/tts/pcm-mp3.js +62 -0
  48. package/dist/adapters/tts/system.js +147 -0
  49. package/dist/adapters/tts/voice-languages.js +80 -0
  50. package/dist/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  51. package/dist/assets/fonts/noto/NotoSansArabic-Regular.ttf +0 -0
  52. package/dist/assets/fonts/noto/NotoSansDevanagari-Regular.ttf +0 -0
  53. package/dist/assets/fonts/noto/NotoSansHebrew-Regular.ttf +0 -0
  54. package/dist/assets/fonts/noto/NotoSansThai-Regular.ttf +0 -0
  55. package/dist/assets/fonts/noto/OFL.txt +93 -0
  56. package/dist/assets/fonts/noto/SOURCE.txt +18 -0
  57. package/dist/assets/models.yaml +38 -0
  58. package/dist/assets/sample/sample-audiobook.tar +0 -0
  59. package/dist/assets/sample/sample-podcast.tar +0 -0
  60. package/dist/assets/sample/sample-project.tar +0 -0
  61. package/dist/assets/style-preview/narration.mp3 +0 -0
  62. package/dist/assets/style-preview/tall-1.jpg +0 -0
  63. package/dist/assets/style-preview/tall-2.jpg +0 -0
  64. package/dist/assets/style-preview/tall-3.jpg +0 -0
  65. package/dist/assets/style-preview/wide-1.jpg +0 -0
  66. package/dist/assets/style-preview/wide-2.jpg +0 -0
  67. package/dist/assets/style-preview/wide-3.jpg +0 -0
  68. package/dist/catalog/merge.js +132 -0
  69. package/dist/catalog/registry.js +17 -14
  70. package/dist/catalog/schema.js +2 -0
  71. package/dist/catalog/store.js +147 -8
  72. package/dist/catalog/validate.js +2 -2
  73. package/dist/compose.yaml +71 -0
  74. package/dist/edge/autostart/docker-record.js +32 -0
  75. package/dist/edge/autostart/docker.js +118 -0
  76. package/dist/edge/autostart/index.js +78 -0
  77. package/dist/edge/autostart/launcher.js +176 -0
  78. package/dist/edge/autostart/model.js +3 -0
  79. package/dist/edge/autostart/native.js +210 -0
  80. package/dist/edge/autostart/prompt.js +72 -0
  81. package/dist/edge/autostart/service.js +90 -0
  82. package/dist/edge/cli-args.js +71 -0
  83. package/dist/edge/cli.js +64 -63
  84. package/dist/edge/docker-install/activation.js +56 -0
  85. package/dist/edge/docker-install/apply.js +458 -0
  86. package/dist/edge/docker-install/engine.js +362 -0
  87. package/dist/edge/docker-install/run.js +160 -0
  88. package/dist/edge/docker-install/state.js +146 -0
  89. package/dist/edge/{docker-projects → docker-install}/volume.js +1 -5
  90. package/dist/edge/docker.js +14 -22
  91. package/dist/edge/events/hub.js +3 -1
  92. package/dist/edge/host-cli.js +1 -1
  93. package/dist/edge/http/actions.js +38 -11
  94. package/dist/edge/http/app.js +60 -2
  95. package/dist/edge/http/auditions.js +70 -0
  96. package/dist/edge/http/autostart.js +37 -0
  97. package/dist/edge/http/byte-range.js +42 -0
  98. package/dist/edge/http/channel-memory.js +92 -0
  99. package/dist/edge/http/channels.js +128 -0
  100. package/dist/edge/http/diagnostics.js +1 -0
  101. package/dist/edge/http/draft-files.js +2 -4
  102. package/dist/edge/http/entries.js +22 -3
  103. package/dist/edge/http/files.js +11 -7
  104. package/dist/edge/http/folder-location.js +1 -1
  105. package/dist/edge/http/home.js +39 -0
  106. package/dist/edge/http/host-cli.js +29 -5
  107. package/dist/edge/http/narration-peaks.js +76 -0
  108. package/dist/edge/http/onboarding.js +212 -0
  109. package/dist/edge/http/open-folder.js +1 -1
  110. package/dist/edge/http/patch-notes.js +45 -0
  111. package/dist/edge/http/planning.js +4 -2
  112. package/dist/edge/http/project-create.js +87 -0
  113. package/dist/edge/http/project-templates.js +19 -2
  114. package/dist/edge/http/projects.js +37 -100
  115. package/dist/edge/http/prompts.js +40 -3
  116. package/dist/edge/http/pronunciations.js +23 -4
  117. package/dist/edge/http/providers.js +119 -3
  118. package/dist/edge/http/reviews.js +131 -0
  119. package/dist/edge/http/revision-files.js +3 -5
  120. package/dist/edge/http/revisions.js +1 -1
  121. package/dist/edge/http/run-cost.js +25 -0
  122. package/dist/edge/http/schedules.js +115 -6
  123. package/dist/edge/http/settings.js +84 -6
  124. package/dist/edge/http/storage-files.js +50 -0
  125. package/dist/edge/http/storage.js +43 -2
  126. package/dist/edge/http/studio.js +287 -0
  127. package/dist/edge/http/style-preview.js +61 -0
  128. package/dist/edge/http/subtitles.js +1 -1
  129. package/dist/edge/http/trash.js +69 -0
  130. package/dist/edge/http/tutorials.js +59 -0
  131. package/dist/edge/http/update.js +24 -3
  132. package/dist/edge/http/whats-new.js +15 -0
  133. package/dist/edge/http/youtube-edits.js +92 -0
  134. package/dist/edge/native-update.js +62 -0
  135. package/dist/extension/slopify-studio-chrome.zip +0 -0
  136. package/dist/extension/slopify-studio-firefox.zip +0 -0
  137. package/dist/host-cli/gemini-login.js +83 -0
  138. package/dist/host-cli/open-folder.js +10 -10
  139. package/dist/host-cli/runtime.js +9 -1
  140. package/dist/host-cli/status.js +4 -2
  141. package/dist/kernel/db/migrations/0025-automatic-reviews.sql +40 -0
  142. package/dist/kernel/db/migrations/0026-schedule-topic-generation.sql +23 -0
  143. package/dist/kernel/db/migrations/0027-run-cost.sql +58 -0
  144. package/dist/kernel/db/migrations/0030-automatic-retries.sql +18 -0
  145. package/dist/kernel/db/migrations/0031-prompt-history-and-description-edits.sql +33 -0
  146. package/dist/kernel/db/migrations/0032-channels.sql +65 -0
  147. package/dist/kernel/db/migrations/0034-script-prompts.sql +23 -0
  148. package/dist/kernel/db/migrations/0035-narration-aliases.sql +13 -0
  149. package/dist/kernel/db/migrations/0037-project-uploads.sql +8 -0
  150. package/dist/kernel/db/migrations/0038-voice-languages.sql +7 -0
  151. package/dist/kernel/db/migrations/0039-channel-essentials.sql +64 -0
  152. package/dist/kernel/db/migrations/0040-standalone-usage.sql +35 -0
  153. package/dist/kernel/db/migrations/0041-cast-hosts.sql +3 -0
  154. package/dist/kernel/paths.js +27 -6
  155. package/dist/kernel/pipeline.js +4 -1
  156. package/dist/kernel/ports/host-cli.js +122 -14
  157. package/dist/kernel/ports/key-probe.js +1 -0
  158. package/dist/kernel/ports/languages.js +157 -0
  159. package/dist/kernel/ports/model.js +10 -5
  160. package/dist/kernel/ports/narration-aliases.js +60 -0
  161. package/dist/kernel/ports/plan-limits.js +36 -0
  162. package/dist/kernel/ports/system-speech.js +203 -0
  163. package/dist/kernel/runner/attempt.js +17 -8
  164. package/dist/kernel/runner/audition.js +36 -0
  165. package/dist/kernel/runner/graph.js +40 -5
  166. package/dist/kernel/runner/index.js +39 -9
  167. package/dist/kernel/runner/meter.js +1 -0
  168. package/dist/kernel/runner/providers.js +142 -7
  169. package/dist/kernel/runner/retry-policy.js +43 -0
  170. package/dist/kernel/runner/standalone.js +134 -0
  171. package/dist/kernel/runner/work-authority.js +28 -2
  172. package/dist/main.js +277 -16
  173. package/dist/model-catalog.js +2 -0
  174. package/dist/patch-notes/0.4.2-to-1.0.md +93 -0
  175. package/dist/patch-notes/1.0-to-2.0.md +74 -0
  176. package/dist/patch-notes/2.0-to-3.0.md +257 -0
  177. package/dist/patch-notes/3.0.0.md +70 -0
  178. package/dist/patch-notes/3.0.1.md +105 -0
  179. package/dist/patch-notes/index.json +32 -0
  180. package/dist/slices/admission/model.js +27 -0
  181. package/dist/slices/admission/repo.js +24 -4
  182. package/dist/slices/admission/rules.js +80 -2
  183. package/dist/slices/admission/schema.js +58 -1
  184. package/dist/slices/admission/short-mode.js +47 -0
  185. package/dist/slices/admission/start.js +42 -6
  186. package/dist/slices/article/continuation.js +2 -2
  187. package/dist/slices/article/provided-entries.js +2 -2
  188. package/dist/slices/article/run.js +6 -2
  189. package/dist/slices/article/segments.js +3 -3
  190. package/dist/slices/backups/folder.js +14 -6
  191. package/dist/slices/batch/index.js +7 -2
  192. package/dist/slices/cancel/index.js +1 -1
  193. package/dist/slices/channels/cast-images.js +110 -0
  194. package/dist/slices/channels/cast-match.js +32 -0
  195. package/dist/slices/channels/images.js +19 -0
  196. package/dist/slices/channels/model.js +5 -0
  197. package/dist/slices/channels/rebrand.js +100 -0
  198. package/dist/slices/channels/repo.js +221 -0
  199. package/dist/slices/channels/runs.js +129 -0
  200. package/dist/slices/channels/schema.js +152 -0
  201. package/dist/slices/channels/service.js +180 -0
  202. package/dist/slices/channels/studio-csv.js +110 -0
  203. package/dist/slices/channels/videos.js +120 -0
  204. package/dist/slices/checkpoints/recovery.js +10 -0
  205. package/dist/slices/control/index.js +5 -2
  206. package/dist/slices/control/providers.js +4 -1
  207. package/dist/slices/document/fonts.js +1 -1
  208. package/dist/slices/document/render.js +1 -1
  209. package/dist/slices/episodes/related.js +90 -0
  210. package/dist/slices/episodes/repo.js +60 -0
  211. package/dist/slices/episodes/service.js +58 -0
  212. package/dist/slices/episodes/summarize.js +170 -0
  213. package/dist/slices/estimate/index.js +109 -28
  214. package/dist/slices/estimate/requests.js +68 -2
  215. package/dist/slices/eta/history.js +56 -0
  216. package/dist/slices/eta/model.js +63 -0
  217. package/dist/slices/eta/view.js +25 -0
  218. package/dist/slices/fixes/rules.js +73 -0
  219. package/dist/slices/fonts/coverage.js +82 -0
  220. package/dist/slices/fonts/sfnt.js +74 -0
  221. package/dist/slices/images/run.js +8 -5
  222. package/dist/slices/images/scale.js +84 -0
  223. package/dist/slices/library/diff.js +122 -0
  224. package/dist/slices/library/history.js +100 -0
  225. package/dist/slices/library/model.js +3 -0
  226. package/dist/slices/library/photorealistic.js +49 -0
  227. package/dist/slices/library/repo.js +19 -14
  228. package/dist/slices/library/save.js +62 -12
  229. package/dist/slices/library/slots.js +7 -1
  230. package/dist/slices/library/used-by.js +153 -0
  231. package/dist/slices/loudness/level-pieces.js +41 -0
  232. package/dist/slices/loudness/loudnorm.js +164 -0
  233. package/dist/slices/loudness/model.js +153 -0
  234. package/dist/slices/model-upkeep/model.js +10 -0
  235. package/dist/slices/model-upkeep/switch.js +217 -0
  236. package/dist/slices/model-upkeep/usage.js +185 -0
  237. package/dist/slices/narration/aliases-library.js +31 -0
  238. package/dist/slices/narration/aliases-schema.js +53 -0
  239. package/dist/slices/narration/aliases.js +49 -0
  240. package/dist/slices/narration/blocks.js +352 -0
  241. package/dist/slices/narration/chunk.js +19 -7
  242. package/dist/slices/narration/concat.js +2 -2
  243. package/dist/slices/narration/describe.js +45 -0
  244. package/dist/slices/narration/pauses-model.js +63 -0
  245. package/dist/slices/narration/pauses.js +269 -0
  246. package/dist/slices/narration/peaks-model.js +1 -0
  247. package/dist/slices/narration/peaks.js +94 -0
  248. package/dist/slices/narration/preparation.js +21 -3
  249. package/dist/slices/narration/pronunciation-chunks.js +3 -3
  250. package/dist/slices/narration/pronunciation.js +72 -25
  251. package/dist/slices/narration/run.js +6 -6
  252. package/dist/slices/narration/shared-glossary.js +1 -1
  253. package/dist/slices/narration/steering.js +15 -4
  254. package/dist/slices/notifications/notifier.js +47 -3
  255. package/dist/slices/notifications/rules.js +48 -3
  256. package/dist/slices/onboarding/copy.js +143 -0
  257. package/dist/slices/onboarding/first-run.js +72 -0
  258. package/dist/slices/onboarding/full-video.js +81 -0
  259. package/dist/slices/onboarding/install.js +119 -0
  260. package/dist/slices/onboarding/model.js +85 -0
  261. package/dist/slices/onboarding/packs.js +491 -0
  262. package/dist/slices/onboarding/quick-short.js +144 -0
  263. package/dist/slices/onboarding/sample.js +132 -0
  264. package/dist/slices/onboarding/state.js +68 -0
  265. package/dist/slices/onboarding/template.js +73 -0
  266. package/dist/slices/patch-notes/library.js +73 -0
  267. package/dist/slices/patch-notes/seen.js +77 -0
  268. package/dist/slices/play-drafts/convert.js +127 -8
  269. package/dist/slices/play-drafts/readiness.js +4 -1
  270. package/dist/slices/play-drafts/repo.js +2 -0
  271. package/dist/slices/play-drafts/review-inputs.js +20 -3
  272. package/dist/slices/play-drafts/schema.js +89 -0
  273. package/dist/slices/play-drafts/service.js +4 -1
  274. package/dist/slices/play-drafts/start.js +43 -18
  275. package/dist/slices/project-templates/from-project.js +59 -6
  276. package/dist/slices/project-templates/next-chapter.js +94 -0
  277. package/dist/slices/project-templates/one-off.js +26 -0
  278. package/dist/slices/project-templates/repo.js +2 -1
  279. package/dist/slices/project-templates/schema.js +7 -1
  280. package/dist/slices/project-templates/service.js +15 -4
  281. package/dist/slices/project-templates/setup.js +18 -2
  282. package/dist/slices/rebuild/admission-repo.js +1 -1
  283. package/dist/slices/rebuild/model.js +6 -0
  284. package/dist/slices/rebuild/preview-details.js +46 -3
  285. package/dist/slices/rebuild/preview-plan.js +13 -6
  286. package/dist/slices/rebuild/recipe-audio-parts.js +40 -7
  287. package/dist/slices/rebuild/recipe-audio.js +66 -12
  288. package/dist/slices/rebuild/recipe-build.js +8 -4
  289. package/dist/slices/rebuild/recipe-cast.js +18 -0
  290. package/dist/slices/rebuild/recipe-checkpoints.js +11 -9
  291. package/dist/slices/rebuild/recipe-describe.js +93 -0
  292. package/dist/slices/rebuild/recipe-edit.js +13 -1
  293. package/dist/slices/rebuild/recipe-exports.js +67 -8
  294. package/dist/slices/rebuild/recipe-input-schema.js +35 -0
  295. package/dist/slices/rebuild/recipe-legacy.js +9 -0
  296. package/dist/slices/rebuild/recipe-loudness.js +45 -0
  297. package/dist/slices/rebuild/recipe-model.js +25 -6
  298. package/dist/slices/rebuild/recipe-pauses.js +7 -0
  299. package/dist/slices/rebuild/recipe-preparation.js +3 -3
  300. package/dist/slices/rebuild/recipe-provider-choice.js +11 -1
  301. package/dist/slices/rebuild/recipe-reference.js +15 -1
  302. package/dist/slices/rebuild/recipe-reviews.js +117 -0
  303. package/dist/slices/rebuild/recipe-save.js +4 -1
  304. package/dist/slices/rebuild/recipe-shorts.js +23 -3
  305. package/dist/slices/rebuild/recipe-text.js +114 -19
  306. package/dist/slices/rebuild/recipe-validation.js +14 -2
  307. package/dist/slices/rebuild/recipe-visual.js +96 -33
  308. package/dist/slices/rebuild/recipe-voices.js +286 -0
  309. package/dist/slices/rebuild/recipe-work.js +77 -6
  310. package/dist/slices/rebuild/recipe-youtube.js +2 -0
  311. package/dist/slices/rebuild/recovery-conflict.js +7 -3
  312. package/dist/slices/rebuild/recovery-model.js +3 -0
  313. package/dist/slices/rebuild/recovery-selection.js +28 -2
  314. package/dist/slices/rebuild/recovery.js +35 -17
  315. package/dist/slices/rebuild/repo.js +3 -3
  316. package/dist/slices/rebuild/retry.js +18 -0
  317. package/dist/slices/rebuild/review-redo.js +125 -0
  318. package/dist/slices/rebuild/runtime-actions.js +5 -0
  319. package/dist/slices/rebuild/runtime-admission.js +4 -1
  320. package/dist/slices/rebuild/runtime-animate.js +4 -4
  321. package/dist/slices/rebuild/runtime-article.js +5 -5
  322. package/dist/slices/rebuild/runtime-document.js +4 -4
  323. package/dist/slices/rebuild/runtime-export-bed.js +43 -0
  324. package/dist/slices/rebuild/runtime-export-edit.js +70 -11
  325. package/dist/slices/rebuild/runtime-export-inputs.js +52 -10
  326. package/dist/slices/rebuild/runtime-export-short.js +85 -0
  327. package/dist/slices/rebuild/runtime-export.js +84 -19
  328. package/dist/slices/rebuild/runtime-figure-card.js +87 -0
  329. package/dist/slices/rebuild/runtime-image.js +21 -2
  330. package/dist/slices/rebuild/runtime-local.js +148 -24
  331. package/dist/slices/rebuild/runtime-materialize.js +8 -0
  332. package/dist/slices/rebuild/runtime-narration-reuse.js +2 -1
  333. package/dist/slices/rebuild/runtime-narration-text.js +7 -7
  334. package/dist/slices/rebuild/runtime-pictures.js +28 -0
  335. package/dist/slices/rebuild/runtime-piece-label.js +27 -0
  336. package/dist/slices/rebuild/runtime-provider.js +126 -18
  337. package/dist/slices/rebuild/runtime-publication.js +21 -5
  338. package/dist/slices/rebuild/runtime-review.js +267 -0
  339. package/dist/slices/rebuild/runtime-run.js +17 -11
  340. package/dist/slices/rebuild/runtime-shorts.js +44 -17
  341. package/dist/slices/rebuild/runtime-store.js +62 -11
  342. package/dist/slices/rebuild/runtime-subtitles.js +72 -19
  343. package/dist/slices/rebuild/runtime-voices.js +103 -0
  344. package/dist/slices/rebuild/runtime-youtube.js +7 -6
  345. package/dist/slices/rebuild/service-readiness.js +3 -3
  346. package/dist/slices/rebuild/soften.js +49 -0
  347. package/dist/slices/rebuild/transition-repo.js +9 -2
  348. package/dist/slices/research/run.js +4 -4
  349. package/dist/slices/research/synthesis.js +2 -2
  350. package/dist/slices/reviews/model.js +105 -0
  351. package/dist/slices/reviews/outcome.js +22 -0
  352. package/dist/slices/reviews/repo.js +118 -0
  353. package/dist/slices/reviews/rules.js +63 -0
  354. package/dist/slices/reviews/verdict.js +71 -0
  355. package/dist/slices/reviews/view.js +30 -0
  356. package/dist/slices/revisions/adopt-content.js +5 -2
  357. package/dist/slices/revisions/adopt.js +3 -1
  358. package/dist/slices/revisions/downloads.js +7 -1
  359. package/dist/slices/revisions/image-plan.js +183 -0
  360. package/dist/slices/revisions/mutation-assets.js +10 -0
  361. package/dist/slices/revisions/mutation-cues.js +71 -0
  362. package/dist/slices/revisions/mutation-request.js +2 -1
  363. package/dist/slices/revisions/mutations.js +97 -3
  364. package/dist/slices/revisions/schema.js +11 -1
  365. package/dist/slices/run-cost/limits.js +128 -0
  366. package/dist/slices/run-cost/meter.js +47 -0
  367. package/dist/slices/run-cost/panel.js +256 -0
  368. package/dist/slices/run-cost/pricing.js +95 -0
  369. package/dist/slices/run-cost/week.js +108 -0
  370. package/dist/slices/schedules/agenda.js +222 -0
  371. package/dist/slices/schedules/repo.js +58 -18
  372. package/dist/slices/schedules/scheduler.js +68 -17
  373. package/dist/slices/schedules/schema.js +179 -1
  374. package/dist/slices/schedules/service.js +43 -4
  375. package/dist/slices/schedules/similar.js +128 -0
  376. package/dist/slices/schedules/topic-list.js +163 -0
  377. package/dist/slices/schedules/topics.js +523 -0
  378. package/dist/slices/settings/first-run.js +106 -0
  379. package/dist/slices/settings/health.js +247 -0
  380. package/dist/slices/settings/key-guides.js +138 -0
  381. package/dist/slices/settings/key-test.js +93 -0
  382. package/dist/slices/settings/keys.js +10 -5
  383. package/dist/slices/settings/model-reach.js +52 -0
  384. package/dist/slices/settings/model.js +55 -1
  385. package/dist/slices/settings/models.js +5 -1
  386. package/dist/slices/settings/playback.js +15 -0
  387. package/dist/slices/settings/readiness.js +14 -2
  388. package/dist/slices/settings/repo.js +17 -3
  389. package/dist/slices/settings/tutorial-schema.js +5 -0
  390. package/dist/slices/settings/voices.js +64 -4
  391. package/dist/slices/settings/whats-new.js +64 -0
  392. package/dist/slices/shorts/captions.js +9 -0
  393. package/dist/slices/shorts/pick.js +3 -3
  394. package/dist/slices/shorts/prompts.js +1 -1
  395. package/dist/slices/shorts/render.js +63 -13
  396. package/dist/slices/storage/asset-name.js +3 -0
  397. package/dist/slices/storage/backup-export.js +48 -9
  398. package/dist/slices/storage/backup-format.js +38 -1
  399. package/dist/slices/storage/backup-import.js +191 -19
  400. package/dist/slices/storage/delete-project.js +7 -4
  401. package/dist/slices/storage/documents.js +87 -0
  402. package/dist/slices/storage/downloads.js +33 -1
  403. package/dist/slices/storage/files-location.js +531 -0
  404. package/dist/slices/storage/layout.js +14 -4
  405. package/dist/slices/storage/model.js +11 -0
  406. package/dist/slices/storage/portable.js +94 -12
  407. package/dist/slices/storage/reconcile.js +14 -1
  408. package/dist/slices/storage/repo.js +4 -1
  409. package/dist/slices/storage/schema.js +11 -0
  410. package/dist/slices/storage/trim.js +146 -0
  411. package/dist/slices/studio/disclosure.js +74 -0
  412. package/dist/slices/studio/model.js +30 -0
  413. package/dist/slices/studio/pack.js +211 -0
  414. package/dist/slices/studio/queue.js +69 -0
  415. package/dist/slices/studio/settings.js +170 -0
  416. package/dist/slices/style-preview/images.js +61 -0
  417. package/dist/slices/style-preview/narration.js +33 -0
  418. package/dist/slices/style-preview/render.js +148 -0
  419. package/dist/slices/style-preview/schema.js +59 -0
  420. package/dist/slices/style-preview/service.js +92 -0
  421. package/dist/slices/style-preview/settings.js +139 -0
  422. package/dist/slices/subtitles/captions.js +42 -9
  423. package/dist/slices/subtitles/model.js +22 -0
  424. package/dist/slices/subtitles/prepare.js +27 -16
  425. package/dist/slices/subtitles/transcript.js +1 -1
  426. package/dist/slices/thumbnail/run.js +7 -7
  427. package/dist/slices/trash/model.js +25 -0
  428. package/dist/slices/trash/service.js +273 -0
  429. package/dist/slices/tutorials/anchors.js +57 -0
  430. package/dist/slices/tutorials/library.js +185 -0
  431. package/dist/slices/uploads/repo.js +20 -0
  432. package/dist/slices/video/ambient-bed-schema.js +15 -0
  433. package/dist/slices/video/ambient-bed.js +95 -0
  434. package/dist/slices/video/ambient-mix.js +72 -0
  435. package/dist/slices/video/audio-inputs.js +2 -2
  436. package/dist/slices/video/cards.js +5 -2
  437. package/dist/slices/video/edit-list.js +23 -2
  438. package/dist/slices/video/edit-settings.js +13 -3
  439. package/dist/slices/video/ffmpeg.js +63 -9
  440. package/dist/slices/video/figure-card.js +492 -0
  441. package/dist/slices/video/figure-spans.js +51 -0
  442. package/dist/slices/video/plan.js +125 -13
  443. package/dist/slices/video/run.js +14 -12
  444. package/dist/slices/video/slideshow.js +39 -4
  445. package/dist/slices/voices/attribution.js +69 -0
  446. package/dist/slices/voices/audio-files.js +87 -0
  447. package/dist/slices/voices/audition.js +25 -0
  448. package/dist/slices/voices/cast.js +74 -0
  449. package/dist/slices/voices/grouping.js +59 -0
  450. package/dist/slices/voices/join.js +35 -0
  451. package/dist/slices/voices/languages.js +25 -0
  452. package/dist/slices/voices/model.js +218 -0
  453. package/dist/slices/voices/palette.js +26 -0
  454. package/dist/slices/voices/panel.js +91 -0
  455. package/dist/slices/voices/portraits.js +55 -0
  456. package/dist/slices/voices/script.js +136 -0
  457. package/dist/slices/voices/timing.js +58 -0
  458. package/dist/slices/youtube/answer.js +1 -1
  459. package/dist/slices/youtube/chapters.js +126 -0
  460. package/dist/slices/youtube/edits-repo.js +84 -0
  461. package/dist/slices/youtube/edits.js +89 -0
  462. package/dist/slices/youtube/placeholders.js +98 -0
  463. package/dist/slices/youtube/transcript.js +11 -4
  464. package/dist/tutorials/AI-CLIs.md +146 -0
  465. package/dist/tutorials/Backups.md +121 -0
  466. package/dist/tutorials/Calendar.md +103 -0
  467. package/dist/tutorials/Cast-Library.md +112 -0
  468. package/dist/tutorials/Channels.md +148 -0
  469. package/dist/tutorials/Costs-and-Run-Cost.md +136 -0
  470. package/dist/tutorials/Docker.md +171 -0
  471. package/dist/tutorials/Document-Themes.md +207 -0
  472. package/dist/tutorials/Editing-a-Project.md +204 -0
  473. package/dist/tutorials/FAQ.md +134 -0
  474. package/dist/tutorials/First-Launch-and-Welcome.md +153 -0
  475. package/dist/tutorials/Home-and-Projects.md +174 -0
  476. package/dist/tutorials/Home.md +119 -0
  477. package/dist/tutorials/Install.md +154 -0
  478. package/dist/tutorials/Intros-and-Outros.md +86 -0
  479. package/dist/tutorials/Keyboard-Shortcuts-and-Command-Palette.md +215 -0
  480. package/dist/tutorials/Library-Overview.md +75 -0
  481. package/dist/tutorials/Models.md +133 -0
  482. package/dist/tutorials/Multiple-Voices.md +161 -0
  483. package/dist/tutorials/Narration-Aliases-and-Glossary.md +129 -0
  484. package/dist/tutorials/Notifications.md +86 -0
  485. package/dist/tutorials/Other-Languages.md +110 -0
  486. package/dist/tutorials/PDF-Documents.md +100 -0
  487. package/dist/tutorials/Play-Images.md +135 -0
  488. package/dist/tutorials/Play-Narration.md +167 -0
  489. package/dist/tutorials/Play-Outputs.md +109 -0
  490. package/dist/tutorials/Play-Overview.md +216 -0
  491. package/dist/tutorials/Play-Title-and-Article.md +135 -0
  492. package/dist/tutorials/Play-Video-and-Style.md +143 -0
  493. package/dist/tutorials/Project-Page.md +228 -0
  494. package/dist/tutorials/Prompts.md +136 -0
  495. package/dist/tutorials/Providers-and-Keys.md +290 -0
  496. package/dist/tutorials/Publishing-to-YouTube.md +135 -0
  497. package/dist/tutorials/Recovery-and-Retries.md +141 -0
  498. package/dist/tutorials/Reviews-and-Checkpoints.md +143 -0
  499. package/dist/tutorials/Schedules.md +154 -0
  500. package/dist/tutorials/Settings-Reference.md +258 -0
  501. package/dist/tutorials/Shorts.md +116 -0
  502. package/dist/tutorials/Start-at-Login.md +126 -0
  503. package/dist/tutorials/Studio-Extension.md +146 -0
  504. package/dist/tutorials/Templates.md +146 -0
  505. package/dist/tutorials/Trash.md +87 -0
  506. package/dist/tutorials/Troubleshooting.md +149 -0
  507. package/dist/tutorials/Uninstalling-and-Moving.md +113 -0
  508. package/dist/tutorials/Updating-and-Patch-Notes.md +120 -0
  509. package/dist/tutorials/Video-Editing.md +135 -0
  510. package/dist/tutorials/Where-Your-Files-Live.md +149 -0
  511. package/dist/tutorials/YouTube-Description.md +132 -0
  512. package/dist/tutorials/Your-First-Short.md +125 -0
  513. package/dist/tutorials/_Footer.md +1 -0
  514. package/dist/tutorials/_Sidebar.md +69 -0
  515. package/dist/updater/service.js +66 -21
  516. package/dist/web/assets/index-DBLSfqA-.css +1 -0
  517. package/dist/web/assets/index-DFdIhmm0.js +307 -0
  518. package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  519. package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  520. package/dist/web/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  521. package/dist/web/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  522. package/dist/web/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  523. package/dist/web/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  524. package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  525. package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  526. package/dist/web/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  527. package/dist/web/assets/{pdf-BLF2i8c2.js → pdf-B9OY1ioX.js} +1 -1
  528. package/dist/web/index.html +2 -2
  529. package/package.json +5 -5
  530. package/dist/edge/docker-launch.js +0 -81
  531. package/dist/edge/docker-projects/activation.js +0 -35
  532. package/dist/edge/docker-projects/claims.js +0 -85
  533. package/dist/edge/docker-projects/committed.js +0 -40
  534. package/dist/edge/docker-projects/engine.js +0 -461
  535. package/dist/edge/docker-projects/install.js +0 -254
  536. package/dist/edge/docker-projects/prune.js +0 -66
  537. package/dist/edge/docker-projects/recover.js +0 -100
  538. package/dist/edge/docker-projects/state.js +0 -225
  539. package/dist/web/assets/index-CktpxlJd.js +0 -171
  540. package/dist/web/assets/index-DB-vOnGU.css +0 -1
  541. package/scripts/docker-run.sh +0 -3
  542. /package/dist/edge/{docker-projects → docker-install}/tree.js +0 -0
@@ -0,0 +1,133 @@
1
+ # Models
2
+
3
+ Slopify keeps a model catalogue: the list of models, prices and retirements that the model pickers and cost estimates use. It checks for new models and price changes by itself, and tells you when something you use has been retired so you can switch it in one click.
4
+
5
+ **Where to find it:** Settings → Models.
6
+
7
+ ## What the catalogue covers
8
+
9
+ The catalogue lists the models of the providers that take an API key:
10
+
11
+ | Kind | Providers |
12
+ |---|---|
13
+ | Text | OpenRouter |
14
+ | Speech | ElevenLabs, OpenAI, Cartesia, Inworld |
15
+ | Images | OpenAI, Google, fal.ai, Replicate |
16
+ | Animated clips (image to video) | fal.ai, Replicate |
17
+
18
+ For each model it holds a name, a price (per token, per character, per image or per second) and whether the model is retired. A model with no price is counted as unknown, never as free.
19
+
20
+ The command-line tools (Claude Code, Codex, Gemini) are not in the catalogue. Their pickers show the models the tool installed on your computer offers, and **Check all** in Settings → Providers checks them. See [AI CLIs](AI-CLIs).
21
+
22
+ The catalogue also sets how many calls each keyed provider runs at once (3 for most, 5 for Inworld).
23
+
24
+ ## How it stays current
25
+
26
+ When Slopify starts, and then once a day, it checks two sources:
27
+
28
+ - the published catalogue file in the Slopify repository, and
29
+ - OpenRouter's public model list (live model IDs and per-token prices; no key needed).
30
+
31
+ It folds what it finds into your local catalogue file:
32
+
33
+ - New models appear in the pickers.
34
+ - Prices follow the published list, and OpenRouter models follow OpenRouter's live prices.
35
+ - A model the published list drops or marks retired, or that OpenRouter no longer serves, stays in the file marked retired and is hidden from the pickers.
36
+ - Models you added to the file yourself, and models you switched off, are left alone.
37
+ - A speech model keeps its local character limit, so existing projects are not split differently.
38
+
39
+ Nothing you have made changes. A finished run's costs keep the prices they were recorded at.
40
+
41
+ To turn the automatic check off, start Slopify with the environment variable `SLOPIFY_NO_MODEL_REFRESH=1`.
42
+
43
+ ## Check for new models now
44
+
45
+ 1. Open **Settings → Models**.
46
+ 2. Under **Model catalogue**, choose **Check now** (or press `Ctrl+K` and run **Check for new models**).
47
+ 3. A message says what changed, such as "Model list checked: 2 new, 1 repriced", or "No changes".
48
+
49
+ The section shows:
50
+
51
+ | Row | What it shows |
52
+ |---|---|
53
+ | **Catalogue file** | The path of your local catalogue file (`models.yaml` in Slopify's data folder). |
54
+ | **Verified** | The date the catalogue's prices were last verified. |
55
+ | **Last checked** | When the last automatic or manual check ran, and what it changed. |
56
+
57
+ Below them, **New:** and **Retired:** list the models the last check added or retired.
58
+
59
+ If the check cannot finish, a red line says why. For example: "Slopify could not download the latest model list, so it is still using the one it has." Check your internet connection and choose **Check now** again.
60
+
61
+ ## Replace the local file with the published one
62
+
63
+ Use this when the local file is broken, or you want the published list exactly.
64
+
65
+ 1. Open **Settings → Models**.
66
+ 2. Choose **Replace with published file**.
67
+
68
+ This overwrites the local catalogue with the published one and drops any edits you made. The previous file is saved beside it first as `models.yaml.previous`, so you can copy your edits back.
69
+
70
+ ## Edit the catalogue yourself
71
+
72
+ The catalogue is a plain YAML file at the path shown under **Catalogue file**. You can add a model or switch one off in it; Slopify reloads it when it changes, and the daily check keeps your additions.
73
+
74
+ If the file is missing or has a mistake, Slopify keeps using the last working list and shows: "Your models.yaml file is missing or has a mistake, so Slopify is still using the last working model list." Fix the file, or use **Replace with published file**. The automatic check never overwrites a file that has a mistake in it.
75
+
76
+ ## Switch away from a retired model
77
+
78
+ **Retired models in use** lists every template, schedule, Play draft and project (with steps still to run) whose model is retired or no longer listed. Nothing changes by itself: a run that reaches a retired model stops and says so.
79
+
80
+ Each row shows:
81
+
82
+ - the kind (**Template**, **Schedule**, **Draft** or **Project**) and its name,
83
+ - which choice it is (**Text model**, **Voice model**, **Image model** or **Animation model**), the model, and whether it is "retired" or "no longer listed",
84
+ - a button **Switch to <model>** with the suggested replacement: the active model from the same provider whose ID shares the longest start with the old one.
85
+
86
+ To switch:
87
+
88
+ 1. Open **Settings → Models**.
89
+ 2. Under **Retired models in use**, choose **Switch to <model>** on a row to change only that one choice.
90
+ 3. Or choose **Switch all** to switch every row that has a suggestion. A message says how many were switched and why any could not be.
91
+
92
+ What a switch does:
93
+
94
+ - A template gets a new saved version, and the schedules that ran its latest version move along with it.
95
+ - A project gets a new saved version, as **Edit project** would make.
96
+ - A draft is updated in place.
97
+
98
+ Rows that cannot be switched here say why and what to do:
99
+
100
+ | Row says | What to do |
101
+ |---|---|
102
+ | **No replacement** ("This provider has no other model to switch to.") | Choose another provider for this step and save. |
103
+ | "This schedule runs an older version of the template …" | In the schedule, choose **Edit**, pick the template again so it runs the latest version, then save. |
104
+ | "This project is running." | Wait for it to finish or pause it, then switch. |
105
+
106
+ When nothing is affected, the section says **Nothing uses a retired model.**
107
+
108
+ You don't have to come here to see it: a template or schedule that picks a retired model is flagged on its own row in **Library → Templates** and **Calendar → Schedules**, with the same **Switch to <model>** button. See [Templates](Templates#retired-models) and [Schedules](Schedules#manage-a-schedule).
109
+
110
+ **Check all** in Settings → Providers also reports retired models under **Chosen models**, and **Model reachable** asks each keyed provider whether it still answers for the models you chose. See [Providers-and-Keys](Providers-and-Keys#check-all-providers).
111
+
112
+ ## When a run reaches a model that is gone
113
+
114
+ If a run starts a step whose model is no longer in the list, it stops with a message such as "The chosen … model is no longer in Slopify's model list." Open the project, choose **Edit project**, change the model under Providers, then use **Continue the run**. See [Recovery-and-Retries](Recovery-and-Retries).
115
+
116
+ ## Pick models on Play
117
+
118
+ On Play, each provider row has a model picker fed by the catalogue (or by the CLI for command-line tools):
119
+
120
+ - The refresh button (**Refresh models**) asks the provider for its current list.
121
+ - **Custom ID** lets you type a model ID the list does not show; **Use list** goes back.
122
+ - **Thinking** (text) or **Effort** (images) appears only when the model offers levels. **Model default** leaves it to the provider.
123
+
124
+ See [Play-Overview](Play-Overview) and the Play pages for each step.
125
+
126
+ ## Related pages
127
+
128
+ - [Providers-and-Keys](Providers-and-Keys)
129
+ - [AI-CLIs](AI-CLIs)
130
+ - [Costs-and-Run-Cost](Costs-and-Run-Cost)
131
+ - [Templates](Templates)
132
+ - [Schedules](Schedules)
133
+ - [Settings-Reference](Settings-Reference)
@@ -0,0 +1,161 @@
1
+ # Multiple Voices
2
+
3
+ A run can be narrated by several speakers instead of one voice reading the article. You pick a format (Audiobook, Podcast, Radio drama or Interview), give each speaker a voice, and Slopify has the text model write or split the script into speaker turns. You get a video whose captions know who is talking and, if you want them, an MP3 and an M4B audiobook file with chapters.
4
+
5
+ **Where to find it:** Play → **Narration** row → **Speakers** (the disclosure under the voice picker). On a finished project: Edit project → **Providers** → Speakers.
6
+
7
+ ## Formats
8
+
9
+ The **Format** list under Speakers decides how many voices the run uses and how the video looks.
10
+
11
+ | Format | Speakers it starts with | Rules | Video |
12
+ |---|---|---|---|
13
+ | **Narration (one voice)** | none: the Narration row's voice reads everything | the default | Image flow |
14
+ | **Audiobook** | Narrator | needs one speaker with the Narrator role | Image flow; captions tagged with the speaker |
15
+ | **Podcast** | Alex and Sam, both hosts | needs at least two speakers | Image flow with a speaker panel |
16
+ | **Radio drama** | Narrator and Mara (a character) | needs one speaker with the Narrator role | Image flow; captions tagged with the speaker |
17
+ | **Interview** | Host and Guest | needs at least two speakers | Image flow with a speaker panel |
18
+
19
+ You can rename, recast or remove the starter speakers. A run can have up to 10 speakers.
20
+
21
+ When the channel has hosts (cast members marked **One of the channel's hosts** that have a voice), a new **Podcast** or **Interview** starts with them as its speakers instead of Alex and Sam, or Host and Guest. See [Cast library](Cast-Library#make-a-member-one-of-the-channels-hosts).
22
+
23
+ The **speaker panel** (Podcast and Interview) is a row of tiles, one per speaker, with the one talking lit in their colour and their name as a lower third. It is drawn together with burned-in captions, so set **Captions** to **Burn in** under Play → **Video and style** to see it. A speaker added from a channel's cast whose member has a reference picture shows that picture in their tile (the member's first picture, cropped square, taken when the run starts); everyone else shows their initials. Adding a picture to the cast later does not change projects already made.
24
+
25
+ ## Set up a multi-voice run
26
+
27
+ 1. On Play, open the **Narration** row and pick the **TTS** provider, model and **Voice** as usual. This voice reads the intro and outro; the speakers read the article.
28
+ 2. Open **Speakers** and choose a **Format**.
29
+ 3. Choose where the **Script** comes from (see [The script](#the-script)).
30
+ 4. For each speaker, set a **Speaker name**, **Role**, **Voice provider**, **Voice model** and **Voice**. Add more with **Add speaker**, or pick someone from **Add from the cast**.
31
+ 5. Optionally set **Pace** and **Pronunciations** per speaker, and press **Audition** to hear a speaker before the run.
32
+ 6. Set **Gap between turns** and the switches below it.
33
+ 7. For a podcast or interview, set Captions to **Burn in** so the speaker panel shows.
34
+ 8. Review the estimate in the right rail and start the run.
35
+
36
+ If something is missing, Play names it before you can start, for example "A podcast needs at least two speakers" or "An audiobook needs a narrator. Set one speaker's role to Narrator under Speakers".
37
+
38
+ ## The script
39
+
40
+ | Script option | What it does | Cost |
41
+ |---|---|---|
42
+ | **Write a script (Script prompt)** | The text model writes speaker turns from a **Script** prompt in your Library, one `Name: words` paragraph per turn. The article prompt picker on the Article row becomes a **Script prompt** picker. | One text-model call, in place of the article call |
43
+ | **Split the article into speakers** | Keeps the article as written or pasted, then the text model hands its narration and dialogue to the speakers. Audiobook only. | One extra text-model call |
44
+
45
+ Other formats must use **Write a script**. When the article is split, the split must keep the article's words; if the model changes them, the call is asked again.
46
+
47
+ ### Script format
48
+
49
+ Write Script prompts in **Library → Prompts** with the kind **Script**. The text model answers in this shape:
50
+
51
+ ```
52
+ # Section title
53
+
54
+ Alex: What one speaker says, as one paragraph.
55
+
56
+ Sam: The next turn.
57
+ ```
58
+
59
+ - A `#` heading starts a section. Sections become the chapters of the MP3 and M4B files.
60
+ - A turn starts with a speaker's name and a colon. A line directly under a turn continues it.
61
+ - Text in `[square brackets]`, such as `[laughs]`, is a stage direction and is never read aloud.
62
+ - A script that names someone who is not one of your speakers, or has a paragraph that is not a turn, stops the Article stage with the line to fix.
63
+
64
+ On the project page the Article section shows the script as the speakers read it: each turn under its speaker's name in their colour, with the sections as headings. If the script can't be narrated, it says why and points you to Edit project → Article.
65
+
66
+ ## Speaker options
67
+
68
+ | Option | What it does | Default / range |
69
+ |---|---|---|
70
+ | **Speaker name** | The name the script uses for this speaker's turns (`Name: words`), shown on captions and in the speaker panel. Letters, numbers, spaces, dots, apostrophes and hyphens; each speaker needs a different name. | Up to 40 characters |
71
+ | **Role** | Narrator, Host, Guest or Character. The text model is told each speaker's role when it writes or splits the script. | Set by the format |
72
+ | **Voice provider** | The text-to-speech service for this speaker, charged per character of their lines. Speakers may use different providers. Changing it clears the model and voice. | None |
73
+ | **Voice model** | The provider's speech model. Pronunciations need an Inworld TTS-2 model. | None |
74
+ | **Voice** | One of the voices you added under **Settings → Voices** for that provider, filtered to the project's language. Tick **Show all voices** to see the rest. | None |
75
+ | **Pace** | How fast this speaker talks relative to the voice's own speed. It is applied after the speech is made, so changing it costs nothing. | Normal; 0.8×, 0.9×, Normal, 1.1×, 1.2× |
76
+ | **Pronunciations** | One `Term: /IPA/` per line (for example `Arda: /ˈɑɹdə/`), for this speaker only. Used on Inworld TTS-2 voices, ahead of the article's Pronunciation Glossary. | Empty |
77
+ | **Audition** | Speaks this speaker's first line of the script (or a sample line) in their voice. | One real text-to-speech request; the button shows the price, such as "Audition · about $0.0004" |
78
+
79
+ A pronunciation line the voice can't use (no slashes, ARPAbet, or sounds the project's language does not have) is skipped and that word is read as ordinary text; the other lines still apply. The Speakers panel says which lines are skipped and why as you type.
80
+
81
+ ## Run-wide options
82
+
83
+ | Option | What it does | Default / range |
84
+ |---|---|---|
85
+ | **Gap between turns** | The pause between one speaker's turn and the next. Longer feels calmer; shorter feels like a lively talk. | 0.35 s; choose 0, 0.2, 0.35, 0.5, 0.8 or 1.2 s |
86
+ | **Speaker names on captions** | Puts the speaker's name before their captions, like `Ada:` and their words. In the VTT file it is written as `<v Name>`. | On for Podcast and Interview, off otherwise |
87
+ | **One request for consecutive turns where the voice provider can (ElevenLabs v3, Gemini)** | Sends back-to-back turns as one multi-speaker request where the provider has one, so the voices react to each other: ElevenLabs v3 with up to 10 voices, Google Gemini with 2 (a third voice starts a new request). Fewer requests, same characters charged. Other providers read each turn on its own. | On |
88
+ | **Also make MP3 and M4B files with chapter markers** | Saves the whole narration as `narration.mp3` (ID3 chapters) and `audiobook.m4b` (AAC with chapter markers), one chapter per script section. Made on your computer at no provider cost. | On |
89
+
90
+ The MP3 and M4B appear with the Video section's downloads on the project page, and play in Slopify's own audio player with the chapter marks on its track. Slopify does not publish them anywhere.
91
+
92
+ ## Audiobooks in chapters
93
+
94
+ An audiobook can be one chapter of a book, so a long book is made one chapter per project and a player keeps the chapters together.
95
+
96
+ 1. On Play, pick the **Audiobook** format under Speakers.
97
+ 2. Turn on **A chapter of a book**.
98
+ 3. Type the **Book title** (the same for every chapter) and the **Chapter** number (from 1).
99
+ 4. Start the run.
100
+
101
+ The MP3 and M4B carry the book as their album and the chapter as their track. Projects shows the project as **Book · Chapter N**, for example "The Wind in the Willows · Chapter 3".
102
+
103
+ ### Make the next chapter
104
+
105
+ On a finished audiobook's project page, **Make the next chapter** (beside **Edit settings**) opens a new Play draft for the next chapter: the same speakers and voices, channel and cast, prompts and settings, with the chapter number one higher. Write or paste the new chapter's text there, then start it. An audiobook that was not a book yet becomes one, named after itself, starting at chapter 2.
106
+
107
+ ## Speakers from a channel's cast
108
+
109
+ A channel's cast member can have a voice, so a host or recurring character sounds the same in every episode.
110
+
111
+ 1. Open **Channels**, pick the channel, open its **Cast** tab and edit a member.
112
+ 2. Under **Cast voice**, pick a **Voice provider**, **Voice model** and **Voice**. The list shows voices that speak the channel's language. Leave the provider empty for no voice.
113
+ 3. On Play, under Speakers, pick the member from **Add from the cast**. Only members with a voice are listed.
114
+
115
+ The speaker takes the member's name and voice. Every run started later, whether from Play, a batch, a schedule or a template, takes that member's voice, pace and pronunciations as they are when the run starts. Projects already made keep the voice they were made with. See [Cast-Library](Cast-Library) for editing the cast.
116
+
117
+ ## Delivery tags
118
+
119
+ With a **Narration Preparation** prompt picked (Narration row → **Audio Advanced**), each turn of a speaker on Inworld's TTS-2 model is prepared on its own before it is spoken. The text model sees the turn and who says it (for example `Rat (character)`) and adds cues:
120
+
121
+ - A spoken direction at the start of a sentence, such as `[say shyly and a little uncertainly]`, held until the next one or `[reset]`.
122
+ - Non-verbal sounds where they happen: `[laugh]`, `[breathe]`, `[sigh]`, `[cough]`, `[clear throat]` and `[yawn]`.
123
+
124
+ Each turn is its own request, so a direction never leaks into the next speaker, and every speaker on TTS-2 gets cues of their own. Turns of speakers on other voices, or on TTS-2 Flash (which ignores directions), are spoken as written. At least one speaker must be on TTS-2, or Play asks you to choose that model for a speaker or clear Narration Preparation under Narration → **Audio Advanced**. The Narration row's own model (which reads the intro and outro) must be Inworld TTS-2 too. The tags are only in what the voice is sent: captions, word timing, the MP3/M4B chapters and the script download never show them. See [Play-Narration](Play-Narration) for Narration Preparation itself.
125
+
126
+ ## How the audio is made
127
+
128
+ - Every turn is its own request in its speaker's voice, then the turns are joined with the gap between turns.
129
+ - Narration aliases (Library → Aliases) apply to every turn.
130
+ - Changing one speaker's voice remakes only that speaker's turns.
131
+ - With **Level the volume** on (the default for new runs), each turn is brought to one common loudness before joining, so a quiet host and a loud guest sit at the same level. The MP3 and M4B are mastered to the audio files volume (−18 LUFS by default).
132
+ - **Pause between sentences** lengthens the quiet between sentences inside a turn; the gap between turns stays the Gap between turns.
133
+
134
+ ## Captions with several speakers
135
+
136
+ - Captions never mix two speakers in one line, and each speaker's captions carry their colour.
137
+ - Captions you edit by hand in Edit project → **Captions** keep their speaker. A caption you add takes the speaker of the narration under it.
138
+ - [Shorts](Shorts) cut from a multi-voice video start and end on a speaker's turn.
139
+
140
+ ## Change speakers on a finished project
141
+
142
+ 1. Open the project and press **Edit project**.
143
+ 2. Open **Providers** and change the Speakers panel.
144
+ 3. Save. The rebuild review lists what will be remade: only the turns of speakers whose voice changed are spoken again, paid per character.
145
+
146
+ ## Tips
147
+
148
+ - Audition each speaker before a long run; a wrong voice is cheaper to catch at one line.
149
+ - If a podcast shows no speaker panel, check that Captions is set to Burn in.
150
+ - Give speakers clearly different voices and names; the script and captions match speakers by name.
151
+
152
+ ## Related pages
153
+
154
+ - [Play-Narration](Play-Narration)
155
+ - [Cast-Library](Cast-Library)
156
+ - [Channels](Channels)
157
+ - [Prompts](Prompts)
158
+ - [Narration-Aliases-and-Glossary](Narration-Aliases-and-Glossary)
159
+ - [Other-Languages](Other-Languages)
160
+ - [Editing-a-Project](Editing-a-Project)
161
+ - [Costs-and-Run-Cost](Costs-and-Run-Cost)
@@ -0,0 +1,129 @@
1
+ # Narration Aliases and Glossary
2
+
3
+ Two tools control how the narrator says words without changing what is written. **Narration aliases** swap a written form for a spoken one, such as `Dr.` said as "Doctor", with any generated voice. The **Pronunciation Glossary** gives exact IPA pronunciations for names, such as `Arda: /ˈɑɹdə/`, with Inworld's TTS-2 voices. In both cases the article, the transcript and the captions keep the written words; only the audio changes.
4
+
5
+ **Where to find it:** aliases in **Library → Aliases**. Both switches are on Play under **Narration → Change → Audio Advanced**, and in **Edit project**. A project's glossary is shown on its **Article** section, in the **Pronunciation** tab.
6
+
7
+ ## Narration aliases
8
+
9
+ ### Add aliases
10
+
11
+ 1. Open **Library → Aliases**.
12
+ 2. Press **Add alias**. A new row appears in the list, titled **Alias N**, with its fields under it.
13
+ 3. Fill in the row:
14
+
15
+ | Column | What it does | Default / limit |
16
+ |---|---|---|
17
+ | **Written** | The word or phrase as it appears in the article. Spaces inside it match any spacing. | Up to 200 characters |
18
+ | **Say it as** | What the narrator says instead, spelled the way it sounds. | Up to 500 characters |
19
+ | **Whole word** | On: matches only where the written form stands as a word of its own, never inside a longer word. Off: matches inside other words too. | On |
20
+ | **Match case** | On: matches only with the same capital letters, so `US` is not `us`. Off: capitals are ignored, so `DR.` and `dr.` match too. | Off |
21
+
22
+ 4. Add as many rows as you need, up to 1,000.
23
+ 5. Press **Save aliases**. The whole list is saved at once. A row that can't be saved is marked with the reason.
24
+
25
+ Examples:
26
+
27
+ | Written | Say it as |
28
+ |---|---|
29
+ | `Dr.` | Doctor |
30
+ | `Ms.` | Miss |
31
+ | `et al.` | and others |
32
+ | `vs.` | versus |
33
+ | `NASA` | nasa |
34
+
35
+ Each row's title line sums it up, for example "Says Dr. as Doctor · whole word", or "Not filled in yet". To remove one, press its bin button (**Remove alias N**) and then **Save aliases**. On a wide screen, how aliases are used is explained beside the list.
36
+
37
+ ### Rules
38
+
39
+ - Two aliases can't share a written form.
40
+ - Where two overlap in the text, the one starting first wins, then the longer.
41
+ - A multi-word alias is read with single spaces around it: "Grey et al. wrote" goes to the voice as "Grey and others wrote".
42
+ - An alias wins over a Pronunciation Glossary entry for the same words.
43
+ - Aliases work with every generated voice, and in multi-voice runs they apply to each speaker's turn.
44
+ - Aliases also change the sentences **Narration Preparation** reads, so its cues match what is said.
45
+
46
+ ### Use aliases in a video
47
+
48
+ 1. On Play, open the **Narration** row with **Change**, then **Audio Advanced**.
49
+ 2. Keep **Use narration aliases** on (the default for new drafts).
50
+ 3. Start the run.
51
+
52
+ A project copies the Library's aliases when it starts. Editing the Library later never changes a started project until you open **Edit project** and press **Update from Library** beside the aliases switch. Only the parts of the narration where a changed alias appears are made again.
53
+
54
+ Projects from before aliases existed have the switch off and nothing copied.
55
+
56
+ ### Captions stay written
57
+
58
+ Captions show the written words, while the audio says the alias. A caption reads "Dr. Grey" while the voice says "Doctor Grey". Caption timing matches each written word to its spoken form.
59
+
60
+ ## The Pronunciation Glossary
61
+
62
+ The Pronunciation Glossary is a section at the end of the article that lists names with their pronunciation in IPA. With a voice that supports it, the narrator reads each listed name the way the glossary says, with no extra text-model call. The glossary itself is never narrated.
63
+
64
+ ### Which voices support it
65
+
66
+ Inworld **TTS-2** and **TTS-2 Flash**. With other providers or models the switch is greyed out and says "Unavailable for this provider or model. Your saved preference is retained."
67
+
68
+ ### Get a glossary into the article
69
+
70
+ The glossary comes from your article, so ask for it in your Article prompt. For example, add to the prompt:
71
+
72
+ ```
73
+ At the end, add a section titled "Pronunciation Glossary". List every unusual name
74
+ as Term: /IPA/ in slash-delimited standard-English IPA. For a foreign name, give an
75
+ English approximation.
76
+ ```
77
+
78
+ Each line looks like this:
79
+
80
+ ```
81
+ Arda: /ˈɑɹdə/
82
+ Hypatia: /haɪˈpeɪʃə/
83
+ ```
84
+
85
+ A table with `Term | IPA` columns works too. If you paste your own article, add the section yourself.
86
+
87
+ ### Turn it on
88
+
89
+ 1. On Play, open **Narration → Change → Audio Advanced**.
90
+ 2. Keep **Use Pronunciation Glossary** on (the default).
91
+ 3. Optional: keep **Also use pronunciations from my other projects** on (the default). It adds every term from your other projects' glossaries, copied when this project starts. This project's own glossary wins where they differ. Turn it off to use only this article's glossary.
92
+
93
+ ### Entries that are skipped
94
+
95
+ An entry narration can't use is skipped and read as ordinary text. It never blocks the narration. The project's **Article** section shows a **Pronunciation** tab with the glossary, and a note such as "2 entries are skipped by the narration and read as ordinary text", listing each by number and reason:
96
+
97
+ | Reason shown | What to fix |
98
+ |---|---|
99
+ | use Term: /IPA/ or a Term \| IPA table | The line isn't in either format. |
100
+ | use slash-delimited standard-English IPA (or "IPA" for other languages) | The pronunciation isn't between slashes. |
101
+ | use standard-English IPA only, not ARPAbet, delivery tags or non-English sounds; give a foreign name an English approximation | The IPA uses symbols the voice can't read. For English, use standard-English sounds only. |
102
+ | supply one IPA word for each written word | "New York" needs two IPA words. |
103
+ | an earlier entry already gives this term a different pronunciation | The term is listed twice with different sounds. |
104
+
105
+ To fix skipped entries, edit the Pronunciation Glossary at the end of the article in **Edit project → Article**, then save. See [Editing a project](Editing-a-Project).
106
+
107
+ ## Aliases or glossary?
108
+
109
+ | You want | Use |
110
+ |---|---|
111
+ | An abbreviation read in full (Dr., St., vs.) | Alias |
112
+ | A word read as a different word or spelling | Alias |
113
+ | Any voice provider | Alias |
114
+ | A made-up or foreign name said exactly right, on Inworld TTS-2 | Glossary |
115
+ | Pronunciations that come with each article automatically | Glossary |
116
+
117
+ ## Tips
118
+
119
+ - Spell **Say it as** the way it sounds, not the way it is written: "Shiv-awn" rather than "Siobhan".
120
+ - Keep **Whole word** on unless you really want to match inside other words. Otherwise `St.` could fire inside unrelated text.
121
+ - Listen to the first minute of a new run before a long batch, and add aliases for anything the voice stumbles on.
122
+
123
+ ## Related pages
124
+
125
+ - [Narration](Play-Narration)
126
+ - [Prompts](Prompts)
127
+ - [Editing a project](Editing-a-Project)
128
+ - [Multiple voices](Multiple-Voices)
129
+ - [Providers and keys](Providers-and-Keys)
@@ -0,0 +1,86 @@
1
+ # Notifications
2
+
3
+ Runs can take a while, so Slopify can tell you when one needs you: in the browser, or on your phone through a Notification URL such as an ntfy topic.
4
+
5
+ **Where to find it:** **Settings → Notifications**.
6
+
7
+ ## When Slopify notifies you
8
+
9
+ | Event | Message |
10
+ |---|---|
11
+ | A run **finishes** | "Video ready", or "Run finished" for a run that makes audio only |
12
+ | A run **fails** | The project title and the first line of the reason |
13
+ | A run **stops to wait for you** | A review checkpoint is holding the next step, or the work left is waiting for Resume |
14
+ | An automatic review **needs a decision** | "Review needs a decision: <title>", when an automatic review flags an item and keeps it (its redos ran out, or the stage only flags). It says what was flagged and to press **Overrule** or **Redo** on the project. Sent once per verdict. |
15
+ | A schedule has **new topics waiting** for approval | For example "5 new topics are waiting for you" |
16
+
17
+ Pausing or cancelling a run yourself sends nothing, and neither does a project that was already finished when the page loaded. A message holds the project title and what happened, never your keys, prompts or files.
18
+
19
+ ## Turn on browser notifications
20
+
21
+ Browser notifications work while any Slopify tab is open, in any section, even in the background.
22
+
23
+ 1. Open **Settings → Notifications**.
24
+ 2. Turn **Browser notifications** on. The browser asks for permission now (never when the page loads). Allow it.
25
+ 3. Press **Send test notification** to check. You should see "Test notification sent to this browser."
26
+
27
+ What to expect:
28
+
29
+ - With several Slopify tabs open you get one notification, not one per tab.
30
+ - Clicking a run notification opens the project. Clicking a new-topics notification opens the calendar's **Suggested topics**.
31
+ - The setting applies to this browser only. Turn it on in each browser you use.
32
+ - Default: off.
33
+
34
+ ### If the browser blocked notifications
35
+
36
+ If you blocked notifications for Slopify earlier, Slopify says "Notifications are blocked for this site". To fix it:
37
+
38
+ 1. Click the icon left of the address bar and open the site settings.
39
+ 2. Allow notifications.
40
+ 3. Reload the page.
41
+ 4. Turn **Browser notifications** on again.
42
+
43
+ Some browsers only allow notifications from installed apps. If the test says so, use a Notification URL instead.
44
+
45
+ ## Get notifications on your phone (Notification URL)
46
+
47
+ A Notification URL works with no Slopify tab open. When a run finishes, fails or waits, or a review needs a decision, Slopify sends that address one `POST` with a short plain-text body. Its last line is the project's link, so you can open it straight from the message, for example:
48
+
49
+ ```
50
+ Video ready: Black holes explained
51
+ Open the project to watch it.
52
+ http://localhost:6969/projects/…
53
+ ```
54
+
55
+ The link uses the address and port Slopify runs on (`localhost` when it listens on all addresses or on 127.0.0.1), so it opens on the computer running Slopify or one that can reach it. Messages about new topics have no link.
56
+
57
+ ### Set it up with ntfy
58
+
59
+ 1. Install the [ntfy](https://ntfy.sh) app on your phone.
60
+ 2. Subscribe to a topic with a long random name, such as `slopify-7f3k9q2m8x`. Anyone who knows the name can read it, so treat it like a password.
61
+ 3. In Slopify, open **Settings → Notifications** and paste `https://ntfy.sh/<your-topic>` into **Notification URL**. Your own ntfy server works too.
62
+ 4. Press **Save**. Slopify says "Notification URL saved."
63
+ 5. Press **Send test notification**. The message should arrive on your phone.
64
+
65
+ To turn it off, clear the field and press **Save**.
66
+
67
+ ### Rules for the address
68
+
69
+ - Only `http://` and `https://` addresses are accepted, without a user name or password in them.
70
+ - Any address that accepts a `POST` works, not just ntfy.
71
+ - Each message is sent once, with a 5-second timeout, and is never retried. A failure is written to the log and does not affect the run.
72
+ - The address stays on this machine: backups leave it out.
73
+ - In [Docker](Docker) the request goes out from the container, so the address must be reachable from there. `localhost` means the container itself.
74
+
75
+ ## Tips
76
+
77
+ - Turn on both: browser notifications while you are at the computer, ntfy for when you walk away.
78
+ - Pair notifications with [Reviews and checkpoints](Reviews-and-Checkpoints) so a run that waits for your review tells you right away.
79
+
80
+ ## Related pages
81
+
82
+ - [Settings reference](Settings-Reference)
83
+ - [Schedules](Schedules)
84
+ - [Calendar](Calendar)
85
+ - [Reviews and checkpoints](Reviews-and-Checkpoints)
86
+ - [Troubleshooting](Troubleshooting)
@@ -0,0 +1,110 @@
1
+ # Other Languages
2
+
3
+ A project can be written and narrated in one of 30 languages, not only English. Slopify asks the text model to write the article, description and shorts titles in that language, lists the voices that speak it, and times the captions for it. English and nine other languages get word-by-word captions; the rest are timed sentence by sentence.
4
+
5
+ **Where to find it:** Play → **Channel** row → **Language**. On a finished project: Edit project → **Providers** → **Language**. For a channel's default: Channels → the channel → **Brand** → **Language of new projects**.
6
+
7
+ ## Pick a language for one video
8
+
9
+ 1. On Play, open the **Channel** row.
10
+ 2. Under **Language**, pick the language. The first option, **Channel's language (…)**, uses the channel's language and names it.
11
+ 3. Open the **Narration** row and pick a **Voice** that speaks the language. The list only shows voices listed for that language, plus voices whose languages are unknown.
12
+ 4. Read the line under the Language picker: it says what is written in the language and how the captions will be timed.
13
+ 5. Start the run.
14
+
15
+ A template saves the language its draft had. A draft that never picked one uses its channel's language, and English if the channel has none.
16
+
17
+ ## Set a channel's language
18
+
19
+ 1. Open **Channels**, pick the channel and open its **Brand** tab.
20
+ 2. Under **Language of new projects**, pick the language. **Not set** means English.
21
+
22
+ This applies with the brand kit off too, because language is not styling. Projects already made keep their language.
23
+
24
+ ## Change the language of a finished project
25
+
26
+ 1. Open the project and press **Edit project**.
27
+ 2. Open **Providers** and pick the new **Language**.
28
+ 3. Save. Changing the language re-writes the project's text and re-times its captions; the rebuild review shows what will be remade and what it costs.
29
+
30
+ ## What changes with the language
31
+
32
+ | | English | Spanish, German, French, Italian, Portuguese, Dutch, Catalan, Polish, Czech | All other languages |
33
+ |---|---|---|---|
34
+ | Article, narration preparation, YouTube description, chapters, tags, shorts titles and hashtags, multi-voice scripts | English | Written in the language | Written in the language |
35
+ | Caption timing | Word by word, English model (95 MB) | Word by word, multilingual model (248 MB, downloaded once, on first use) | Sentence by sentence, no model |
36
+ | Word-by-word Shorts captions | On | On | Off: shorts show whole caption groups |
37
+ | Cuts that follow the narration | Available | Available | Off: cuts fall every N seconds |
38
+ | Pronunciation Glossary | Standard-English IPA | Full IPA (ç, ʁ, ø, y, ɲ, x and so on) | Full IPA |
39
+ | Caption font | As chosen | As chosen, or bundled Noto Sans if the font lacks the letters | See [Caption fonts](#caption-fonts) |
40
+
41
+ ### The 30 languages
42
+
43
+ | Timing | Languages |
44
+ |---|---|
45
+ | Word by word (English model) | English |
46
+ | Word by word (multilingual model) | Spanish, German, French, Italian, Portuguese, Dutch, Catalan, Polish, Czech |
47
+ | Sentence by sentence | Romanian, Swedish, Danish, Norwegian (bokmål), Finnish, Hungarian, Turkish, Indonesian, Vietnamese, Greek, Russian, Ukrainian, Arabic, Hebrew, Hindi, Thai, Japanese, Chinese, Korean |
48
+
49
+ The picker shows each language by its own name and its English name, for example **Deutsch · German**.
50
+
51
+ ## How the writing works
52
+
53
+ Your prompts are not edited. When a project is not in English, Slopify adds one line of its own after your prompt telling the model to write everything meant for the audience (article, narration, titles, descriptions, chapter names, hashtags and tags) in the chosen language, even where your prompt is in English. The line tells the model to keep headings your prompt asks for, such as **Pronunciation Glossary** and **Sources Consulted**, exactly as written, because Slopify finds the end of the article by those headings.
54
+
55
+ Image prompts stay in English: image models read English best.
56
+
57
+ English projects get no extra line, so they are exactly what they were before languages existed.
58
+
59
+ ## Voices and languages
60
+
61
+ Saved voices carry the languages they speak.
62
+
63
+ 1. Open **Settings → Voices** and add a voice.
64
+ 2. Leave **Languages** blank and Slopify asks ElevenLabs, Cartesia or Inworld which languages the voice speaks, or type codes yourself, such as `es, de`.
65
+ 3. Press **Edit** in the Languages column to change them later.
66
+
67
+ OpenAI has no voice API for this, and its voices read every language its model does. A voice whose languages are unknown is offered for every language.
68
+
69
+ On Play, the voice list shows the voices that speak the project language. Tick **Show all voices** to pick one listed for other languages, for example a multilingual voice whose languages are listed wrong. If you pick such a voice, Play warns you but does not stop the run. Speaker voice pickers under Speakers, and a cast member's voice picker, filter the same way. See [Multiple-Voices](Multiple-Voices).
70
+
71
+ ## Caption timing in detail
72
+
73
+ - **English** uses its own model, as before.
74
+ - **The nine word-by-word languages** use a free multilingual model, about 248 MB. It is downloaded the first time a project in one of these languages makes captions, into your data folder, and checked before use. It is never downloaded at start-up and is not part of the Docker image. Numbers are spelled out in the language before timing. A word written in another alphabet stops the captions with a message asking you to write it in Latin letters. Allow about 1.1 GB of memory for captions in these languages, against about 0.8 GB for English.
75
+ - **All other languages** are timed sentence by sentence: Slopify finds the narration's pauses from its loudness and lays each sentence over its share of the speech. Nothing is downloaded. The project page says so under the video.
76
+
77
+ Because word timing is not available in the sentence-timed languages, two features are off there, and the controls say so:
78
+
79
+ - **Cuts** set to **Follow the narration** fall back to every N seconds (Seconds per image).
80
+ - **Shorts** show whole caption groups instead of word-by-word captions.
81
+
82
+ Chinese, Japanese and Thai words are counted with the platform's word breaker when narration is split into chunks.
83
+
84
+ ## Caption fonts
85
+
86
+ For any language other than English, Slopify checks that your caption font has the language's letters. If it doesn't:
87
+
88
+ 1. It uses a bundled Noto font for Latin, Greek, Cyrillic, Arabic, Hebrew, Devanagari and Thai.
89
+ 2. For Chinese, Japanese and Korean, which are not bundled (their fonts run to 10-20 MB), it looks for a font on your computer that has the letters.
90
+ 3. If none is found, the Video stage stops and says so. Upload a font that has the letters with **Upload font (.ttf or .otf)** in the caption font picker (Play → **Video and style**, or Edit project → **Subtitles**), choose it, then press **Try again**. Noto Sans JP, KR or SC from fonts.google.com work.
91
+
92
+ English projects always render with exactly the font you chose.
93
+
94
+ ## Limits
95
+
96
+ - Only the 30 languages above can be picked.
97
+ - Word-by-word captions and cuts that follow the narration are only available in English and the nine multilingual languages.
98
+ - The first captions in a multilingual language need a one-time download of about 248 MB.
99
+ - Some voice providers list languages incorrectly; use Show all voices if the voice you want is missing.
100
+
101
+ ## Related pages
102
+
103
+ - [Play-Narration](Play-Narration)
104
+ - [Play-Video-and-Style](Play-Video-and-Style)
105
+ - [Channels](Channels)
106
+ - [Multiple-Voices](Multiple-Voices)
107
+ - [Shorts](Shorts)
108
+ - [Narration-Aliases-and-Glossary](Narration-Aliases-and-Glossary)
109
+ - [Editing-a-Project](Editing-a-Project)
110
+ - [Where-Your-Files-Live](Where-Your-Files-Live)