venice-video-harness 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +598 -0
  4. package/dist/assembly/manifest-builder.d.ts +8 -0
  5. package/dist/assembly/manifest-builder.d.ts.map +1 -0
  6. package/dist/assembly/manifest-builder.js +196 -0
  7. package/dist/assembly/manifest-builder.js.map +1 -0
  8. package/dist/assembly/remotion-scaffold.d.ts +14 -0
  9. package/dist/assembly/remotion-scaffold.d.ts.map +1 -0
  10. package/dist/assembly/remotion-scaffold.js +292 -0
  11. package/dist/assembly/remotion-scaffold.js.map +1 -0
  12. package/dist/assembly/types.d.ts +67 -0
  13. package/dist/assembly/types.d.ts.map +1 -0
  14. package/dist/assembly/types.js +5 -0
  15. package/dist/assembly/types.js.map +1 -0
  16. package/dist/characters/describer.d.ts +32 -0
  17. package/dist/characters/describer.d.ts.map +1 -0
  18. package/dist/characters/describer.js +309 -0
  19. package/dist/characters/describer.js.map +1 -0
  20. package/dist/characters/extractor.d.ts +27 -0
  21. package/dist/characters/extractor.d.ts.map +1 -0
  22. package/dist/characters/extractor.js +274 -0
  23. package/dist/characters/extractor.js.map +1 -0
  24. package/dist/characters/reference-manager.d.ts +95 -0
  25. package/dist/characters/reference-manager.d.ts.map +1 -0
  26. package/dist/characters/reference-manager.js +346 -0
  27. package/dist/characters/reference-manager.js.map +1 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +310 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/config.d.ts +22 -0
  33. package/dist/config.d.ts.map +1 -0
  34. package/dist/config.js +66 -0
  35. package/dist/config.js.map +1 -0
  36. package/dist/editing/aligner.d.ts +44 -0
  37. package/dist/editing/aligner.d.ts.map +1 -0
  38. package/dist/editing/aligner.js +201 -0
  39. package/dist/editing/aligner.js.map +1 -0
  40. package/dist/editing/edl.d.ts +45 -0
  41. package/dist/editing/edl.d.ts.map +1 -0
  42. package/dist/editing/edl.js +133 -0
  43. package/dist/editing/edl.js.map +1 -0
  44. package/dist/editing/overlays.d.ts +97 -0
  45. package/dist/editing/overlays.d.ts.map +1 -0
  46. package/dist/editing/overlays.js +41 -0
  47. package/dist/editing/overlays.js.map +1 -0
  48. package/dist/editing/packer.d.ts +52 -0
  49. package/dist/editing/packer.d.ts.map +1 -0
  50. package/dist/editing/packer.js +170 -0
  51. package/dist/editing/packer.js.map +1 -0
  52. package/dist/editing/providers/whisper-cpp.d.ts +32 -0
  53. package/dist/editing/providers/whisper-cpp.d.ts.map +1 -0
  54. package/dist/editing/providers/whisper-cpp.js +239 -0
  55. package/dist/editing/providers/whisper-cpp.js.map +1 -0
  56. package/dist/editing/render.d.ts +36 -0
  57. package/dist/editing/render.d.ts.map +1 -0
  58. package/dist/editing/render.js +227 -0
  59. package/dist/editing/render.js.map +1 -0
  60. package/dist/editing/self-eval.d.ts +48 -0
  61. package/dist/editing/self-eval.d.ts.map +1 -0
  62. package/dist/editing/self-eval.js +293 -0
  63. package/dist/editing/self-eval.js.map +1 -0
  64. package/dist/editing/silence.d.ts +76 -0
  65. package/dist/editing/silence.d.ts.map +1 -0
  66. package/dist/editing/silence.js +189 -0
  67. package/dist/editing/silence.js.map +1 -0
  68. package/dist/editing/types.d.ts +178 -0
  69. package/dist/editing/types.d.ts.map +1 -0
  70. package/dist/editing/types.js +13 -0
  71. package/dist/editing/types.js.map +1 -0
  72. package/dist/index.d.ts +6 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +5 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/interactive.d.ts +12 -0
  77. package/dist/interactive.d.ts.map +1 -0
  78. package/dist/interactive.js +78 -0
  79. package/dist/interactive.js.map +1 -0
  80. package/dist/mini-drama/assembler.d.ts +61 -0
  81. package/dist/mini-drama/assembler.d.ts.map +1 -0
  82. package/dist/mini-drama/assembler.js +466 -0
  83. package/dist/mini-drama/assembler.js.map +1 -0
  84. package/dist/mini-drama/audio-mix.d.ts +65 -0
  85. package/dist/mini-drama/audio-mix.d.ts.map +1 -0
  86. package/dist/mini-drama/audio-mix.js +118 -0
  87. package/dist/mini-drama/audio-mix.js.map +1 -0
  88. package/dist/mini-drama/cli.d.ts +3 -0
  89. package/dist/mini-drama/cli.d.ts.map +1 -0
  90. package/dist/mini-drama/cli.js +2869 -0
  91. package/dist/mini-drama/cli.js.map +1 -0
  92. package/dist/mini-drama/fcpxml-export.d.ts +2 -0
  93. package/dist/mini-drama/fcpxml-export.d.ts.map +1 -0
  94. package/dist/mini-drama/fcpxml-export.js +5 -0
  95. package/dist/mini-drama/fcpxml-export.js.map +1 -0
  96. package/dist/mini-drama/generation-planner.d.ts +24 -0
  97. package/dist/mini-drama/generation-planner.d.ts.map +1 -0
  98. package/dist/mini-drama/generation-planner.js +304 -0
  99. package/dist/mini-drama/generation-planner.js.map +1 -0
  100. package/dist/mini-drama/location-generator.d.ts +23 -0
  101. package/dist/mini-drama/location-generator.d.ts.map +1 -0
  102. package/dist/mini-drama/location-generator.js +144 -0
  103. package/dist/mini-drama/location-generator.js.map +1 -0
  104. package/dist/mini-drama/music-cues.d.ts +96 -0
  105. package/dist/mini-drama/music-cues.d.ts.map +1 -0
  106. package/dist/mini-drama/music-cues.js +332 -0
  107. package/dist/mini-drama/music-cues.js.map +1 -0
  108. package/dist/mini-drama/panel-fixer.d.ts +12 -0
  109. package/dist/mini-drama/panel-fixer.d.ts.map +1 -0
  110. package/dist/mini-drama/panel-fixer.js +319 -0
  111. package/dist/mini-drama/panel-fixer.js.map +1 -0
  112. package/dist/mini-drama/prompt-builder.d.ts +149 -0
  113. package/dist/mini-drama/prompt-builder.d.ts.map +1 -0
  114. package/dist/mini-drama/prompt-builder.js +722 -0
  115. package/dist/mini-drama/prompt-builder.js.map +1 -0
  116. package/dist/mini-drama/reference-slots.d.ts +31 -0
  117. package/dist/mini-drama/reference-slots.d.ts.map +1 -0
  118. package/dist/mini-drama/reference-slots.js +161 -0
  119. package/dist/mini-drama/reference-slots.js.map +1 -0
  120. package/dist/mini-drama/shot-paths.d.ts +77 -0
  121. package/dist/mini-drama/shot-paths.d.ts.map +1 -0
  122. package/dist/mini-drama/shot-paths.js +101 -0
  123. package/dist/mini-drama/shot-paths.js.map +1 -0
  124. package/dist/mini-drama/storyboard-reference-generator.d.ts +47 -0
  125. package/dist/mini-drama/storyboard-reference-generator.d.ts.map +1 -0
  126. package/dist/mini-drama/storyboard-reference-generator.js +293 -0
  127. package/dist/mini-drama/storyboard-reference-generator.js.map +1 -0
  128. package/dist/mini-drama/subtitle-generator.d.ts +12 -0
  129. package/dist/mini-drama/subtitle-generator.d.ts.map +1 -0
  130. package/dist/mini-drama/subtitle-generator.js +139 -0
  131. package/dist/mini-drama/subtitle-generator.js.map +1 -0
  132. package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts +3 -0
  133. package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts.map +1 -0
  134. package/dist/mini-drama/timeline-export/davinci-fcpxml.js +150 -0
  135. package/dist/mini-drama/timeline-export/davinci-fcpxml.js.map +1 -0
  136. package/dist/mini-drama/timeline-export/fcpxml.d.ts +11 -0
  137. package/dist/mini-drama/timeline-export/fcpxml.d.ts.map +1 -0
  138. package/dist/mini-drama/timeline-export/fcpxml.js +140 -0
  139. package/dist/mini-drama/timeline-export/fcpxml.js.map +1 -0
  140. package/dist/mini-drama/timeline-export/index.d.ts +13 -0
  141. package/dist/mini-drama/timeline-export/index.d.ts.map +1 -0
  142. package/dist/mini-drama/timeline-export/index.js +26 -0
  143. package/dist/mini-drama/timeline-export/index.js.map +1 -0
  144. package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts +3 -0
  145. package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts.map +1 -0
  146. package/dist/mini-drama/timeline-export/premiere-xmeml.js +211 -0
  147. package/dist/mini-drama/timeline-export/premiere-xmeml.js.map +1 -0
  148. package/dist/mini-drama/timeline-export/probe.d.ts +53 -0
  149. package/dist/mini-drama/timeline-export/probe.d.ts.map +1 -0
  150. package/dist/mini-drama/timeline-export/probe.js +89 -0
  151. package/dist/mini-drama/timeline-export/probe.js.map +1 -0
  152. package/dist/mini-drama/timeline-export/types.d.ts +57 -0
  153. package/dist/mini-drama/timeline-export/types.d.ts.map +1 -0
  154. package/dist/mini-drama/timeline-export/types.js +14 -0
  155. package/dist/mini-drama/timeline-export/types.js.map +1 -0
  156. package/dist/mini-drama/video-generator.d.ts +22 -0
  157. package/dist/mini-drama/video-generator.d.ts.map +1 -0
  158. package/dist/mini-drama/video-generator.js +1305 -0
  159. package/dist/mini-drama/video-generator.js.map +1 -0
  160. package/dist/mini-drama/voice-reference.d.ts +42 -0
  161. package/dist/mini-drama/voice-reference.d.ts.map +1 -0
  162. package/dist/mini-drama/voice-reference.js +170 -0
  163. package/dist/mini-drama/voice-reference.js.map +1 -0
  164. package/dist/output/html-renderer.d.ts +2 -0
  165. package/dist/output/html-renderer.d.ts.map +1 -0
  166. package/dist/output/html-renderer.js +37 -0
  167. package/dist/output/html-renderer.js.map +1 -0
  168. package/dist/parsers/fountain-parser.d.ts +34 -0
  169. package/dist/parsers/fountain-parser.d.ts.map +1 -0
  170. package/dist/parsers/fountain-parser.js +71 -0
  171. package/dist/parsers/fountain-parser.js.map +1 -0
  172. package/dist/parsers/pdf-parser.d.ts +24 -0
  173. package/dist/parsers/pdf-parser.d.ts.map +1 -0
  174. package/dist/parsers/pdf-parser.js +237 -0
  175. package/dist/parsers/pdf-parser.js.map +1 -0
  176. package/dist/parsers/scene-extractor.d.ts +41 -0
  177. package/dist/parsers/scene-extractor.d.ts.map +1 -0
  178. package/dist/parsers/scene-extractor.js +400 -0
  179. package/dist/parsers/scene-extractor.js.map +1 -0
  180. package/dist/series/manager.d.ts +64 -0
  181. package/dist/series/manager.d.ts.map +1 -0
  182. package/dist/series/manager.js +282 -0
  183. package/dist/series/manager.js.map +1 -0
  184. package/dist/series/types.d.ts +641 -0
  185. package/dist/series/types.d.ts.map +1 -0
  186. package/dist/series/types.js +304 -0
  187. package/dist/series/types.js.map +1 -0
  188. package/dist/storyboard/assembler.d.ts +134 -0
  189. package/dist/storyboard/assembler.d.ts.map +1 -0
  190. package/dist/storyboard/assembler.js +319 -0
  191. package/dist/storyboard/assembler.js.map +1 -0
  192. package/dist/storyboard/prompt-builder.d.ts +113 -0
  193. package/dist/storyboard/prompt-builder.d.ts.map +1 -0
  194. package/dist/storyboard/prompt-builder.js +578 -0
  195. package/dist/storyboard/prompt-builder.js.map +1 -0
  196. package/dist/storyboard/shot-planner.d.ts +34 -0
  197. package/dist/storyboard/shot-planner.d.ts.map +1 -0
  198. package/dist/storyboard/shot-planner.js +446 -0
  199. package/dist/storyboard/shot-planner.js.map +1 -0
  200. package/dist/user-config.d.ts +15 -0
  201. package/dist/user-config.d.ts.map +1 -0
  202. package/dist/user-config.js +103 -0
  203. package/dist/user-config.js.map +1 -0
  204. package/dist/venice/audio-preflight.d.ts +80 -0
  205. package/dist/venice/audio-preflight.d.ts.map +1 -0
  206. package/dist/venice/audio-preflight.js +142 -0
  207. package/dist/venice/audio-preflight.js.map +1 -0
  208. package/dist/venice/audio.d.ts +88 -0
  209. package/dist/venice/audio.d.ts.map +1 -0
  210. package/dist/venice/audio.js +234 -0
  211. package/dist/venice/audio.js.map +1 -0
  212. package/dist/venice/client.d.ts +86 -0
  213. package/dist/venice/client.d.ts.map +1 -0
  214. package/dist/venice/client.js +375 -0
  215. package/dist/venice/client.js.map +1 -0
  216. package/dist/venice/edit.d.ts +57 -0
  217. package/dist/venice/edit.d.ts.map +1 -0
  218. package/dist/venice/edit.js +100 -0
  219. package/dist/venice/edit.js.map +1 -0
  220. package/dist/venice/generate.d.ts +47 -0
  221. package/dist/venice/generate.d.ts.map +1 -0
  222. package/dist/venice/generate.js +150 -0
  223. package/dist/venice/generate.js.map +1 -0
  224. package/dist/venice/image-bytes.d.ts +26 -0
  225. package/dist/venice/image-bytes.d.ts.map +1 -0
  226. package/dist/venice/image-bytes.js +101 -0
  227. package/dist/venice/image-bytes.js.map +1 -0
  228. package/dist/venice/models.d.ts +143 -0
  229. package/dist/venice/models.d.ts.map +1 -0
  230. package/dist/venice/models.js +984 -0
  231. package/dist/venice/models.js.map +1 -0
  232. package/dist/venice/multi-edit.d.ts +40 -0
  233. package/dist/venice/multi-edit.d.ts.map +1 -0
  234. package/dist/venice/multi-edit.js +97 -0
  235. package/dist/venice/multi-edit.js.map +1 -0
  236. package/dist/venice/provenance.d.ts +66 -0
  237. package/dist/venice/provenance.d.ts.map +1 -0
  238. package/dist/venice/provenance.js +151 -0
  239. package/dist/venice/provenance.js.map +1 -0
  240. package/dist/venice/recipe.d.ts +69 -0
  241. package/dist/venice/recipe.d.ts.map +1 -0
  242. package/dist/venice/recipe.js +103 -0
  243. package/dist/venice/recipe.js.map +1 -0
  244. package/dist/venice/rejection.d.ts +63 -0
  245. package/dist/venice/rejection.d.ts.map +1 -0
  246. package/dist/venice/rejection.js +111 -0
  247. package/dist/venice/rejection.js.map +1 -0
  248. package/dist/venice/seedance-preflight.d.ts +38 -0
  249. package/dist/venice/seedance-preflight.d.ts.map +1 -0
  250. package/dist/venice/seedance-preflight.js +29 -0
  251. package/dist/venice/seedance-preflight.js.map +1 -0
  252. package/dist/venice/types.d.ts +212 -0
  253. package/dist/venice/types.d.ts.map +1 -0
  254. package/dist/venice/types.js +9 -0
  255. package/dist/venice/types.js.map +1 -0
  256. package/dist/venice/video.d.ts +77 -0
  257. package/dist/venice/video.d.ts.map +1 -0
  258. package/dist/venice/video.js +163 -0
  259. package/dist/venice/video.js.map +1 -0
  260. package/dist/venice/voices.d.ts +40 -0
  261. package/dist/venice/voices.d.ts.map +1 -0
  262. package/dist/venice/voices.js +194 -0
  263. package/dist/venice/voices.js.map +1 -0
  264. package/package.json +79 -0
