voxflow 1.14.0 → 1.15.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 (454) hide show
  1. package/README.md +69 -2
  2. package/bin/voxflow.js +27 -0
  3. package/dist/index.js +1 -1
  4. package/dist/remotion-bundle/02a2fb2eb80bc7bf.woff2 +0 -0
  5. package/dist/remotion-bundle/052ca5351e5e06ba.woff2 +0 -0
  6. package/dist/remotion-bundle/05853dd28f4019cb.woff2 +0 -0
  7. package/dist/remotion-bundle/072ead3737f7c0d0.woff2 +0 -0
  8. package/dist/remotion-bundle/07d4248613c86a2e.woff2 +0 -0
  9. package/dist/remotion-bundle/0884a5c2d1d2d99b.woff2 +0 -0
  10. package/dist/remotion-bundle/0b0e185b2752095e.woff2 +0 -0
  11. package/dist/remotion-bundle/0e66c11bde067d91.woff2 +0 -0
  12. package/dist/remotion-bundle/0f7794cfba2c5d21.woff2 +0 -0
  13. package/dist/remotion-bundle/0fdbae5a4365783a.woff2 +0 -0
  14. package/dist/remotion-bundle/112.bundle.js +11 -0
  15. package/dist/remotion-bundle/112.bundle.js.map +1 -0
  16. package/dist/remotion-bundle/113.bundle.js +11 -0
  17. package/dist/remotion-bundle/113.bundle.js.map +1 -0
  18. package/dist/remotion-bundle/119cae0c4c16f7ed.woff2 +0 -0
  19. package/dist/remotion-bundle/14725f649fd1e78c.woff2 +0 -0
  20. package/dist/remotion-bundle/14abe9e3f95f7888.woff2 +0 -0
  21. package/dist/remotion-bundle/163.bundle.js +14678 -0
  22. package/dist/remotion-bundle/163.bundle.js.map +1 -0
  23. package/dist/remotion-bundle/1808c54072bf6d14.woff2 +0 -0
  24. package/dist/remotion-bundle/18948bec3e3012fe.woff2 +0 -0
  25. package/dist/remotion-bundle/1a661c60d0fc84fc.woff2 +0 -0
  26. package/dist/remotion-bundle/1af94941e1bc7e1e.woff2 +0 -0
  27. package/dist/remotion-bundle/1bee0219595f606c.woff2 +0 -0
  28. package/dist/remotion-bundle/1bfd5da7ce9d4ec4.woff2 +0 -0
  29. package/dist/remotion-bundle/1c158d56f1884f3f.woff2 +0 -0
  30. package/dist/remotion-bundle/1cf5e88e667610eb.woff2 +0 -0
  31. package/dist/remotion-bundle/1d431bd10f53c481.woff2 +0 -0
  32. package/dist/remotion-bundle/1d701a81a7670db2.woff2 +0 -0
  33. package/dist/remotion-bundle/1da0fecad4240f16.woff2 +0 -0
  34. package/dist/remotion-bundle/1ed14d3d0c5c63fe.woff2 +0 -0
  35. package/dist/remotion-bundle/1edfecf40e586f53.woff2 +0 -0
  36. package/dist/remotion-bundle/1f479711bc34b054.woff +0 -0
  37. package/dist/remotion-bundle/1f86e54a0ff5fcd1.woff2 +0 -0
  38. package/dist/remotion-bundle/2043ea87d9aabd11.woff2 +0 -0
  39. package/dist/remotion-bundle/20563c39ee8a0e40.woff2 +0 -0
  40. package/dist/remotion-bundle/20c231590fd12c44.woff2 +0 -0
  41. package/dist/remotion-bundle/20ce61713f754c07.woff2 +0 -0
  42. package/dist/remotion-bundle/21eb9306fce24bb1.woff2 +0 -0
  43. package/dist/remotion-bundle/244bf71c0cc851af.woff2 +0 -0
  44. package/dist/remotion-bundle/274d4cfc02bffbcb.woff2 +0 -0
  45. package/dist/remotion-bundle/275.bundle.js +21 -0
  46. package/dist/remotion-bundle/275.bundle.js.map +1 -0
  47. package/dist/remotion-bundle/2958f540b39513dc.woff2 +0 -0
  48. package/dist/remotion-bundle/2a168b98fd97722e.woff2 +0 -0
  49. package/dist/remotion-bundle/2d1f6373937ab55f.woff2 +0 -0
  50. package/dist/remotion-bundle/2d213ae47ff6daa9.woff2 +0 -0
  51. package/dist/remotion-bundle/2e4b1f04fcd05047.woff2 +0 -0
  52. package/dist/remotion-bundle/304170d98f4c4563.woff2 +0 -0
  53. package/dist/remotion-bundle/30d02e136e7a5642.woff2 +0 -0
  54. package/dist/remotion-bundle/3135562b52a714cd.woff2 +0 -0
  55. package/dist/remotion-bundle/313713af2c8144e9.woff2 +0 -0
  56. package/dist/remotion-bundle/325fa4108d2285b9.woff2 +0 -0
  57. package/dist/remotion-bundle/338e927ed3345e0c.woff2 +0 -0
  58. package/dist/remotion-bundle/35fc6b190365bc17.woff2 +0 -0
  59. package/dist/remotion-bundle/37a51f1122d4efc5.woff2 +0 -0
  60. package/dist/remotion-bundle/39a4d63e02736f5e.woff2 +0 -0
  61. package/dist/remotion-bundle/3a00e0d62dfc4171.woff2 +0 -0
  62. package/dist/remotion-bundle/3a6955e6561affe1.woff2 +0 -0
  63. package/dist/remotion-bundle/3c573945aef49b89.woff2 +0 -0
  64. package/dist/remotion-bundle/3cdbfbfa23b516a5.woff2 +0 -0
  65. package/dist/remotion-bundle/3e42f85a9e64ca8a.woff2 +0 -0
  66. package/dist/remotion-bundle/3e83eaf1ec859415.woff2 +0 -0
  67. package/dist/remotion-bundle/3f3c8c90de1250ee.woff2 +0 -0
  68. package/dist/remotion-bundle/434.bundle.js +205 -0
  69. package/dist/remotion-bundle/434.bundle.js.map +1 -0
  70. package/dist/remotion-bundle/44ffc6ca4d781692.woff2 +0 -0
  71. package/dist/remotion-bundle/4670d9c4580b09eb.woff2 +0 -0
  72. package/dist/remotion-bundle/479756881b302824.woff2 +0 -0
  73. package/dist/remotion-bundle/481b82134bfa9c82.woff2 +0 -0
  74. package/dist/remotion-bundle/48d27029626f4328.woff2 +0 -0
  75. package/dist/remotion-bundle/49b7b2a30329c511.woff2 +0 -0
  76. package/dist/remotion-bundle/4c8b25a1a9337045.woff2 +0 -0
  77. package/dist/remotion-bundle/4cba14788ca9259b.woff2 +0 -0
  78. package/dist/remotion-bundle/4cd6c589c004a6a7.woff2 +0 -0
  79. package/dist/remotion-bundle/4cd8d79c1021608d.woff2 +0 -0
  80. package/dist/remotion-bundle/4d8fa99b3f00f9f0.woff2 +0 -0
  81. package/dist/remotion-bundle/4e7805a643f86d53.woff2 +0 -0
  82. package/dist/remotion-bundle/4ff91be454542e3f.woff2 +0 -0
  83. package/dist/remotion-bundle/504cbcba1f63591b.woff2 +0 -0
  84. package/dist/remotion-bundle/5202d792e5791d6c.woff2 +0 -0
  85. package/dist/remotion-bundle/534db5ad4770cc1d.woff2 +0 -0
  86. package/dist/remotion-bundle/53b9568eb85f866b.woff2 +0 -0
  87. package/dist/remotion-bundle/543ad386ca171de9.woff2 +0 -0
  88. package/dist/remotion-bundle/54798e55bbf7976e.woff2 +0 -0
  89. package/dist/remotion-bundle/580.bundle.js +11 -0
  90. package/dist/remotion-bundle/580.bundle.js.map +1 -0
  91. package/dist/remotion-bundle/58d174d1193af6d1.woff2 +0 -0
  92. package/dist/remotion-bundle/591d29ff3ff53c80.woff2 +0 -0
  93. package/dist/remotion-bundle/5c28c4f4824383c6.woff2 +0 -0
  94. package/dist/remotion-bundle/5da9740d2ce894c8.woff2 +0 -0
  95. package/dist/remotion-bundle/6197735364642360.woff2 +0 -0
  96. package/dist/remotion-bundle/6265a4335724080f.woff2 +0 -0
  97. package/dist/remotion-bundle/633f5e4f6394daa7.woff2 +0 -0
  98. package/dist/remotion-bundle/637d95ace6a69c49.woff2 +0 -0
  99. package/dist/remotion-bundle/648e04a04dacff8f.woff2 +0 -0
  100. package/dist/remotion-bundle/64a6e83045a008b2.woff2 +0 -0
  101. package/dist/remotion-bundle/651.bundle.js +11 -0
  102. package/dist/remotion-bundle/651.bundle.js.map +1 -0
  103. package/dist/remotion-bundle/65e2a988c070facc.woff2 +0 -0
  104. package/dist/remotion-bundle/66a2f6ce5cc69105.woff2 +0 -0
  105. package/dist/remotion-bundle/690.bundle.js +3479 -0
  106. package/dist/remotion-bundle/690.bundle.js.map +1 -0
  107. package/dist/remotion-bundle/690ff55252ca715d.woff2 +0 -0
  108. package/dist/remotion-bundle/6a01a1cff49314fc.woff2 +0 -0
  109. package/dist/remotion-bundle/6cbc32670982986c.woff2 +0 -0
  110. package/dist/remotion-bundle/6d3cc42ae547f454.woff2 +0 -0
  111. package/dist/remotion-bundle/6d8f4cfa1ddc0830.woff2 +0 -0
  112. package/dist/remotion-bundle/6e4d7c6ae65e2dc3.woff2 +0 -0
  113. package/dist/remotion-bundle/6e86418bbcefb2e8.woff2 +0 -0
  114. package/dist/remotion-bundle/6ee02884b29cf7fb.woff2 +0 -0
  115. package/dist/remotion-bundle/6f436a74c9e3252c.woff2 +0 -0
  116. package/dist/remotion-bundle/78c8022f1657618b.woff2 +0 -0
  117. package/dist/remotion-bundle/7c5444169792bca4.woff2 +0 -0
  118. package/dist/remotion-bundle/7c86bddd9d997212.woff2 +0 -0
  119. package/dist/remotion-bundle/7e1284684767f584.woff2 +0 -0
  120. package/dist/remotion-bundle/7e81c17522d182b2.woff2 +0 -0
  121. package/dist/remotion-bundle/7eb87be198f7858c.woff2 +0 -0
  122. package/dist/remotion-bundle/8060c928f948aab5.woff2 +0 -0
  123. package/dist/remotion-bundle/80bc9dfbea2b35ae.woff2 +0 -0
  124. package/dist/remotion-bundle/811b83f69963bb48.woff2 +0 -0
  125. package/dist/remotion-bundle/813.bundle.js +117511 -0
  126. package/dist/remotion-bundle/813.bundle.js.map +1 -0
  127. package/dist/remotion-bundle/84df492e349f82e9.woff2 +0 -0
  128. package/dist/remotion-bundle/8501bfd73eb36f2b.woff2 +0 -0
  129. package/dist/remotion-bundle/854236a8376093fe.woff2 +0 -0
  130. package/dist/remotion-bundle/8571d74529082753.woff2 +0 -0
  131. package/dist/remotion-bundle/860bf44f8e6f4b5d.woff2 +0 -0
  132. package/dist/remotion-bundle/879.bundle.js +64 -0
  133. package/dist/remotion-bundle/879.bundle.js.map +1 -0
  134. package/dist/remotion-bundle/887dd482f848d56f.woff2 +0 -0
  135. package/dist/remotion-bundle/89b2132e85fbbb5a.woff2 +0 -0
  136. package/dist/remotion-bundle/8ba60d6c306010c2.woff2 +0 -0
  137. package/dist/remotion-bundle/8c7c4dadea897806.woff2 +0 -0
  138. package/dist/remotion-bundle/8c943f9999706f61.woff2 +0 -0
  139. package/dist/remotion-bundle/8f2a718c90575cc9.woff2 +0 -0
  140. package/dist/remotion-bundle/906b6edb3e1772c9.woff2 +0 -0
  141. package/dist/remotion-bundle/930ff9daccdf14eb.woff2 +0 -0
  142. package/dist/remotion-bundle/934db2f1c403c4d0.woff2 +0 -0
  143. package/dist/remotion-bundle/938.bundle.js +451 -0
  144. package/dist/remotion-bundle/938.bundle.js.map +1 -0
  145. package/dist/remotion-bundle/967.bundle.js +4462 -0
  146. package/dist/remotion-bundle/967.bundle.js.map +1 -0
  147. package/dist/remotion-bundle/9684a1093d3c02ce.woff2 +0 -0
  148. package/dist/remotion-bundle/973dcd0faa6116cc.woff2 +0 -0
  149. package/dist/remotion-bundle/9745400694e76cd8.woff2 +0 -0
  150. package/dist/remotion-bundle/999ef957bed3bdca.woff2 +0 -0
  151. package/dist/remotion-bundle/99a3d67c8b0f43e3.woff2 +0 -0
  152. package/dist/remotion-bundle/a0586c3e03127283.woff2 +0 -0
  153. package/dist/remotion-bundle/a0eb654fdae46269.woff2 +0 -0
  154. package/dist/remotion-bundle/a20e35d3b08f7994.woff2 +0 -0
  155. package/dist/remotion-bundle/a2dcaced7c8c25ab.woff2 +0 -0
  156. package/dist/remotion-bundle/a79255a972a2681a.woff2 +0 -0
  157. package/dist/remotion-bundle/a804b352cb9fec1a.woff2 +0 -0
  158. package/dist/remotion-bundle/aae7117164e1eabc.woff2 +0 -0
  159. package/dist/remotion-bundle/affd121385d0442d.woff2 +0 -0
  160. package/dist/remotion-bundle/b19a6083987ee0d7.woff2 +0 -0
  161. package/dist/remotion-bundle/b1b2bd04d8637981.woff2 +0 -0
  162. package/dist/remotion-bundle/b2c07f341486be87.woff2 +0 -0
  163. package/dist/remotion-bundle/b33d8f82e575c4ce.woff2 +0 -0
  164. package/dist/remotion-bundle/b366c0bed35ef491.woff2 +0 -0
  165. package/dist/remotion-bundle/b41e857ec1b85642.woff2 +0 -0
  166. package/dist/remotion-bundle/b420bb34ccf23e7f.woff2 +0 -0
  167. package/dist/remotion-bundle/b4f7bf4efb0c0ccf.woff2 +0 -0
  168. package/dist/remotion-bundle/b60fe5eca03cff93.woff2 +0 -0
  169. package/dist/remotion-bundle/b6bd31a336e64bce.woff2 +0 -0
  170. package/dist/remotion-bundle/b6d2befba3dfefeb.woff2 +0 -0
  171. package/dist/remotion-bundle/b75f39ab06c43bf4.woff2 +0 -0
  172. package/dist/remotion-bundle/b77880e8c413d4fd.woff2 +0 -0
  173. package/dist/remotion-bundle/b7e38ec441e4a77a.woff2 +0 -0
  174. package/dist/remotion-bundle/b83baa383ff0bf2b.woff2 +0 -0
  175. package/dist/remotion-bundle/b9ad7b6c0a11450a.woff2 +0 -0
  176. package/dist/remotion-bundle/baf84486e8ae3aaf.woff2 +0 -0
  177. package/dist/remotion-bundle/bc047b1f6869cffa.woff2 +0 -0
  178. package/dist/remotion-bundle/bf4f3ac6e93f33aa.woff2 +0 -0
  179. package/dist/remotion-bundle/bf6835ffec5897a2.woff2 +0 -0
  180. package/dist/remotion-bundle/bf8885f581eb1724.woff2 +0 -0
  181. package/dist/remotion-bundle/bundle.js +83376 -0
  182. package/dist/remotion-bundle/bundle.js.map +1 -0
  183. package/dist/remotion-bundle/c03f046bccd789d0.woff2 +0 -0
  184. package/dist/remotion-bundle/c0bb1f8962b73bc3.woff2 +0 -0
  185. package/dist/remotion-bundle/c1003f9a7db6e1cf.woff2 +0 -0
  186. package/dist/remotion-bundle/c15d83fb1e199515.woff2 +0 -0
  187. package/dist/remotion-bundle/c28e7e5d310f73ef.woff2 +0 -0
  188. package/dist/remotion-bundle/c2b840274db78aea.woff2 +0 -0
  189. package/dist/remotion-bundle/c3000e3299d4e45f.woff2 +0 -0
  190. package/dist/remotion-bundle/c83ce886e5288510.woff2 +0 -0
  191. package/dist/remotion-bundle/c87a5a64d4ac0918.woff2 +0 -0
  192. package/dist/remotion-bundle/c8a7e0d049e965fa.woff2 +0 -0
  193. package/dist/remotion-bundle/c949a35d3a3b1faf.woff2 +0 -0
  194. package/dist/remotion-bundle/c9618c9b9ac2bc78.woff2 +0 -0
  195. package/dist/remotion-bundle/ca3add3b84152d5b.woff2 +0 -0
  196. package/dist/remotion-bundle/cad9dd036408d707.woff2 +0 -0
  197. package/dist/remotion-bundle/cbb24916619df439.woff2 +0 -0
  198. package/dist/remotion-bundle/cc054f0b5514e177.woff2 +0 -0
  199. package/dist/remotion-bundle/ccc248ed9312bc71.woff2 +0 -0
  200. package/dist/remotion-bundle/cd9d623aa07af925.woff2 +0 -0
  201. package/dist/remotion-bundle/ce2ba7a321bd1247.woff2 +0 -0
  202. package/dist/remotion-bundle/cf72455f79a29b14.woff2 +0 -0
  203. package/dist/remotion-bundle/d267cbfefab452ac.woff2 +0 -0
  204. package/dist/remotion-bundle/d435cff46a64955f.woff +0 -0
  205. package/dist/remotion-bundle/d494d07f67e363f6.woff2 +0 -0
  206. package/dist/remotion-bundle/d7aa0cc1fa47bf38.woff2 +0 -0
  207. package/dist/remotion-bundle/d7c5ca93d885160a.woff2 +0 -0
  208. package/dist/remotion-bundle/d855d3e252db74e2.woff2 +0 -0
  209. package/dist/remotion-bundle/d8f13d47f02f82c2.woff2 +0 -0
  210. package/dist/remotion-bundle/d9567cce2ee11019.woff2 +0 -0
  211. package/dist/remotion-bundle/db8d4456fc75dd86.woff +0 -0
  212. package/dist/remotion-bundle/dc274628378c47ee.woff2 +0 -0
  213. package/dist/remotion-bundle/dc3e06947bb69903.woff2 +0 -0
  214. package/dist/remotion-bundle/dd67040ac3b6d523.woff2 +0 -0
  215. package/dist/remotion-bundle/e0b04bd488f953f4.woff2 +0 -0
  216. package/dist/remotion-bundle/e2a572ff95089370.woff2 +0 -0
  217. package/dist/remotion-bundle/e2e18a86b1c2b0cc.woff2 +0 -0
  218. package/dist/remotion-bundle/e3a78ee2fc9c6931.woff2 +0 -0
  219. package/dist/remotion-bundle/e654c9d547605a9f.woff2 +0 -0
  220. package/dist/remotion-bundle/e67a3a64c129927c.woff2 +0 -0
  221. package/dist/remotion-bundle/e6be28b4203cd6ce.woff2 +0 -0
  222. package/dist/remotion-bundle/e841907ad9b0a191.woff +0 -0
  223. package/dist/remotion-bundle/e889d1541c69fffa.woff2 +0 -0
  224. package/dist/remotion-bundle/e88ef8c76373a9e2.woff2 +0 -0
  225. package/dist/remotion-bundle/e9c72f4bc37defef.woff2 +0 -0
  226. package/dist/remotion-bundle/e9e35f863403a255.woff2 +0 -0
  227. package/dist/remotion-bundle/eb23b37b009375da.woff2 +0 -0
  228. package/dist/remotion-bundle/ee1342b741625721.woff2 +0 -0
  229. package/dist/remotion-bundle/f07da88543a57ec9.woff2 +0 -0
  230. package/dist/remotion-bundle/f522982115306f8a.woff2 +0 -0
  231. package/dist/remotion-bundle/f8449bd864e6d8bc.woff2 +0 -0
  232. package/dist/remotion-bundle/f906dd5bd95ff9ab.woff2 +0 -0
  233. package/dist/remotion-bundle/f9e9e9413e3c38bb.woff2 +0 -0
  234. package/dist/remotion-bundle/fa5a5b16280994a8.woff2 +0 -0
  235. package/dist/remotion-bundle/favicon.ico +0 -0
  236. package/dist/remotion-bundle/fb19c0517725599b.woff2 +0 -0
  237. package/dist/remotion-bundle/fcaf24232f684b9b.woff2 +0 -0
  238. package/dist/remotion-bundle/fe09e084a3eea8cf.woff2 +0 -0
  239. package/dist/remotion-bundle/ff38d5317df7345a.woff2 +0 -0
  240. package/dist/remotion-bundle/ffe7ea1ea08f455a.woff2 +0 -0
  241. package/dist/remotion-bundle/index.html +49 -0
  242. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/0.mp3 +0 -0
  243. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/1.mp3 +0 -0
  244. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/2.mp3 +0 -0
  245. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/3.mp3 +0 -0
  246. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/0.mp3 +0 -0
  247. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/1.mp3 +0 -0
  248. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/2.mp3 +0 -0
  249. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/3.mp3 +0 -0
  250. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/0.mp3 +0 -0
  251. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/1.mp3 +0 -0
  252. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/2.mp3 +0 -0
  253. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/3.mp3 +0 -0
  254. package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/0.mp3 +0 -0
  255. package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/1.mp3 +0 -0
  256. package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/2.mp3 +0 -0
  257. package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/3.mp3 +0 -0
  258. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/0.mp3 +0 -0
  259. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/1.mp3 +0 -0
  260. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/2.mp3 +0 -0
  261. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/3.mp3 +0 -0
  262. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/0.mp3 +0 -0
  263. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/1.mp3 +0 -0
  264. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/2.mp3 +0 -0
  265. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/3.mp3 +0 -0
  266. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/0.mp3 +0 -0
  267. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/1.mp3 +0 -0
  268. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/2.mp3 +0 -0
  269. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/3.mp3 +0 -0
  270. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/0.mp3 +0 -0
  271. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/1.mp3 +0 -0
  272. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/2.mp3 +0 -0
  273. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/3.mp3 +0 -0
  274. package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/0.mp3 +0 -0
  275. package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/1.mp3 +0 -0
  276. package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/2.mp3 +0 -0
  277. package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/3.mp3 +0 -0
  278. package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/0.mp3 +0 -0
  279. package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/1.mp3 +0 -0
  280. package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/2.mp3 +0 -0
  281. package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/3.mp3 +0 -0
  282. package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/0.mp3 +0 -0
  283. package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/1.mp3 +0 -0
  284. package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/2.mp3 +0 -0
  285. package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/3.mp3 +0 -0
  286. package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/4.mp3 +0 -0
  287. package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/0.mp3 +0 -0
  288. package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/1.mp3 +0 -0
  289. package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/2.mp3 +0 -0
  290. package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/3.mp3 +0 -0
  291. package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/0.mp3 +0 -0
  292. package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/1.mp3 +0 -0
  293. package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/2.mp3 +0 -0
  294. package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/3.mp3 +0 -0
  295. package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/4.mp3 +0 -0
  296. package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/0.mp3 +0 -0
  297. package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/1.mp3 +0 -0
  298. package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/2.mp3 +0 -0
  299. package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/3.mp3 +0 -0
  300. package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/4.mp3 +0 -0
  301. package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/0.mp3 +0 -0
  302. package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/1.mp3 +0 -0
  303. package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/2.mp3 +0 -0
  304. package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/3.mp3 +0 -0
  305. package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/4.mp3 +0 -0
  306. package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/0.mp3 +0 -0
  307. package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/1.mp3 +0 -0
  308. package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/2.mp3 +0 -0
  309. package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/3.mp3 +0 -0
  310. package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/4.mp3 +0 -0
  311. package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/0.mp3 +0 -0
  312. package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/1.mp3 +0 -0
  313. package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/2.mp3 +0 -0
  314. package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/3.mp3 +0 -0
  315. package/dist/remotion-bundle/public/paper-slide-experiments/product-update/0.mp3 +0 -0
  316. package/dist/remotion-bundle/public/paper-slide-experiments/product-update/1.mp3 +0 -0
  317. package/dist/remotion-bundle/public/paper-slide-experiments/product-update/2.mp3 +0 -0
  318. package/dist/remotion-bundle/public/paper-slide-experiments/product-update/3.mp3 +0 -0
  319. package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/0.mp3 +0 -0
  320. package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/1.mp3 +0 -0
  321. package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/2.mp3 +0 -0
  322. package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/3.mp3 +0 -0
  323. package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/0.mp3 +0 -0
  324. package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/1.mp3 +0 -0
  325. package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/2.mp3 +0 -0
  326. package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/3.mp3 +0 -0
  327. package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/4.mp3 +0 -0
  328. package/dist/remotion-bundle/public/voiceover/ai-life/card-0.mp3 +0 -0
  329. package/dist/remotion-bundle/public/voiceover/ai-life/card-1.mp3 +0 -0
  330. package/dist/remotion-bundle/public/voiceover/ai-life/card-2.mp3 +0 -0
  331. package/dist/remotion-bundle/public/voiceover/ai-life/card-3.mp3 +0 -0
  332. package/dist/remotion-bundle/public/voiceover/ai-life/card-4.mp3 +0 -0
  333. package/dist/remotion-bundle/public/voiceover/ai-life/card-5.mp3 +0 -0
  334. package/dist/remotion-bundle/public/voiceover/coffee-science/card-0.mp3 +0 -0
  335. package/dist/remotion-bundle/public/voiceover/coffee-science/card-1.mp3 +0 -0
  336. package/dist/remotion-bundle/public/voiceover/coffee-science/card-2.mp3 +0 -0
  337. package/dist/remotion-bundle/public/voiceover/coffee-science/card-3.mp3 +0 -0
  338. package/dist/remotion-bundle/public/voiceover/coffee-science/card-4.mp3 +0 -0
  339. package/dist/remotion-bundle/public/voiceover/coffee-science/card-5.mp3 +0 -0
  340. package/dist/remotion-bundle/public/voiceover/coffee-science/card-6.mp3 +0 -0
  341. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-0.mp3 +0 -0
  342. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-1.mp3 +0 -0
  343. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-2.mp3 +0 -0
  344. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-3.mp3 +0 -0
  345. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-4.mp3 +0 -0
  346. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-5.mp3 +0 -0
  347. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-6.mp3 +0 -0
  348. package/dist/remotion-bundle/public/voiceover/remote-work/card-0.mp3 +0 -0
  349. package/dist/remotion-bundle/public/voiceover/remote-work/card-1.mp3 +0 -0
  350. package/dist/remotion-bundle/public/voiceover/remote-work/card-2.mp3 +0 -0
  351. package/dist/remotion-bundle/public/voiceover/remote-work/card-3.mp3 +0 -0
  352. package/dist/remotion-bundle/public/voiceover/remote-work/card-4.mp3 +0 -0
  353. package/dist/remotion-bundle/public/voiceover/remote-work/card-5.mp3 +0 -0
  354. package/dist/remotion-bundle/source-map-helper.wasm +0 -0
  355. package/lib/cli.js +270 -0
  356. package/lib/commands/_registry.js +48 -0
  357. package/lib/commands/add.js +242 -0
  358. package/lib/commands/asr/azure-transcribe.js +336 -0
  359. package/lib/commands/asr/cloud-transcribe.js +384 -0
  360. package/lib/commands/asr/helpers.js +76 -0
  361. package/lib/commands/asr/index.js +236 -0
  362. package/lib/commands/asr/local-transcribe.js +125 -0
  363. package/lib/commands/asr-jobs.js +257 -0
  364. package/lib/commands/asr.js +11 -0
  365. package/lib/commands/auth-cmds.js +358 -0
  366. package/lib/commands/dub.js +542 -0
  367. package/lib/commands/explain.js +512 -0
  368. package/lib/commands/feedback.js +152 -0
  369. package/lib/commands/image.js +207 -0
  370. package/lib/commands/mcp-key.js +166 -0
  371. package/lib/commands/narrate.js +639 -0
  372. package/lib/commands/picstory-templates.js +276 -0
  373. package/lib/commands/picstory.js +547 -0
  374. package/lib/commands/podcast/dialogue.js +109 -0
  375. package/lib/commands/podcast/generate.js +127 -0
  376. package/lib/commands/podcast/index.js +561 -0
  377. package/lib/commands/podcast/synthesize.js +188 -0
  378. package/lib/commands/podcast.js +11 -0
  379. package/lib/commands/present.js +519 -0
  380. package/lib/commands/publish.js +415 -0
  381. package/lib/commands/skills.js +473 -0
  382. package/lib/commands/slice-preview.js +266 -0
  383. package/lib/commands/slice-render.js +282 -0
  384. package/lib/commands/slice-stage.js +264 -0
  385. package/lib/commands/slice.js +343 -0
  386. package/lib/commands/slides/constants.js +108 -0
  387. package/lib/commands/slides/html-renderer.js +338 -0
  388. package/lib/commands/slides/index.js +345 -0
  389. package/lib/commands/slides.js +11 -0
  390. package/lib/commands/story.js +302 -0
  391. package/lib/commands/summarize.js +532 -0
  392. package/lib/commands/synthesize.js +261 -0
  393. package/lib/commands/translate.js +593 -0
  394. package/lib/commands/upgrade.js +249 -0
  395. package/lib/commands/video-translate.js +577 -0
  396. package/lib/commands/voices.js +292 -0
  397. package/lib/core/agent-env.js +104 -0
  398. package/lib/core/args.js +107 -0
  399. package/lib/core/asr-client.js +448 -0
  400. package/lib/core/asr-jobs-client.js +126 -0
  401. package/lib/core/asr-jobs-store.js +105 -0
  402. package/lib/core/asr-r2-upload.js +181 -0
  403. package/lib/core/asr-upload.js +132 -0
  404. package/lib/core/audio-extract.js +150 -0
  405. package/lib/core/audio.js +219 -0
  406. package/lib/core/auth.js +880 -0
  407. package/lib/core/config.js +197 -0
  408. package/lib/core/feedback.js +64 -0
  409. package/lib/core/ffmpeg.js +476 -0
  410. package/lib/core/http.js +188 -0
  411. package/lib/core/image-client.js +55 -0
  412. package/lib/core/intent-params.js +11 -0
  413. package/lib/core/llm-client.js +76 -0
  414. package/lib/core/logger.js +208 -0
  415. package/lib/core/mic-recorder.js +182 -0
  416. package/lib/core/pause-markers.js +94 -0
  417. package/lib/core/podcast-pacing.js +118 -0
  418. package/lib/core/spinner.js +33 -0
  419. package/lib/core/srt.js +394 -0
  420. package/lib/core/telemetry.js +100 -0
  421. package/lib/core/timeline.js +92 -0
  422. package/lib/core/tts-synthesizer.js +70 -0
  423. package/lib/core/update-check.js +185 -0
  424. package/lib/core/url-download.js +148 -0
  425. package/lib/core/whisper-local.js +279 -0
  426. package/lib/internal/deck-validator.js +488 -0
  427. package/lib/internal/slice-themes.json +370 -0
  428. package/lib/stage-core/cloud-render.js +170 -0
  429. package/lib/stage-core/deck-format.js +133 -0
  430. package/lib/stage-core/edit-prompt.js +104 -0
  431. package/lib/stage-core/event-bus.js +31 -0
  432. package/lib/stage-core/port.js +46 -0
  433. package/lib/stage-core/server.js +352 -0
  434. package/lib/stage-core/snapshot-store.js +198 -0
  435. package/lib/stage-core/watcher.js +106 -0
  436. package/lib/stage-ui/slice/template.js +1672 -0
  437. package/package.json +9 -4
  438. package/skills/.claude-plugin/marketplace.json +22 -0
  439. package/skills/.claude-plugin/plugin.json +25 -0
  440. package/skills/LICENSE +21 -0
  441. package/skills/README.md +120 -0
  442. package/skills/hub/SKILL.md +317 -0
  443. package/skills/podcast/SKILL.md +146 -0
  444. package/skills/slice/SKILL.md +205 -0
  445. package/skills/slice/agents/openai.yaml +4 -0
  446. package/skills/slice/references/deck-schema.md +183 -0
  447. package/skills/slice/references/example-decks.md +108 -0
  448. package/skills/slice/references/themes.md +172 -0
  449. package/skills/transcribe/SKILL.md +473 -0
  450. package/skills/video/SKILL.md +261 -0
  451. package/skills/voxflow-slice/SKILL.md +271 -0
  452. package/skills/voxflow-slice/examples/article.md +13 -0
  453. package/skills/voxflow-slice/examples/expected-deck.json +39 -0
  454. package/skills/voxflow-slice/examples/validate.mjs +46 -0