@@ -0,0 +1,77 @@
1
+ import type { VeniceClient } from './client.js';
2
+ import type { VideoQueueResponse, VideoRetrieveStatus, VideoQuoteRequest, VideoQuoteResponse } from './types.js';
3
+ /**
4
+ * Get a price estimate for a video generation before committing.
5
+ */
6
+ export declare function quoteVideo(client: VeniceClient, request: VideoQuoteRequest): Promise<VideoQuoteResponse>;
7
+ export interface QueueVideoOptions {
8
+ model: string;
9
+ prompt: string;
10
+ duration: string;
11
+ imageUrl?: string;
12
+ endImageUrl?: string;
13
+ negativePrompt?: string;
14
+ aspectRatio?: string;
15
+ resolution?: string;
16
+ audio?: boolean;
17
+ audioUrl?: string;
18
+ videoUrl?: string;
19
+ referenceImageUrls?: string[];
20
+ elements?: Array<{
21
+ frontal_image_url?: string;
22
+ reference_image_urls?: string[];
23
+ video_url?: string;
24
+ }>;
25
+ sceneImageUrls?: string[];
26
+ /**
27
+ * Voice-donor reference clips (data URLs or HTTP URLs), bound in-prompt as
28
+ * @Audio1, @Audio2, …. Only sent to reference-audio-capable models and only
29
+ * when at least one reference image is present (Venice rejects audio-only).
30
+ */
31
+ referenceAudioUrls?: string[];
32
+ }
33
+ /**
34
+ * Queue a video generation job. Returns the queue_id for polling.
35
+ *
36
+ * Automatically applies model-specific parameter constraints:
37
+ * - Skips resolution/aspect_ratio when not supported
38
+ * - Skips end_image_url when not supported
39
+ * - Validates duration against model capabilities
40
+ */
41
+ export declare function queueVideo(client: VeniceClient, options: QueueVideoOptions): Promise<VideoQueueResponse>;
42
+ export interface PollVideoOptions {
43
+ pollIntervalMs?: number;
44
+ maxPollAttempts?: number;
45
+ onProgress?: (status: VideoRetrieveStatus) => void;
46
+ /** Prompt text passed to VeniceRejectionError for context. */
47
+ prompt?: string;
48
+ /** Override the default silent-reject byte threshold for this poll. */
49
+ silentRejectThreshold?: number;
50
+ /** Skip the silent-reject check (e.g. for low-resolution or short clips). */
51
+ skipSilentRejectCheck?: boolean;
52
+ }
53
+ /**
54
+ * Poll for a video generation result until the MP4 is ready.
55
+ * Returns the raw video buffer.
56
+ */
57
+ export declare function pollVideoResult(client: VeniceClient, model: string, queueId: string, options?: PollVideoOptions): Promise<Buffer>;
58
+ /**
59
+ * Signal completion after downloading. Cleans up server-side storage.
60
+ */
61
+ export declare function completeVideo(client: VeniceClient, model: string, queueId: string): Promise<void>;
62
+ export interface GenerateVideoOptions extends QueueVideoOptions {
63
+ outputPath: string;
64
+ pollIntervalMs?: number;
65
+ maxPollAttempts?: number;
66
+ onProgress?: (status: VideoRetrieveStatus) => void;
67
+ }
68
+ /**
69
+ * Queue, poll, download, and save a video in one call.
70
+ * Returns the saved file path and the raw buffer size.
71
+ */
72
+ export declare function generateVideo(client: VeniceClient, options: GenerateVideoOptions): Promise<{
73
+ path: string;
74
+ sizeBytes: number;
75
+ queueId: string;
76
+ }>;
77
+ //# sourceMappingURL=video.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/venice/video.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAEV,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAmBpB;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAE7B;AAID,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CA4E7B;AAID,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACnD,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,6EAA6E;IAC7E,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAoCjB;AAID;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAMf;AAID,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACpD;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB/D"}
@@ -0,0 +1,163 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Venice Video API -- queue, retrieve, quote, complete
3
+ //
4
+ // Async workflow: queue a job, poll for completion, download the MP4.
5
+ // ---------------------------------------------------------------------------
6
+ import { writeFile, mkdir } from 'node:fs/promises';
7
+ import { dirname } from 'node:path';
8
+ import { getVideoModel, buildModelParams } from './models.js';
9
+ import { MODELS_SUPPORTING_REFERENCE_AUDIO } from '../series/types.js';
10
+ import { assertNotSilentRejectVideo } from './rejection.js';
11
+ const VIDEO_QUEUE_PATH = '/api/v1/video/queue';
12
+ const VIDEO_RETRIEVE_PATH = '/api/v1/video/retrieve';
13
+ const VIDEO_COMPLETE_PATH = '/api/v1/video/complete';
14
+ const VIDEO_QUOTE_PATH = '/api/v1/video/quote';
15
+ const DEFAULT_POLL_INTERVAL_MS = 10_000;
16
+ const DEFAULT_MAX_POLL_ATTEMPTS = 180;
17
+ function sleep(ms) {
18
+ return new Promise(r => setTimeout(r, ms));
19
+ }
20
+ // ---- Quote ----------------------------------------------------------------
21
+ /**
22
+ * Get a price estimate for a video generation before committing.
23
+ */
24
+ export async function quoteVideo(client, request) {
25
+ return client.post(VIDEO_QUOTE_PATH, request);
26
+ }
27
+ /**
28
+ * Queue a video generation job. Returns the queue_id for polling.
29
+ *
30
+ * Automatically applies model-specific parameter constraints:
31
+ * - Skips resolution/aspect_ratio when not supported
32
+ * - Skips end_image_url when not supported
33
+ * - Validates duration against model capabilities
34
+ */
35
+ export async function queueVideo(client, options) {
36
+ const modelSpec = getVideoModel(options.model);
37
+ let duration = options.duration;
38
+ if (modelSpec && modelSpec.durations.length > 0 && !modelSpec.durations.includes(duration)) {
39
+ const requested = parseInt(duration, 10);
40
+ const valid = modelSpec.durations.map(d => parseInt(d, 10)).sort((a, b) => a - b);
41
+ const closest = valid.reduce((prev, curr) => Math.abs(curr - requested) < Math.abs(prev - requested) ? curr : prev);
42
+ console.warn(` Duration ${duration} not supported by ${options.model} (valid: ${modelSpec.durations.join(', ')}). Snapping to ${closest}s.`);
43
+ duration = `${closest}s`;
44
+ }
45
+ const body = {
46
+ model: options.model,
47
+ prompt: options.prompt,
48
+ duration,
49
+ audio: options.audio ?? true,
50
+ };
51
+ if (options.imageUrl)
52
+ body.image_url = options.imageUrl;
53
+ if (options.negativePrompt)
54
+ body.negative_prompt = options.negativePrompt;
55
+ if (options.audioUrl)
56
+ body.audio_url = options.audioUrl;
57
+ if (options.videoUrl)
58
+ body.video_url = options.videoUrl;
59
+ // R2V models require aspect_ratio — warn if not explicitly set
60
+ if (modelSpec?.id.includes('reference-to-video') && !options.aspectRatio) {
61
+ console.warn(` ⚠ No aspect_ratio provided for R2V model ${options.model} — defaulting to 16:9. Set explicitly to avoid wrong orientation.`);
62
+ }
63
+ const modelParams = buildModelParams(options.model, {
64
+ aspectRatio: options.aspectRatio,
65
+ resolution: options.resolution,
66
+ endImageUrl: options.endImageUrl,
67
+ });
68
+ Object.assign(body, modelParams);
69
+ if (options.elements && options.elements.length > 0) {
70
+ if (!modelSpec || modelSpec.supportsElements) {
71
+ body.elements = options.elements;
72
+ }
73
+ }
74
+ if (options.referenceImageUrls && options.referenceImageUrls.length > 0) {
75
+ if (!modelSpec || modelSpec.supportsReferenceImages) {
76
+ body.reference_image_urls = options.referenceImageUrls;
77
+ }
78
+ }
79
+ if (options.sceneImageUrls && options.sceneImageUrls.length > 0) {
80
+ if (!modelSpec || modelSpec.supportsSceneImages) {
81
+ body.scene_image_urls = options.sceneImageUrls;
82
+ }
83
+ }
84
+ // Voice-donor reference audio (@Audio1, @Audio2, …). Gated on model support
85
+ // AND on the presence of at least one reference image — Venice rejects
86
+ // audio-only reference_audio_urls at validation.
87
+ if (options.referenceAudioUrls && options.referenceAudioUrls.length > 0) {
88
+ const supportsRefAudio = modelSpec
89
+ ? modelSpec.supportsReferenceAudio === true
90
+ : MODELS_SUPPORTING_REFERENCE_AUDIO.has(options.model);
91
+ const hasReferenceImage = Array.isArray(body.reference_image_urls)
92
+ && body.reference_image_urls.length > 0;
93
+ if (supportsRefAudio && hasReferenceImage) {
94
+ // Enforce the aggregate ≤3-clip budget defensively.
95
+ body.reference_audio_urls = options.referenceAudioUrls.slice(0, 3);
96
+ }
97
+ else if (supportsRefAudio && !hasReferenceImage) {
98
+ console.warn(` ⚠ Dropping reference_audio_urls for ${options.model}: no reference image present (Venice rejects audio-only reference audio).`);
99
+ }
100
+ else {
101
+ console.warn(` ⚠ Model ${options.model} does not support reference_audio_urls; dropping.`);
102
+ }
103
+ }
104
+ return client.post(VIDEO_QUEUE_PATH, body);
105
+ }
106
+ /**
107
+ * Poll for a video generation result until the MP4 is ready.
108
+ * Returns the raw video buffer.
109
+ */
110
+ export async function pollVideoResult(client, model, queueId, options = {}) {
111
+ const { pollIntervalMs = DEFAULT_POLL_INTERVAL_MS, maxPollAttempts = DEFAULT_MAX_POLL_ATTEMPTS, onProgress, prompt, silentRejectThreshold, skipSilentRejectCheck, } = options;
112
+ for (let attempt = 0; attempt < maxPollAttempts; attempt++) {
113
+ if (attempt > 0)
114
+ await sleep(pollIntervalMs);
115
+ const response = await client.postBinaryOrJson(VIDEO_RETRIEVE_PATH, { model, queue_id: queueId });
116
+ if (Buffer.isBuffer(response.value)) {
117
+ if (!skipSilentRejectCheck) {
118
+ assertNotSilentRejectVideo(response.value, {
119
+ model,
120
+ prompt,
121
+ threshold: silentRejectThreshold,
122
+ });
123
+ }
124
+ return response.value;
125
+ }
126
+ const status = response.value;
127
+ if (status.status === 'PROCESSING' && onProgress) {
128
+ onProgress(status);
129
+ }
130
+ }
131
+ throw new Error(`Timed out waiting for video generation: ${model} (${queueId})`);
132
+ }
133
+ // ---- Complete -------------------------------------------------------------
134
+ /**
135
+ * Signal completion after downloading. Cleans up server-side storage.
136
+ */
137
+ export async function completeVideo(client, model, queueId) {
138
+ try {
139
+ await client.post(VIDEO_COMPLETE_PATH, { model, queue_id: queueId });
140
+ }
141
+ catch {
142
+ // Cleanup is optional -- don't fail the pipeline
143
+ }
144
+ }
145
+ /**
146
+ * Queue, poll, download, and save a video in one call.
147
+ * Returns the saved file path and the raw buffer size.
148
+ */
149
+ export async function generateVideo(client, options) {
150
+ const { outputPath, pollIntervalMs, maxPollAttempts, onProgress, ...queueOpts } = options;
151
+ await mkdir(dirname(outputPath), { recursive: true });
152
+ const { queue_id, model } = await queueVideo(client, queueOpts);
153
+ const videoBuffer = await pollVideoResult(client, model, queue_id, {
154
+ pollIntervalMs,
155
+ maxPollAttempts,
156
+ onProgress,
157
+ prompt: options.prompt,
158
+ });
159
+ await writeFile(outputPath, videoBuffer);
160
+ await completeVideo(client, model, queue_id);
161
+ return { path: outputPath, sizeBytes: videoBuffer.length, queueId: queue_id };
162
+ }
163
+ //# sourceMappingURL=video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/venice/video.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { VeniceClient } from './client.js';
2
+ export interface VoiceInfo {
3
+ voice_id: string;
4
+ name: string;
5
+ category: string;
6
+ labels: Record<string, string>;
7
+ preview_url: string | null;
8
+ description: string | null;
9
+ }
10
+ export type TTSModel = 'tts-kokoro' | 'tts-qwen3-0-6b' | 'tts-qwen3-1-7b';
11
+ export declare function listVoices(model?: TTSModel): Promise<VoiceInfo[]>;
12
+ /**
13
+ * Filter voices by gender, age, and language.
14
+ *
15
+ * Language matching is intentionally fuzzy so callers can ask for "british",
16
+ * "uk", "en-gb", or "british english" and reach `bm_george` / `bf_alice`
17
+ * et al. — the previous strict-equality match required callers to know the
18
+ * exact catalog string ("British English"), which made the audition-voices
19
+ * CLI miss every British voice in the PNW field-guide production.
20
+ *
21
+ * Match rules (case-insensitive):
22
+ * - language alias like 'british' / 'uk' / 'en-gb' / 'british english'
23
+ * matches catalog 'British English' AND any voice_id starting with
24
+ * 'bm_' / 'bf_' (Kokoro British male/female prefixes).
25
+ * - 'american' / 'us' / 'en-us' / 'american english' matches catalog
26
+ * 'American English' AND 'am_' / 'af_'.
27
+ * - 'english' / 'en' (with no region) matches any English variant
28
+ * (American + British) so generic queries still work.
29
+ * - Any other value falls back to a substring match against
30
+ * labels.language and labels.accent. Pass undefined to use the
31
+ * legacy default ('English' family).
32
+ */
33
+ export declare function filterVoices(voices: VoiceInfo[], gender?: string, age?: string, language?: string): VoiceInfo[];
34
+ export declare function generateVoiceSample(client: VeniceClient, voiceId: string, sampleText: string, outputPath: string, modelId?: string): Promise<string>;
35
+ export declare function auditionVoices(client: VeniceClient, candidateVoices: VoiceInfo[], sampleText: string, outputDir: string, modelId?: string): Promise<{
36
+ voiceId: string;
37
+ voiceName: string;
38
+ samplePath: string;
39
+ }[]>;
40
+ //# sourceMappingURL=voices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voices.d.ts","sourceRoot":"","sources":["../../src/venice/voices.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAM1E,wBAAsB,UAAU,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAIvE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB,SAAS,EAAE,CAWb;AA+BD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,eAAe,EAAE,SAAS,EAAE,EAC5B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAuBvE"}
@@ -0,0 +1,194 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Venice TTS Voice Catalog
3
+ //
4
+ // Covers Kokoro voices (tts-kokoro) and Qwen3 voices (tts-qwen3-0-6b,
5
+ // tts-qwen3-1-7b). Voice IDs are model-specific -- using an incompatible
6
+ // voice returns a 400 error.
7
+ // ---------------------------------------------------------------------------
8
+ import { mkdir } from 'node:fs/promises';
9
+ import { join } from 'node:path';
10
+ import { generateSpeech, DEFAULT_VENICE_TTS_MODEL } from './audio.js';
11
+ const KOKORO_VOICES = buildKokoroVoices();
12
+ const QWEN3_VOICES = buildQwen3Voices();
13
+ const ALL_VOICES = [...KOKORO_VOICES, ...QWEN3_VOICES];
14
+ export async function listVoices(model) {
15
+ if (model === 'tts-kokoro')
16
+ return KOKORO_VOICES;
17
+ if (model?.startsWith('tts-qwen3'))
18
+ return QWEN3_VOICES;
19
+ return ALL_VOICES;
20
+ }
21
+ /**
22
+ * Filter voices by gender, age, and language.
23
+ *
24
+ * Language matching is intentionally fuzzy so callers can ask for "british",
25
+ * "uk", "en-gb", or "british english" and reach `bm_george` / `bf_alice`
26
+ * et al. — the previous strict-equality match required callers to know the
27
+ * exact catalog string ("British English"), which made the audition-voices
28
+ * CLI miss every British voice in the PNW field-guide production.
29
+ *
30
+ * Match rules (case-insensitive):
31
+ * - language alias like 'british' / 'uk' / 'en-gb' / 'british english'
32
+ * matches catalog 'British English' AND any voice_id starting with
33
+ * 'bm_' / 'bf_' (Kokoro British male/female prefixes).
34
+ * - 'american' / 'us' / 'en-us' / 'american english' matches catalog
35
+ * 'American English' AND 'am_' / 'af_'.
36
+ * - 'english' / 'en' (with no region) matches any English variant
37
+ * (American + British) so generic queries still work.
38
+ * - Any other value falls back to a substring match against
39
+ * labels.language and labels.accent. Pass undefined to use the
40
+ * legacy default ('English' family).
41
+ */
42
+ export function filterVoices(voices, gender, age, language) {
43
+ return voices.filter(v => {
44
+ const labels = v.labels ?? {};
45
+ if (gender && labels.gender && labels.gender.toLowerCase() !== gender.toLowerCase()) {
46
+ return false;
47
+ }
48
+ if (age && labels.age && labels.age.toLowerCase() !== age.toLowerCase()) {
49
+ return false;
50
+ }
51
+ return matchesLanguage(v, language);
52
+ });
53
+ }
54
+ function matchesLanguage(v, language) {
55
+ const labels = v.labels ?? {};
56
+ const labelLang = (labels.language ?? '').toLowerCase();
57
+ const labelAccent = (labels.accent ?? '').toLowerCase();
58
+ const id = v.voice_id.toLowerCase();
59
+ if (!language)
60
+ return labelLang.includes('english');
61
+ const q = language.trim().toLowerCase();
62
+ const britishAliases = ['british', 'british english', 'uk', 'en-gb', 'engb', 'gb'];
63
+ const americanAliases = ['american', 'american english', 'us', 'en-us', 'enus'];
64
+ const genericEnglishAliases = ['english', 'en'];
65
+ if (britishAliases.includes(q)) {
66
+ return labelLang.includes('british')
67
+ || labelAccent === 'british'
68
+ || id.startsWith('bm_')
69
+ || id.startsWith('bf_');
70
+ }
71
+ if (americanAliases.includes(q)) {
72
+ return labelLang.includes('american')
73
+ || labelAccent === 'american'
74
+ || id.startsWith('am_')
75
+ || id.startsWith('af_');
76
+ }
77
+ if (genericEnglishAliases.includes(q)) {
78
+ return labelLang.includes('english');
79
+ }
80
+ // Fallback: substring match against language label, accent, and id.
81
+ return labelLang.includes(q) || labelAccent.includes(q) || id.includes(q);
82
+ }
83
+ export async function generateVoiceSample(client, voiceId, sampleText, outputPath, modelId) {
84
+ return generateSpeech(client, {
85
+ voiceId,
86
+ text: sampleText,
87
+ modelId: modelId ?? DEFAULT_VENICE_TTS_MODEL,
88
+ }, outputPath);
89
+ }
90
+ export async function auditionVoices(client, candidateVoices, sampleText, outputDir, modelId) {
91
+ await mkdir(outputDir, { recursive: true });
92
+ const results = [];
93
+ for (const voice of candidateVoices) {
94
+ const safeName = voice.name.toLowerCase().replace(/[^a-z0-9]+/g, '-');
95
+ const samplePath = join(outputDir, `${safeName}-${voice.voice_id.slice(0, 8)}.mp3`);
96
+ try {
97
+ await generateVoiceSample(client, voice.voice_id, sampleText, samplePath, modelId ?? voice.category);
98
+ results.push({
99
+ voiceId: voice.voice_id,
100
+ voiceName: voice.name,
101
+ samplePath,
102
+ });
103
+ console.log(` Generated sample: ${voice.name} -> ${samplePath}`);
104
+ }
105
+ catch (err) {
106
+ console.warn(` Failed to generate sample for ${voice.name}: ${err}`);
107
+ }
108
+ }
109
+ return results;
110
+ }
111
+ // ---- Kokoro voices --------------------------------------------------------
112
+ function buildKokoroVoices() {
113
+ return [
114
+ ...buildVoiceGroup('tts-kokoro', 'American English', 'female', [
115
+ 'af_alloy', 'af_aoede', 'af_bella', 'af_heart', 'af_jadzia',
116
+ 'af_jessica', 'af_kore', 'af_nicole', 'af_nova', 'af_river',
117
+ 'af_sarah', 'af_sky',
118
+ ]),
119
+ ...buildVoiceGroup('tts-kokoro', 'American English', 'male', [
120
+ 'am_adam', 'am_echo', 'am_eric', 'am_fenrir', 'am_liam',
121
+ 'am_michael', 'am_onyx', 'am_puck', 'am_santa',
122
+ ]),
123
+ ...buildVoiceGroup('tts-kokoro', 'British English', 'female', ['bf_alice', 'bf_emma', 'bf_lily']),
124
+ ...buildVoiceGroup('tts-kokoro', 'British English', 'male', ['bm_daniel', 'bm_fable', 'bm_george', 'bm_lewis']),
125
+ ...buildVoiceGroup('tts-kokoro', 'Spanish', 'female', ['ef_dora']),
126
+ ...buildVoiceGroup('tts-kokoro', 'Spanish', 'male', ['em_alex', 'em_santa']),
127
+ ...buildVoiceGroup('tts-kokoro', 'French', 'female', ['ff_siwis']),
128
+ ...buildVoiceGroup('tts-kokoro', 'Hindi', 'female', ['hf_alpha', 'hf_beta']),
129
+ ...buildVoiceGroup('tts-kokoro', 'Hindi', 'male', ['hm_omega', 'hm_psi']),
130
+ ...buildVoiceGroup('tts-kokoro', 'Italian', 'female', ['if_sara']),
131
+ ...buildVoiceGroup('tts-kokoro', 'Italian', 'male', ['im_nicola']),
132
+ ...buildVoiceGroup('tts-kokoro', 'Japanese', 'female', ['jf_alpha', 'jf_gongitsune', 'jf_nezumi', 'jf_tebukuro']),
133
+ ...buildVoiceGroup('tts-kokoro', 'Japanese', 'male', ['jm_kumo']),
134
+ ...buildVoiceGroup('tts-kokoro', 'Portuguese', 'female', ['pf_dora']),
135
+ ...buildVoiceGroup('tts-kokoro', 'Portuguese', 'male', ['pm_alex', 'pm_santa']),
136
+ ...buildVoiceGroup('tts-kokoro', 'Chinese', 'female', ['zf_xiaobei', 'zf_xiaoni', 'zf_xiaoxiao', 'zf_xiaoyi']),
137
+ ...buildVoiceGroup('tts-kokoro', 'Chinese', 'male', ['zm_yunjian', 'zm_yunxi', 'zm_yunxia', 'zm_yunyang']),
138
+ ];
139
+ }
140
+ // ---- Qwen3 voices ---------------------------------------------------------
141
+ function buildQwen3Voices() {
142
+ return [
143
+ { voice_id: 'Vivian', name: 'Vivian', category: 'tts-qwen3-1-7b',
144
+ labels: { gender: 'female', age: 'adult', language: 'English' },
145
+ preview_url: null, description: 'Female English voice for Qwen3 TTS (supports style prompts)' },
146
+ { voice_id: 'Serena', name: 'Serena', category: 'tts-qwen3-1-7b',
147
+ labels: { gender: 'female', age: 'adult', language: 'English' },
148
+ preview_url: null, description: 'Female English voice for Qwen3 TTS (supports style prompts)' },
149
+ { voice_id: 'Ono_Anna', name: 'Ono Anna', category: 'tts-qwen3-1-7b',
150
+ labels: { gender: 'female', age: 'adult', language: 'Japanese' },
151
+ preview_url: null, description: 'Female Japanese voice for Qwen3 TTS' },
152
+ { voice_id: 'Sohee', name: 'Sohee', category: 'tts-qwen3-1-7b',
153
+ labels: { gender: 'female', age: 'adult', language: 'Korean' },
154
+ preview_url: null, description: 'Female Korean voice for Qwen3 TTS' },
155
+ { voice_id: 'Uncle_Fu', name: 'Uncle Fu', category: 'tts-qwen3-1-7b',
156
+ labels: { gender: 'male', age: 'adult', language: 'Chinese' },
157
+ preview_url: null, description: 'Male Chinese voice for Qwen3 TTS' },
158
+ { voice_id: 'Dylan', name: 'Dylan', category: 'tts-qwen3-1-7b',
159
+ labels: { gender: 'male', age: 'adult', language: 'English' },
160
+ preview_url: null, description: 'Male English voice for Qwen3 TTS (supports style prompts)' },
161
+ { voice_id: 'Eric', name: 'Eric', category: 'tts-qwen3-1-7b',
162
+ labels: { gender: 'male', age: 'adult', language: 'English' },
163
+ preview_url: null, description: 'Male English voice for Qwen3 TTS (supports style prompts)' },
164
+ { voice_id: 'Ryan', name: 'Ryan', category: 'tts-qwen3-1-7b',
165
+ labels: { gender: 'male', age: 'adult', language: 'English' },
166
+ preview_url: null, description: 'Male English voice for Qwen3 TTS (supports style prompts)' },
167
+ { voice_id: 'Aiden', name: 'Aiden', category: 'tts-qwen3-1-7b',
168
+ labels: { gender: 'male', age: 'adult', language: 'English' },
169
+ preview_url: null, description: 'Male English voice for Qwen3 TTS (supports style prompts)' },
170
+ ];
171
+ }
172
+ // ---- Helpers --------------------------------------------------------------
173
+ function buildVoiceGroup(model, language, gender, ids) {
174
+ return ids.map((voiceId) => ({
175
+ voice_id: voiceId,
176
+ name: titleCase(voiceId.split('_')[1] ?? voiceId),
177
+ category: model,
178
+ labels: {
179
+ gender,
180
+ age: 'adult',
181
+ language,
182
+ },
183
+ preview_url: null,
184
+ description: `${gender} ${language} voice in Venice ${model}`,
185
+ }));
186
+ }
187
+ function titleCase(value) {
188
+ return value
189
+ .split(/[-_]+/)
190
+ .filter(Boolean)
191
+ .map(part => part.charAt(0).toUpperCase() + part.slice(1))
192
+ .join(' ');
193
+ }
194
+ //# sourceMappingURL=voices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voices.js","sourceRoot":"","sources":["../../src/venice/voices.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "venice-video-harness",
3
+ "version": "2.4.0",
4
+ "description": "Standalone consistency-first video production CLI powered by the Venice API",
5
+ "homepage": "https://github.com/jordanurbs/venice-video-harness",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/jordanurbs/venice-video-harness.git"
9
+ },
10
+ "bugs": {
11
+ "url": "https://github.com/jordanurbs/venice-video-harness/issues"
12
+ },
13
+ "type": "module",
14
+ "main": "dist/index.js",
15
+ "keywords": [
16
+ "venice",
17
+ "venice-ai",
18
+ "ai-video",
19
+ "video-generation",
20
+ "video-cli",
21
+ "video-harness",
22
+ "consistent-video",
23
+ "storyboard",
24
+ "image-to-video",
25
+ "text-to-video",
26
+ "multi-shot",
27
+ "character-consistency"
28
+ ],
29
+ "bin": {
30
+ "venice-video": "dist/mini-drama/cli.js",
31
+ "video-harness": "dist/mini-drama/cli.js",
32
+ "storyboard": "dist/cli.js"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc",
36
+ "start": "node dist/mini-drama/cli.js",
37
+ "dev": "tsx src/mini-drama/cli.ts",
38
+ "dev:legacy": "tsx src/cli.ts",
39
+ "transcribe": "tsx scripts/transcribe-sources.ts",
40
+ "timeline": "tsx scripts/timeline-view.ts",
41
+ "clean": "node -e \"require('node:fs').rmSync('dist', {recursive:true, force:true})\"",
42
+ "prepack": "npm run build",
43
+ "test": "npm run build && node --test tests/*.test.mjs",
44
+ "test:legacy": "npm run build && for f in tests/test-*.mjs; do node \"$f\" || exit 1; done",
45
+ "release:check": "npm test && npm run test:legacy && npm audit --omit=dev && npm pack --dry-run"
46
+ },
47
+ "dependencies": {
48
+ "commander": "^12.1.0",
49
+ "dotenv": "^16.4.5",
50
+ "fountain-js": "^1.1.0",
51
+ "pdf-parse": "^1.1.1",
52
+ "sharp": "^0.35.3"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^22.10.0",
56
+ "@types/pdf-parse": "^1.1.4",
57
+ "tsx": "^4.19.0",
58
+ "typescript": "^5.7.0"
59
+ },
60
+ "types": "dist/index.d.ts",
61
+ "exports": {
62
+ ".": {
63
+ "types": "./dist/index.d.ts",
64
+ "import": "./dist/index.js"
65
+ }
66
+ },
67
+ "files": [
68
+ "dist",
69
+ "README.md",
70
+ "CHANGELOG.md",
71
+ "LICENSE"
72
+ ],
73
+ "engines": {
74
+ "node": ">=20"
75
+ },
76
+ "publishConfig": {
77
+ "access": "public"
78
+ }
79
+ }