@@ -0,0 +1,172 @@
1
+ # Slice Themes
2
+
3
+ The Slice product (`voxflow.studio/apps/slice`) ships 13 visual themes. Same deck JSON, thirteen different looks. Pick by platform fit and content mood — not by content topic.
4
+
5
+ ## Quick Picker
6
+
7
+ | Theme id | Label | Platform fit | Pick when… |
8
+ |---|---|---|---|
9
+ | `paper-slide` | 纸面 | 抖音 · 视频号 · 小红书 | Knowledge / management / investing / psychology / philosophy. Content needs "stop and think for a beat". |
10
+ | `editorial-mag` | 编辑刊 | 知乎 · 公众号 · LinkedIn | Long commentary, policy analysis, profile features, deep industry reports. Wants Atlantic / NYT-magazine credibility. |
11
+ | `bold-poster` | 大字海报 | X · Threads · LinkedIn | One-line takes, investing calls, product judgments, controversial claims, data flashes. The scroll has to stop. |
12
+ | `notion-card` | Notion 卡 | 公众号 · 飞书 · 知识星球 | Methodology notes, SOPs, knowledge-base teardowns, product retros, tutorial roundups. Looks like serious notes. |
13
+ | `brutalist` | 粗野 | X · Mastodon · 独立播客 | Hard takes, tech critiques, podcast episode posters, culture commentary, contrarian positions. Refuses polish. |
14
+ | `glass-dark` | 玻璃夜 | 抖音 · 视频号 · TikTok | AI / tech, future narratives, night-mood content, cinematic interviews, gaming / digital. OLED-first. |
15
+ | `editorial-stencil` | 编辑·海报 | LinkedIn · 知乎 · 公众号 | Agency-pitch posters, brand keynote notes, opinion essays that want letterbox cinema feel + dual-tone heavy display. |
16
+ | `broadsheet` | 财经刊 | LinkedIn · 知乎 · 雪球 | Market commentary, macro analysis, earnings teardowns, fund-manager letters. FT salmon paper + drop-cap = automatic finance credibility. |
17
+ | `blueprint` | 蓝晒图 | 少数派 · 知乎 · GitHub | Engineering / architecture explainers, system design teardowns, dev tooling reviews. Cyan grid + orange dimension marks = "this is a spec, not a vibe". |
18
+ | `daisy-pastel` | 雏菊 | 小红书 · 微博 · 即刻 | Lifestyle, self-care, journaling, soft-skill posts, anything that wants to feel hand-drawn and approachable. Cream + pink + tiny stars. |
19
+ | `showa-catalog` | 昭和目录 | 小红书 · B 站 · 播客 | 70s city-pop nostalgia, music recs, retro book reviews, podcast covers, weekend essays. Rainbow stripes + sun stamp. |
20
+ | `photo-feature` | 摄影刊 | 小红书 · 知乎 · 微博 | Travel diaries, place-based reportage, photography commentary, scene-setting pieces. **Needs `imageUrl` per card** — falls back to SVG stub when missing (plumbing pending). |
21
+ | `atmospheric` | 深夜刊 | 微博 · 即刻 · 播客 | Late-night essays, romantic prose, mood pieces, podcast teasers. Black ground + a single warm spotlight + pink serif italic. |
22
+
23
+ ## Theme Details
24
+
25
+ ### `paper-slide` — 纸面
26
+
27
+ **Visual signature**: Aged paper texture · serif red headlines · hand-drawn vermilion stamps. Reads halfway between "reading-notebook" and "old-newspaper column" — knowledge feel, trust feel.
28
+
29
+ **Why it works on 抖音 / 视频号 / 小红书**: Algos no longer reward static text cards, but narrated paper-card video with paged TTS rhythm still ships. Measured completion rate ~30% above pure-subtitle version.
30
+
31
+ **Good for**: 管理学拆解 · 投资札记 · 心理科普 · 人物访谈节选 · 读书笔记 · 原创随笔
32
+
33
+ **Skip for**: Pure entertainment / fast hooks — pick `bold-poster` or `brutalist` instead.
34
+
35
+ ### `editorial-mag` — 编辑刊
36
+
37
+ **Visual signature**: Cream page · serif italic pulls · magazine-grade whitespace · thin column rules · restrained horizontal dividers. Lifted from The Atlantic / The New Yorker / NYT Magazine.
38
+
39
+ **Why it works on 知乎 / 公众号 / LinkedIn Pulse**: Both algos and readers favour "serious, restrained, professional" layout. Magazine vibe is automatic credibility.
40
+
41
+ **Good for**: 商业评论 · 政策解读 · 人物特稿 · 行业深度报告 · 长篇书评 · 专栏文章
42
+
43
+ **Skip for**: Fast hooks / clickbait — `bold-poster` or `glass-dark` will pop more.
44
+
45
+ ### `bold-poster` — 大字海报
46
+
47
+ **Visual signature**: Left-edge accent block · heavy bold display · oversized numerals as anchors. Page weight is pinned to 1–2 sentence takes — read in one beat, retweet in the next.
48
+
49
+ **Why it works on X / Threads / LinkedIn**: Slide-feeds don't pause longer than a second. Fewer chars carrying heavier judgement = "stop-and-screenshot" energy. Poster is the natural shape.
50
+
51
+ **Good for**: 投资观点 · 产品判断 · 一句话洞察 · 数据快报 · 争议论断 · 行业预测
52
+
53
+ **Skip for**: Long step-by-step reasoning — pick `editorial-mag` or `paper-slide`.
54
+
55
+ ### `notion-card` — Notion 卡
56
+
57
+ **Visual signature**: Pure white background · warm-grey ink · blue accent rule · top-left page-icon. Lifted directly from Notion document layout: 64px grid, Notion warm-grey body, Notion blue.
58
+
59
+ **Why it works on 公众号 / 飞书 / 知识星球**: Audiences in "professional knowledge community" surfaces already read Notion-style as "this is real, structured notes". Conversion lift comes free.
60
+
61
+ **Good for**: 方法论笔记 · SOP 文档 · 知识体系拆解 · 产品复盘 · 教程总结 · Toolkit 推荐
62
+
63
+ **Skip for**: Emotional / viral-pace content — pick `paper-slide` or `glass-dark`.
64
+
65
+ ### `brutalist` — 粗野主义
66
+
67
+ **Visual signature**: Pure black/white · 6px hard borders · NO.NN black labels · raw display type. Sourced from 90s zine covers + indie-podcast posters. Refuses to flatter.
68
+
69
+ **Why it works on X / Mastodon / 独立播客**: Audiences are saturated on polished mini-cards. "Refuses to look produced" pops harder in the feed — recognition factor an order of magnitude over cute aesthetic.
70
+
71
+ **Good for**: 硬核观点 · 技术批判 · 播客海报 · 文化评论 · 独立宣言 · 争议立场
72
+
73
+ **Skip for**: Warm / commercial pitches — pick `glass-dark` or `editorial-mag`.
74
+
75
+ ### `glass-dark` — 玻璃夜
76
+
77
+ **Visual signature**: Deep purple-to-blue gradient · twin radial purple glows · half-transparent glassmorphism icon blocks · purple text-shadow glow. Looks like it was generated inside your phone's dark mode.
78
+
79
+ **Why it works on 抖音 / TikTok / 视频号**: Visual weight of dark content on OLED screens is markedly higher than light content; glass-dark naturally outweighs in the feed — especially during nighttime peak.
80
+
81
+ **Good for**: AI / 科技 · 未来叙事 · 夜间情绪 · 电影感人物 · 游戏 / 数字 · 深夜散文
82
+
83
+ **Skip for**: Policy / education tone — pick `editorial-mag` or `notion-card`.
84
+
85
+ ### `editorial-stencil` — 编辑·海报
86
+
87
+ **Visual signature**: Cream base bracketed by black letterbox bars · dual-tone heavy display (one word in accent, the rest in ink) · Roman-numeral dateline · agency-pitch poster geometry.
88
+
89
+ **Why it works on LinkedIn / 知乎 / 公众号**: Reads as "agency keynote / brand manifesto" rather than "social card" — pops in professional feeds without resorting to clickbait weight.
90
+
91
+ **Good for**: 品牌发布 · 主题演讲笔记 · 观点海报 · 战略复盘 · 行业宣言
92
+
93
+ **Skip for**: Casual journaling — pick `daisy-pastel` or `paper-slide`.
94
+
95
+ ### `broadsheet` — 财经刊
96
+
97
+ **Visual signature**: FT salmon paper · heavy serif headlines · drop-cap first letter · red DATELINE tag · column rule. Lifted from Financial Times / Economist front pages.
98
+
99
+ **Why it works on LinkedIn / 知乎 / 雪球**: Finance audiences already read salmon paper as "real markets writing". Drop-cap + dateline buy ~5 seconds of attention before the reader decides if the take is worth reading.
100
+
101
+ **Good for**: 市场评论 · 宏观分析 · 财报拆解 · 基金经理信 · 行业观察
102
+
103
+ **Skip for**: Fast viral hooks — pick `bold-poster` or `brutalist`.
104
+
105
+ ### `blueprint` — 蓝晒图
106
+
107
+ **Visual signature**: Cyan engineering-blue ground · white grid overlay · orange dimension labels · annotation-style callouts. Looks like a printed blueprint.
108
+
109
+ **Why it works on 少数派 / 知乎 / GitHub**: Dev / engineering audiences read blueprint as "this is a spec, not a vibe". Lets technical content arrive without the usual SaaS-aesthetic overhead.
110
+
111
+ **Good for**: 系统设计 · 架构图说明 · 工具拆解 · 开发流程 · 工程笔记
112
+
113
+ **Skip for**: Emotional or narrative content — pick `atmospheric` or `editorial-mag`.
114
+
115
+ ### `daisy-pastel` — 雏菊
116
+
117
+ **Visual signature**: Cream ground · hand-drawn daisies + tiny stars · soft pink accent · rounded display type. Reads as journal / sticker book.
118
+
119
+ **Why it works on 小红书 / 微博 / 即刻**: Lifestyle / self-care feeds reward hand-made warmth. Stickers + cream + pink registers as "real human wrote this" before the first character is read.
120
+
121
+ **Good for**: 生活方式 · 自我成长 · 手帐分享 · 软话题 · 暖心小记
122
+
123
+ **Skip for**: Finance / engineering — pick `broadsheet` or `blueprint`.
124
+
125
+ ### `showa-catalog` — 昭和目录
126
+
127
+ **Visual signature**: 70s city-pop palette · colored circle stacks · rainbow diagonal stripes · sun stamp · retro catalog typography. Closer to a Showa-era record-shop flyer than a slide.
128
+
129
+ **Why it works on 小红书 / B 站 / 播客**: Nostalgia spike is its own algorithm-friendly hook. Music / book / podcast recs land warmer here than on any "professional" theme.
130
+
131
+ **Good for**: 音乐推荐 · 书单 · 怀旧随笔 · 播客封面 · 周末长文
132
+
133
+ **Skip for**: Hard news / policy — pick `editorial-mag` or `broadsheet`.
134
+
135
+ ### `photo-feature` — 摄影刊
136
+
137
+ **Visual signature**: Full-bleed photograph backdrop · gradient overlay anchoring the bottom · heavy serif title · travel-magazine pacing.
138
+
139
+ **Why it works on 小红书 / 知乎 / 微博**: Photo-led posts already win in lifestyle / travel verticals. Slice's job is to add a narrated card rhythm without losing the photograph's weight.
140
+
141
+ **Good for**: 旅行游记 · 在地报道 · 摄影评论 · 场景描写 · 城市观察
142
+
143
+ **Limitation (current)**: The renderer reads `card.imageUrl` for the backdrop image; until the plumbing for per-card photo upload ships, missing `imageUrl` falls back to a generic SVG stub. Use `paper-slide` or `editorial-mag` if you cannot supply photographs.
144
+
145
+ **Skip for**: Pure text takes — the theme leans on the image; weak photos make the layout feel empty.
146
+
147
+ ### `atmospheric` — 深夜刊
148
+
149
+ **Visual signature**: Black ground · one warm-light cone from the top · pink serif italic title · late-night essay restraint. Looks like a single page lit by a desk lamp.
150
+
151
+ **Why it works on 微博 / 即刻 / 播客**: Late-night reading windows reward mood over information density. Atmospheric concedes the "loud feed" lane and rewards the lurkers scrolling at 1 a.m.
152
+
153
+ **Good for**: 深夜随笔 · 情感长文 · 朗读节选 · 文学摘录 · 播客预告
154
+
155
+ **Skip for**: Daytime / data-heavy content — pick `bold-poster` or `notion-card`.
156
+
157
+ ## How To Pass Theme To The Renderer
158
+
159
+ The deck JSON is theme-agnostic. The theme is a separate field at the top level of the render request:
160
+
161
+ ```json
162
+ {
163
+ "theme": "editorial-mag",
164
+ "header": "...",
165
+ "seriesTitle": "...",
166
+ "cards": [ /* same shape regardless of theme */ ]
167
+ }
168
+ ```
169
+
170
+ Valid `theme` ids: `paper-slide` · `editorial-mag` · `bold-poster` · `notion-card` · `brutalist` · `glass-dark` · `editorial-stencil` · `broadsheet` · `blueprint` · `daisy-pastel` · `showa-catalog` · `photo-feature` · `atmospheric`. Default: `paper-slide`.
171
+
172
+ The 13-theme dispatcher only runs on the Slice cloud renderer (the web app). CLI `voxflow present` / `picstory` use a different scheme set — see SKILL.md → "CLI Approximation Route" for the closest CLI scheme per theme.
@@ -0,0 +1,473 @@
1
+ ---
2
+ name: transcribe
3
+ description: Use when the user wants to transcribe audio/video (including 30-min+ files with word-level timestamps via Azure Batch), translate subtitles, dub a video from SRT, run end-to-end video translation, summarize spoken content, or publish a finished translated video for Skill/agent orchestration. Covers asr, asr-jobs, translate, dub, video-translate, summarize, and publish CLI commands.
4
+ ---
5
+
6
+ # VoxFlow Transcribe / Dub / Translate Skill
7
+
8
+ Audio/video → text → other languages → re-voiced video. Five tightly-related commands:
9
+
10
+ | Command | What it does | Output |
11
+ |---|---|---|
12
+ | `asr` (alias `transcribe`) | Audio/video → text. Cloud (Tencent), local (Whisper), or **Azure Batch** for 30-min+ files. | SRT / TXT / JSON |
13
+ | `asr-jobs` | Browse, inspect, cancel, or download long-running Azure jobs | list / show / cancel / download |
14
+ | `translate` | Translate SRT / text / file | SRT / TXT |
15
+ | `dub` | SRT → timeline-aligned TTS, optionally merged into video | WAV / MP4 |
16
+ | `video-translate` | End-to-end: ASR → translate → dub → merge MP4 | MP4 in target language |
17
+ | `summarize` | Audio/video/text → summary slides (PPTX, optional video) | PPTX / MP4 |
18
+
19
+ ## Prerequisites
20
+
21
+ - `npm install -g voxflow` and `voxflow login`
22
+ - `ffmpeg` installed (`brew install ffmpeg` / `sudo apt install ffmpeg`) — required for `dub --video`, `video-translate`, audio extraction
23
+ - Optional: `whisper.cpp` for local engine (no quota cost). Install via `brew install whisper-cpp` or compile from source.
24
+ - Optional: `sox` / `rec` for `--mic` recording.
25
+
26
+ ---
27
+
28
+ ## 🎙 asr — speech recognition
29
+
30
+ Transcribe a local file, remote URL, or live mic input. Cloud (Tencent ASR) or local (Whisper).
31
+
32
+ ### Quick start
33
+
34
+ ```bash
35
+ voxflow asr --input recording.mp3 # default cloud, zh
36
+ voxflow asr --input meeting.wav --speakers --speaker-number 3 # speaker diarization
37
+ voxflow asr --input video.mp4 --format srt --lang 16k_zh -o out.srt # video → SRT
38
+ voxflow asr --input recording.mp3 --engine local --model small # offline Whisper
39
+ voxflow asr --url https://example.com/audio.mp3 # remote URL
40
+ voxflow asr --mic --lang 16k_en # live mic
41
+ ```
42
+
43
+ ### Engines
44
+
45
+ | `--engine` | Backend | Cost | When |
46
+ |---|---|---|---|
47
+ | `auto` *(default)* | Whisper local if installed, else Tencent cloud | API or free | Default |
48
+ | `cloud` | Tencent ASR | per call | ≤2-hour files, fast turnaround |
49
+ | `local` | whisper.cpp | Free | No quota, offline, slower |
50
+ | `azure` | **Azure Speech Batch (R2-uploaded)** | 150 / min, ceil to next minute | **30-min+ recordings, word-level timestamps, speaker diarization, multi-locale auto-detect** |
51
+
52
+ #### Azure path (durable jobs)
53
+
54
+ The `azure` engine is the right choice when a file would time out on Tencent's flash mode (anything over ~2 hours, or anything you want word-level timestamps on). The CLI:
55
+
56
+ 1. Probes duration with `ffprobe`.
57
+ 2. Extracts to 16 kHz mono WAV with `ffmpeg` to save uplink bandwidth (falls through to original file if `ffmpeg` is missing).
58
+ 3. Uploads to Cloudflare R2 via backend-signed URLs (multipart for files >100 MiB).
59
+ 4. Creates an `asr_jobs` row server-side, charges quota (per audio minute, see below), submits to Azure.
60
+ 5. Polls the backend until terminal state.
61
+
62
+ **Ctrl+C is safe** — the server-side job keeps running and `~/.config/voxflow/jobs/asr-<jobId>.json` lets you resume later via `--job-id <uuid>` or `voxflow asr-jobs show <jobId>`. Quota is automatically refunded on failure or cancel.
63
+
64
+ ```bash
65
+ # 30-min Japanese meeting with speaker diarization → word-timed SRT
66
+ voxflow asr --input meeting-2h.mp4 --engine azure --lang ja-JP --diarize --speaker-number 4 --format srt
67
+
68
+ # Auto-detect language across the four Azure default candidates (en/zh/ja/ko)
69
+ voxflow asr --input multilang.mp3 --engine azure --lang auto
70
+
71
+ # Resume a job after closing the terminal
72
+ voxflow asr --engine azure --job-id 6f3c2798-87bf-4367-bb4c-08b872e12bef
73
+ ```
74
+
75
+ > **Language codes**: Azure uses BCP-47 (`ja-JP`, `zh-CN`, `en-US`, `ko-KR`). Tencent codes (`16k_zh`, `16k_ja`, …) are auto-mapped, so you can keep `--lang 16k_zh` working across engines.
76
+
77
+ ### Modes (cloud only)
78
+
79
+ | `--mode` | Use |
80
+ |---|---|
81
+ | `auto` *(default)* | Picks based on duration |
82
+ | `sentence` | <60s clips, lowest latency |
83
+ | `flash` | 1-min to ~30 min, fast batch |
84
+ | `file` | Long files, async with polling, supports diarization |
85
+
86
+ ### Options
87
+
88
+ | Flag | Default | Notes |
89
+ |---|---|---|
90
+ | `--input <file>` / `--url <url>` / `--mic` | one required | input source. azure engine: `--input` only |
91
+ | `--engine` | `auto` | `auto` \| `cloud` \| `local` \| `azure` |
92
+ | `--model` | `base` | local Whisper: `tiny` \| `base` \| `small` \| `medium` \| `large` |
93
+ | `--mode` | `auto` | cloud (Tencent) only — see modes above |
94
+ | `--lang` | `16k_zh` | Tencent: `16k_zh`, `16k_en`, `16k_zh_en`, `16k_ja`, `16k_ko`. Azure: `auto`, `ja-JP`, `zh-CN`, `en-US`, … (BCP-47) |
95
+ | `--format` | `srt` | `srt` \| `txt` \| `json` |
96
+ | `--speakers` / `--diarize` | false | Speaker diarization — cloud (`flash`/`file`) and azure |
97
+ | `--speaker-number <n>` | — | Hint expected speaker count |
98
+ | `--task-id <id>` | — | Resume polling a Tencent async task (numeric) |
99
+ | `--job-id <uuid>` | — | Resume polling an Azure job (UUID) |
100
+ | `--output <path>` | `<input>.<format>` | |
101
+
102
+ ### Common scenarios
103
+
104
+ **Meeting → SRT with speakers**
105
+ ```bash
106
+ voxflow asr --input meeting.mp4 --speakers --speaker-number 4 --format srt -o meeting.srt
107
+ ```
108
+
109
+ **Quick transcript (no quota cost)**
110
+ ```bash
111
+ voxflow asr --input recording.mp3 --engine local --model small --format txt
112
+ ```
113
+
114
+ **Mixed Chinese + English audio**
115
+ ```bash
116
+ voxflow asr --input bilingual.mp3 --lang 16k_zh_en
117
+ ```
118
+
119
+ ---
120
+
121
+ ## 📋 asr-jobs — browse Azure ASR job history
122
+
123
+ Azure batch jobs run server-side and survive across CLI sessions, so this command is the dashboard for them. All four subcommands talk to `/api/asr/jobs/*` directly.
124
+
125
+ ```bash
126
+ # List the 20 most recent jobs (server-side, paginated)
127
+ voxflow asr-jobs list
128
+
129
+ # Show one job (with transcript preview if succeeded)
130
+ voxflow asr-jobs show 6f3c2798-87bf-4367-bb4c-08b872e12bef
131
+
132
+ # Re-emit the transcript locally without re-running ASR
133
+ voxflow asr-jobs download 6f3c2798-87bf-4367-bb4c-08b872e12bef --format srt -o meeting.srt
134
+
135
+ # Cancel a running job (refunds quota, deletes Azure-side transcription)
136
+ voxflow asr-jobs cancel 6f3c2798-87bf-4367-bb4c-08b872e12bef
137
+
138
+ # Machine-readable
139
+ voxflow asr-jobs list --json
140
+ voxflow asr-jobs show <jobId> --json
141
+ ```
142
+
143
+ | Flag | Default | Notes |
144
+ |---|---|---|
145
+ | `--limit <n>` | 20 | (list) max 100 |
146
+ | `--format srt\|txt\|json` | srt | (download) output format |
147
+ | `--output, -o <path>` | `asr-<jobId>.<ext>` | (download) target file |
148
+ | `--json` | — | (list, show) raw JSON to stdout |
149
+
150
+ > The `download` subcommand is idempotent — handy if you ran `asr` long ago and want to re-emit in a different format without paying again. The transcript is stored in `result_json` server-side for at least 30 days (RLS-scoped, only the owner can read it).
151
+
152
+ ---
153
+
154
+ ## 🌐 translate — SRT / text / file translation
155
+
156
+ LLM batch translation. Accepts SRT (preserves timing), inline text, or a `.txt` / `.md` file.
157
+
158
+ ```bash
159
+ # Translate subtitles, preserve timing
160
+ voxflow translate --srt en.srt --to zh -o zh.srt
161
+
162
+ # Inline text
163
+ voxflow translate --text "你好世界" --to en
164
+
165
+ # File
166
+ voxflow translate --input article.md --to en -o article-en.md
167
+
168
+ # Smart re-timing for length-mismatched languages
169
+ voxflow translate --srt zh.srt --to en --realign
170
+
171
+ # Smaller batches for very long subtitle files
172
+ voxflow translate --srt long.srt --to ja --batch-size 5
173
+ ```
174
+
175
+ ### Options
176
+
177
+ | Flag | Default | Notes |
178
+ |---|---|---|
179
+ | `--srt <file>` / `--text <text>` / `--input <file>` | one required | input |
180
+ | `--to <lang>` | required | `en`, `zh`, `ja`, `ko`, `es`, `fr`, ... (ISO codes) |
181
+ | `--from <lang>` | auto-detect | source language |
182
+ | `--realign` | false | Adjust subtitle timing for target-language length expansion (e.g. EN→ZH usually shrinks; EN→JA usually grows) |
183
+ | `--batch-size <n>` | `10` | Captions per LLM call, 1–20 |
184
+ | `--output <path>` | auto-named | |
185
+
186
+ > Use `--realign` when translating between languages with very different word density (CJK ↔ Latin) so subs don't crash into each other.
187
+
188
+ ---
189
+
190
+ ## 🎬 dub — SRT → timeline-aligned TTS
191
+
192
+ Re-voice a video using its SRT. Per-caption TTS placed at the exact timestamp. Optional speed compensation when speech overflows the slot.
193
+
194
+ ```bash
195
+ # Basic — output WAV
196
+ voxflow dub --srt subtitles.srt -o dubbed.wav
197
+
198
+ # Merge into video (requires ffmpeg)
199
+ voxflow dub --srt subtitles.srt --video input.mp4 -o dubbed.mp4
200
+
201
+ # Multi-speaker (SRT lines tagged `[Speaker: Name]`)
202
+ voxflow dub --srt show.srt --voices speakers.json --speed-auto -o dubbed.wav
203
+
204
+ # With background music ducked under speech
205
+ voxflow dub --srt narration.srt --bgm music.mp3 --ducking 0.3 -o final.wav
206
+
207
+ # Patch mode — re-synthesize one caption without full re-run
208
+ voxflow dub --srt subtitles.srt --patch 5 -o dub-existing.wav
209
+ ```
210
+
211
+ ### `speakers.json` format
212
+
213
+ ```json
214
+ {
215
+ "Alice": "v-female-R2s4N9qJ",
216
+ "Bob": "v-male-s5NqE0rZ",
217
+ "Narrator": "v-female-T8m4WxP7"
218
+ }
219
+ ```
220
+
221
+ SRT captions tag speaker inline:
222
+ ```
223
+ 1
224
+ 00:00:01,000 --> 00:00:03,500
225
+ [Speaker: Alice] Hello from Alice!
226
+ ```
227
+
228
+ Unmatched speakers fall back to `--voice`.
229
+
230
+ ### `--speed-auto` (overflow protection)
231
+
232
+ When TTS audio is longer than the SRT time slot, dub computes `alpha = T_raw / T_target` and re-synthesizes at `speed × alpha`. If `alpha > 2.0`, prints `OVERFLOW_WARNING` and tries at speed `2.0` (max).
233
+
234
+ ### Options
235
+
236
+ | Flag | Default | Notes |
237
+ |---|---|---|
238
+ | `--srt <file>` | required | |
239
+ | `--video <file>` | — | Merge dub into the original video |
240
+ | `--voice <id>` | `v-female-R2s4N9qJ` | Default voice |
241
+ | `--voices <file>` | — | JSON speaker→voiceId map |
242
+ | `--speed <n>` | `1.0` | 0.5–2.0 |
243
+ | `--speed-auto` | false | Auto-compensate per-caption overflow |
244
+ | `--bgm <file>` | — | Background music |
245
+ | `--ducking <n>` | `0.2` | BGM volume when speech is active (0–1) |
246
+ | `--patch <id>` | — | Re-synthesize a single caption by ID |
247
+ | `--output <path>` | `./dub-<ts>.wav` | `.wav` or `.mp4` |
248
+
249
+ ### Pipeline
250
+
251
+ ```
252
+ SRT → parseSrt() → captions[]
253
+
254
+ per-caption TTS (with voice mapping + speed compensation)
255
+
256
+ buildTimelineAudio(segments) → 24kHz / 16-bit / mono WAV
257
+ ↓ optional
258
+ mixWithBgm() → mixed WAV
259
+ ↓ optional
260
+ mergeAudioVideo() → MP4
261
+ ```
262
+
263
+ ---
264
+
265
+ ## 🌍 video-translate — end-to-end pipeline
266
+
267
+ ASR → translate → dub → burn subtitles → auto-open. The "translate this video into another language" one-shot.
268
+
269
+ **Pipeline (5 stages):**
270
+ ```
271
+ [1/5] FFmpeg check
272
+ [2/5] ASR (flash mode → Azure fallback) → fine-grained per-sentence SRT
273
+ [3/5] Translate → quality check → auto-retry untranslated captions
274
+ [4/5] TTS dub (speed-auto) → merge audio into video
275
+ [5/5] Burn subtitles into video → auto-open output
276
+ ```
277
+
278
+ **Output:** `<input>-<lang>.mp4` (with burned subtitles) + `<input>-<lang>.srt` (standalone subtitle file)
279
+
280
+ ```bash
281
+ # Auto-detect source, dub to English
282
+ voxflow video-translate --input video.mp4 --to en
283
+
284
+ # Explicit source, with re-timing
285
+ voxflow video-translate --input video.mp4 --from zh --to en --realign
286
+
287
+ # Specific voice for dubbed track
288
+ voxflow video-translate --input video.mp4 --to ja --voice v-male-Bk7vD3xP
289
+
290
+ # All-local (no quota cost — uses Whisper for ASR; LLM still consumes quota for translation)
291
+ voxflow video-translate --input video.mp4 --to en --engine local
292
+
293
+ # Keep SRT + audio intermediates for inspection
294
+ voxflow video-translate --input video.mp4 --to en --keep-intermediates
295
+ ```
296
+
297
+ ### Options
298
+
299
+ | Flag | Default | Notes |
300
+ |---|---|---|
301
+ | `--input <file>` | required | source video |
302
+ | `--to <lang>` | required | target language code |
303
+ | `--from <lang>` | auto | source language |
304
+ | `--voice <id>` | default | TTS voice for dubbed track |
305
+ | `--voices <file>` | — | Multi-speaker map |
306
+ | `--realign` | false | Adjust subtitle timing for target length |
307
+ | `--speed <n>` | `1.0` | TTS speed |
308
+ | `--batch-size <n>` | `10` | Translation batch size |
309
+ | `--keep-intermediates` | false | Keep SRT, raw audio |
310
+ | `--asr-mode <mode>` | auto | Override ASR mode |
311
+ | `--asr-lang <engine>` | auto | Override ASR engine code |
312
+ | `--engine` | `auto` | ASR engine: `auto` \| `local` \| `cloud` |
313
+ | `--model` | `base` | Whisper model for local engine |
314
+ | `--output <path>` | `<input>-<lang>.mp4` | |
315
+
316
+ > For multi-speaker dubbing, run `asr` separately first with `--speakers`, then edit the resulting SRT to tag `[Speaker: Name]` lines, then run `dub` with `--voices` — `video-translate` doesn't preserve speaker tags through translation by default.
317
+
318
+ ---
319
+
320
+ ## 🚀 publish — one-shot end-to-end (recommended for agents)
321
+
322
+ `publish` bundles ASR / translation / dubbing / merge into a single command and emits a structured JSON result via `--json`. Use this instead of stitching `asr` + `translate` + `dub` yourself when an agent or web orchestrator drives the run.
323
+
324
+ Three build modes (auto-selected from inputs):
325
+
326
+ | Mode | Use when | Inputs |
327
+ |---|---|---|
328
+ | `video-translate` | Source video → translated dubbed video | `--input <video> --to <lang>` |
329
+ | `srt-dub` | You already have an SRT and want it dubbed onto a video | `--input <video> --srt <subs.srt>` |
330
+ | `merge-existing` | Video + audio already produced; just merge + deliver | `--video <v.mp4> --audio <a.wav>` |
331
+
332
+ Publish targets:
333
+
334
+ - `--publish local` (default) — copy artifact to `./published/<base>-<platform>-<ts>.mp4`
335
+ - `--publish webhook --publish-webhook <url>` — POST artifact metadata to webhook, return URL
336
+ - `--publish none` — skip publish step, return final MP4 path only
337
+
338
+ Always pass **`--json`** when invoking from a Skill — stdout becomes a single JSON doc (`artifact.path` / `artifact.durationSec` / `artifact.sizeBytes` / `publish.publishUrl` / `quotaUsed`, etc.) instead of human-readable progress.
339
+
340
+ ```bash
341
+ # End-to-end: source video → translated dubbed publish
342
+ voxflow publish --input talk.mp4 --to en --json
343
+
344
+ # Hand off to webhook publisher
345
+ voxflow publish --input talk.mp4 --to ja --publish webhook --publish-webhook https://hook.example.com/in --json
346
+ ```
347
+
348
+ ---
349
+
350
+ ## 📋 summarize — content → slides (and optional video)
351
+
352
+ Long video/audio/text → ASR (if needed) → LLM summary → PPTX deck. Optional TTS narration and Remotion video render.
353
+
354
+ ```bash
355
+ voxflow summarize --input lecture.mp4
356
+ voxflow summarize --input meeting.mp4 --lang zh --slides 10
357
+ voxflow summarize --input podcast.mp3 --engine local --tts
358
+ voxflow summarize --input lecture.mp4 --video --scheme aurora
359
+ voxflow summarize --text "长篇文章内容..." --slides 6 --lang zh
360
+ ```
361
+
362
+ | Flag | Default | Notes |
363
+ |---|---|---|
364
+ | `--input <file>` / `--text <text>` | one required | |
365
+ | `--slides <n>` | `8` | 4–12 |
366
+ | `--lang` | `en` | Output language |
367
+ | `--engine` | `auto` | ASR engine for `--input` |
368
+ | `--model` | `base` | Whisper model for local ASR |
369
+ | `--tts` | false | Add TTS narration audio per slide |
370
+ | `--video` | false | Also render an MP4 (needs `remotion-cards/`) |
371
+ | `--scheme` | `aurora` | Video scheme — see `voxflow:video` skill for full table |
372
+ | `--voice <id>` | `v-female-R2s4N9qJ` | |
373
+ | `--output <path>` | `<input>-summary.pptx` | |
374
+
375
+ > `summarize --video` overlaps with `present`. Use `summarize` when starting from a long video/audio source; use `present` when starting from a topic / pasted article.
376
+
377
+ ---
378
+
379
+ ## Common workflows
380
+
381
+ ### Translate a YouTube video to Chinese (full pipeline)
382
+
383
+ ```bash
384
+ # 1. Download (yt-dlp / etc.) → video.mp4
385
+ # 2. One-shot:
386
+ voxflow video-translate --input video.mp4 --to zh --realign --keep-intermediates
387
+ # Output: video-zh.mp4 + intermediate .srt files
388
+ ```
389
+
390
+ ### Generate clean SRT from a recording
391
+
392
+ ```bash
393
+ voxflow asr --input recording.mp3 --speakers --speaker-number 3 --format srt -o clean.srt
394
+ ```
395
+
396
+ ### Long meeting / lecture (1 hr+) → word-timed SRT
397
+
398
+ ```bash
399
+ # Kick off — Ctrl+C is safe, the server keeps working.
400
+ voxflow asr --input lecture-2h.mp4 --engine azure --lang ja-JP --diarize --speaker-number 4
401
+
402
+ # Days later, browse what ran:
403
+ voxflow asr-jobs list
404
+
405
+ # Re-download in TXT instead of SRT — no extra quota:
406
+ voxflow asr-jobs download <jobId> --format txt -o lecture.txt
407
+ ```
408
+
409
+ ### Re-dub an existing SRT with different voices
410
+
411
+ ```bash
412
+ voxflow dub --srt show.srt --video show.mp4 --voices new_cast.json --speed-auto -o new_cast.mp4
413
+ ```
414
+
415
+ ### Patch a single bad caption without re-rendering
416
+
417
+ ```bash
418
+ # Edit clean.srt's caption 12, then:
419
+ voxflow dub --srt clean.srt --patch 12 -o updated.wav
420
+ ```
421
+
422
+ ### Lecture / podcast → summary deck
423
+
424
+ ```bash
425
+ voxflow summarize --input lecture-2h.mp4 --slides 12 --lang zh --tts -o summary.pptx
426
+ ```
427
+
428
+ ---
429
+
430
+ ## Quota cost
431
+
432
+ | Operation | Cost |
433
+ |---|---|
434
+ | `asr` cloud (Tencent, per call) | ~50–200 |
435
+ | `asr` local (Whisper) | 0 |
436
+ | `asr` azure (per audio minute, ceil) | 150 (78s = 2min = 300; 30-min = 4500; 1-hr = 9000) |
437
+ | `translate` (per 1K target chars) | ~50 |
438
+ | `dub` per caption (TTS) | ~50 |
439
+ | `video-translate` 5-min video | ~2,000–4,000 |
440
+ | `summarize` 1-hr video | ~4,000–6,000 |
441
+
442
+ Always `voxflow status` before long jobs.
443
+
444
+ ## Rules
445
+
446
+ 1. **Pick the right engine for the file:**
447
+ - `local` — best when you have whisper.cpp installed and want zero quota.
448
+ - `cloud` (Tencent) — best for short clips (≤2 hr), fast turnaround.
449
+ - `azure` — best for **30-min+ recordings, word-level timestamps, multi-locale auto-detect, or anything you might need to resume after a disconnect**. Server-side jobs survive Ctrl+C.
450
+ 2. **Translation batch size is critical:**
451
+ - Default `--batch-size 5` is the sweet spot. Larger batches (10+) cause LLM to silently drop captions.
452
+ - If you see untranslated lines in output, reduce to `--batch-size 3`.
453
+ - The CLI auto-retries failed batches up to 2 times with validation.
454
+ 3. **`--realign`** when translating between very different language families (EN ↔ JA / ZH).
455
+ 4. **For multi-speaker dub**, generate the SRT with `--speakers` first, manually verify and tag, then `dub --voices`.
456
+ 5. **Always test on a 1-minute clip** before running `video-translate` on a long video — it consumes quota linearly.
457
+ 6. After completion, auto-play: `open output.mp4`.
458
+ 7. Keep `--keep-intermediates` on for the first run of any pipeline so you can inspect what failed.
459
+ 8. For Azure jobs that are still running, **don't re-submit** if the user closes the terminal — `voxflow asr-jobs list` to find the jobId, then `voxflow asr --engine azure --job-id <uuid>` (or `voxflow asr-jobs download <uuid>`) resumes free of charge.
460
+ 9. **video-translate auto-enables `--speed-auto`** — if TTS audio overflows the time slot, it auto-adjusts. No manual flag needed.
461
+ 10. **Quality self-check**: After translation, the CLI checks if >30% captions are unchanged (untranslated). If so, it warns you to use a smaller batch size.
462
+
463
+ ## Troubleshooting
464
+
465
+ | Symptom | Cause | Fix |
466
+ |---------|-------|-----|
467
+ | Captions left untranslated (original language) | LLM dropped lines in large batch | Use `--batch-size 3` |
468
+ | `cloud` ASR returns 500 error | Tencent service transient failure | Switch to `--engine azure` |
469
+ | TTS audio overflows time slot | Translation text longer than source | Add `--speed-auto` (or use `video-translate` which enables it by default) |
470
+ | `ffmpeg` not found for `--video` | Not installed or not in PATH | `brew install ffmpeg` / install ffmpeg-full for subtitle burn-in |
471
+ | Azure job seems stuck | Still processing | `voxflow asr-jobs show <id>` to check status; don't re-submit |
472
+ | Subtitle timing drift after translation | Different word density between languages | Add `--realign` |
473
+ | Low subtitle quality in specific domain | ASR hot-words not tuned | Try `--engine azure --lang <exact BCP-47>` for better recognition |