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.
- package/CHANGELOG.md +28 -0
- package/LICENSE +21 -0
- package/README.md +598 -0
- package/dist/assembly/manifest-builder.d.ts +8 -0
- package/dist/assembly/manifest-builder.d.ts.map +1 -0
- package/dist/assembly/manifest-builder.js +196 -0
- package/dist/assembly/manifest-builder.js.map +1 -0
- package/dist/assembly/remotion-scaffold.d.ts +14 -0
- package/dist/assembly/remotion-scaffold.d.ts.map +1 -0
- package/dist/assembly/remotion-scaffold.js +292 -0
- package/dist/assembly/remotion-scaffold.js.map +1 -0
- package/dist/assembly/types.d.ts +67 -0
- package/dist/assembly/types.d.ts.map +1 -0
- package/dist/assembly/types.js +5 -0
- package/dist/assembly/types.js.map +1 -0
- package/dist/characters/describer.d.ts +32 -0
- package/dist/characters/describer.d.ts.map +1 -0
- package/dist/characters/describer.js +309 -0
- package/dist/characters/describer.js.map +1 -0
- package/dist/characters/extractor.d.ts +27 -0
- package/dist/characters/extractor.d.ts.map +1 -0
- package/dist/characters/extractor.js +274 -0
- package/dist/characters/extractor.js.map +1 -0
- package/dist/characters/reference-manager.d.ts +95 -0
- package/dist/characters/reference-manager.d.ts.map +1 -0
- package/dist/characters/reference-manager.js +346 -0
- package/dist/characters/reference-manager.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +310 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +66 -0
- package/dist/config.js.map +1 -0
- package/dist/editing/aligner.d.ts +44 -0
- package/dist/editing/aligner.d.ts.map +1 -0
- package/dist/editing/aligner.js +201 -0
- package/dist/editing/aligner.js.map +1 -0
- package/dist/editing/edl.d.ts +45 -0
- package/dist/editing/edl.d.ts.map +1 -0
- package/dist/editing/edl.js +133 -0
- package/dist/editing/edl.js.map +1 -0
- package/dist/editing/overlays.d.ts +97 -0
- package/dist/editing/overlays.d.ts.map +1 -0
- package/dist/editing/overlays.js +41 -0
- package/dist/editing/overlays.js.map +1 -0
- package/dist/editing/packer.d.ts +52 -0
- package/dist/editing/packer.d.ts.map +1 -0
- package/dist/editing/packer.js +170 -0
- package/dist/editing/packer.js.map +1 -0
- package/dist/editing/providers/whisper-cpp.d.ts +32 -0
- package/dist/editing/providers/whisper-cpp.d.ts.map +1 -0
- package/dist/editing/providers/whisper-cpp.js +239 -0
- package/dist/editing/providers/whisper-cpp.js.map +1 -0
- package/dist/editing/render.d.ts +36 -0
- package/dist/editing/render.d.ts.map +1 -0
- package/dist/editing/render.js +227 -0
- package/dist/editing/render.js.map +1 -0
- package/dist/editing/self-eval.d.ts +48 -0
- package/dist/editing/self-eval.d.ts.map +1 -0
- package/dist/editing/self-eval.js +293 -0
- package/dist/editing/self-eval.js.map +1 -0
- package/dist/editing/silence.d.ts +76 -0
- package/dist/editing/silence.d.ts.map +1 -0
- package/dist/editing/silence.js +189 -0
- package/dist/editing/silence.js.map +1 -0
- package/dist/editing/types.d.ts +178 -0
- package/dist/editing/types.d.ts.map +1 -0
- package/dist/editing/types.js +13 -0
- package/dist/editing/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +12 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +78 -0
- package/dist/interactive.js.map +1 -0
- package/dist/mini-drama/assembler.d.ts +61 -0
- package/dist/mini-drama/assembler.d.ts.map +1 -0
- package/dist/mini-drama/assembler.js +466 -0
- package/dist/mini-drama/assembler.js.map +1 -0
- package/dist/mini-drama/audio-mix.d.ts +65 -0
- package/dist/mini-drama/audio-mix.d.ts.map +1 -0
- package/dist/mini-drama/audio-mix.js +118 -0
- package/dist/mini-drama/audio-mix.js.map +1 -0
- package/dist/mini-drama/cli.d.ts +3 -0
- package/dist/mini-drama/cli.d.ts.map +1 -0
- package/dist/mini-drama/cli.js +2869 -0
- package/dist/mini-drama/cli.js.map +1 -0
- package/dist/mini-drama/fcpxml-export.d.ts +2 -0
- package/dist/mini-drama/fcpxml-export.d.ts.map +1 -0
- package/dist/mini-drama/fcpxml-export.js +5 -0
- package/dist/mini-drama/fcpxml-export.js.map +1 -0
- package/dist/mini-drama/generation-planner.d.ts +24 -0
- package/dist/mini-drama/generation-planner.d.ts.map +1 -0
- package/dist/mini-drama/generation-planner.js +304 -0
- package/dist/mini-drama/generation-planner.js.map +1 -0
- package/dist/mini-drama/location-generator.d.ts +23 -0
- package/dist/mini-drama/location-generator.d.ts.map +1 -0
- package/dist/mini-drama/location-generator.js +144 -0
- package/dist/mini-drama/location-generator.js.map +1 -0
- package/dist/mini-drama/music-cues.d.ts +96 -0
- package/dist/mini-drama/music-cues.d.ts.map +1 -0
- package/dist/mini-drama/music-cues.js +332 -0
- package/dist/mini-drama/music-cues.js.map +1 -0
- package/dist/mini-drama/panel-fixer.d.ts +12 -0
- package/dist/mini-drama/panel-fixer.d.ts.map +1 -0
- package/dist/mini-drama/panel-fixer.js +319 -0
- package/dist/mini-drama/panel-fixer.js.map +1 -0
- package/dist/mini-drama/prompt-builder.d.ts +149 -0
- package/dist/mini-drama/prompt-builder.d.ts.map +1 -0
- package/dist/mini-drama/prompt-builder.js +722 -0
- package/dist/mini-drama/prompt-builder.js.map +1 -0
- package/dist/mini-drama/reference-slots.d.ts +31 -0
- package/dist/mini-drama/reference-slots.d.ts.map +1 -0
- package/dist/mini-drama/reference-slots.js +161 -0
- package/dist/mini-drama/reference-slots.js.map +1 -0
- package/dist/mini-drama/shot-paths.d.ts +77 -0
- package/dist/mini-drama/shot-paths.d.ts.map +1 -0
- package/dist/mini-drama/shot-paths.js +101 -0
- package/dist/mini-drama/shot-paths.js.map +1 -0
- package/dist/mini-drama/storyboard-reference-generator.d.ts +47 -0
- package/dist/mini-drama/storyboard-reference-generator.d.ts.map +1 -0
- package/dist/mini-drama/storyboard-reference-generator.js +293 -0
- package/dist/mini-drama/storyboard-reference-generator.js.map +1 -0
- package/dist/mini-drama/subtitle-generator.d.ts +12 -0
- package/dist/mini-drama/subtitle-generator.d.ts.map +1 -0
- package/dist/mini-drama/subtitle-generator.js +139 -0
- package/dist/mini-drama/subtitle-generator.js.map +1 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts +3 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.js +150 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.js.map +1 -0
- package/dist/mini-drama/timeline-export/fcpxml.d.ts +11 -0
- package/dist/mini-drama/timeline-export/fcpxml.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/fcpxml.js +140 -0
- package/dist/mini-drama/timeline-export/fcpxml.js.map +1 -0
- package/dist/mini-drama/timeline-export/index.d.ts +13 -0
- package/dist/mini-drama/timeline-export/index.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/index.js +26 -0
- package/dist/mini-drama/timeline-export/index.js.map +1 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts +3 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.js +211 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.js.map +1 -0
- package/dist/mini-drama/timeline-export/probe.d.ts +53 -0
- package/dist/mini-drama/timeline-export/probe.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/probe.js +89 -0
- package/dist/mini-drama/timeline-export/probe.js.map +1 -0
- package/dist/mini-drama/timeline-export/types.d.ts +57 -0
- package/dist/mini-drama/timeline-export/types.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/types.js +14 -0
- package/dist/mini-drama/timeline-export/types.js.map +1 -0
- package/dist/mini-drama/video-generator.d.ts +22 -0
- package/dist/mini-drama/video-generator.d.ts.map +1 -0
- package/dist/mini-drama/video-generator.js +1305 -0
- package/dist/mini-drama/video-generator.js.map +1 -0
- package/dist/mini-drama/voice-reference.d.ts +42 -0
- package/dist/mini-drama/voice-reference.d.ts.map +1 -0
- package/dist/mini-drama/voice-reference.js +170 -0
- package/dist/mini-drama/voice-reference.js.map +1 -0
- package/dist/output/html-renderer.d.ts +2 -0
- package/dist/output/html-renderer.d.ts.map +1 -0
- package/dist/output/html-renderer.js +37 -0
- package/dist/output/html-renderer.js.map +1 -0
- package/dist/parsers/fountain-parser.d.ts +34 -0
- package/dist/parsers/fountain-parser.d.ts.map +1 -0
- package/dist/parsers/fountain-parser.js +71 -0
- package/dist/parsers/fountain-parser.js.map +1 -0
- package/dist/parsers/pdf-parser.d.ts +24 -0
- package/dist/parsers/pdf-parser.d.ts.map +1 -0
- package/dist/parsers/pdf-parser.js +237 -0
- package/dist/parsers/pdf-parser.js.map +1 -0
- package/dist/parsers/scene-extractor.d.ts +41 -0
- package/dist/parsers/scene-extractor.d.ts.map +1 -0
- package/dist/parsers/scene-extractor.js +400 -0
- package/dist/parsers/scene-extractor.js.map +1 -0
- package/dist/series/manager.d.ts +64 -0
- package/dist/series/manager.d.ts.map +1 -0
- package/dist/series/manager.js +282 -0
- package/dist/series/manager.js.map +1 -0
- package/dist/series/types.d.ts +641 -0
- package/dist/series/types.d.ts.map +1 -0
- package/dist/series/types.js +304 -0
- package/dist/series/types.js.map +1 -0
- package/dist/storyboard/assembler.d.ts +134 -0
- package/dist/storyboard/assembler.d.ts.map +1 -0
- package/dist/storyboard/assembler.js +319 -0
- package/dist/storyboard/assembler.js.map +1 -0
- package/dist/storyboard/prompt-builder.d.ts +113 -0
- package/dist/storyboard/prompt-builder.d.ts.map +1 -0
- package/dist/storyboard/prompt-builder.js +578 -0
- package/dist/storyboard/prompt-builder.js.map +1 -0
- package/dist/storyboard/shot-planner.d.ts +34 -0
- package/dist/storyboard/shot-planner.d.ts.map +1 -0
- package/dist/storyboard/shot-planner.js +446 -0
- package/dist/storyboard/shot-planner.js.map +1 -0
- package/dist/user-config.d.ts +15 -0
- package/dist/user-config.d.ts.map +1 -0
- package/dist/user-config.js +103 -0
- package/dist/user-config.js.map +1 -0
- package/dist/venice/audio-preflight.d.ts +80 -0
- package/dist/venice/audio-preflight.d.ts.map +1 -0
- package/dist/venice/audio-preflight.js +142 -0
- package/dist/venice/audio-preflight.js.map +1 -0
- package/dist/venice/audio.d.ts +88 -0
- package/dist/venice/audio.d.ts.map +1 -0
- package/dist/venice/audio.js +234 -0
- package/dist/venice/audio.js.map +1 -0
- package/dist/venice/client.d.ts +86 -0
- package/dist/venice/client.d.ts.map +1 -0
- package/dist/venice/client.js +375 -0
- package/dist/venice/client.js.map +1 -0
- package/dist/venice/edit.d.ts +57 -0
- package/dist/venice/edit.d.ts.map +1 -0
- package/dist/venice/edit.js +100 -0
- package/dist/venice/edit.js.map +1 -0
- package/dist/venice/generate.d.ts +47 -0
- package/dist/venice/generate.d.ts.map +1 -0
- package/dist/venice/generate.js +150 -0
- package/dist/venice/generate.js.map +1 -0
- package/dist/venice/image-bytes.d.ts +26 -0
- package/dist/venice/image-bytes.d.ts.map +1 -0
- package/dist/venice/image-bytes.js +101 -0
- package/dist/venice/image-bytes.js.map +1 -0
- package/dist/venice/models.d.ts +143 -0
- package/dist/venice/models.d.ts.map +1 -0
- package/dist/venice/models.js +984 -0
- package/dist/venice/models.js.map +1 -0
- package/dist/venice/multi-edit.d.ts +40 -0
- package/dist/venice/multi-edit.d.ts.map +1 -0
- package/dist/venice/multi-edit.js +97 -0
- package/dist/venice/multi-edit.js.map +1 -0
- package/dist/venice/provenance.d.ts +66 -0
- package/dist/venice/provenance.d.ts.map +1 -0
- package/dist/venice/provenance.js +151 -0
- package/dist/venice/provenance.js.map +1 -0
- package/dist/venice/recipe.d.ts +69 -0
- package/dist/venice/recipe.d.ts.map +1 -0
- package/dist/venice/recipe.js +103 -0
- package/dist/venice/recipe.js.map +1 -0
- package/dist/venice/rejection.d.ts +63 -0
- package/dist/venice/rejection.d.ts.map +1 -0
- package/dist/venice/rejection.js +111 -0
- package/dist/venice/rejection.js.map +1 -0
- package/dist/venice/seedance-preflight.d.ts +38 -0
- package/dist/venice/seedance-preflight.d.ts.map +1 -0
- package/dist/venice/seedance-preflight.js +29 -0
- package/dist/venice/seedance-preflight.js.map +1 -0
- package/dist/venice/types.d.ts +212 -0
- package/dist/venice/types.d.ts.map +1 -0
- package/dist/venice/types.js +9 -0
- package/dist/venice/types.js.map +1 -0
- package/dist/venice/video.d.ts +77 -0
- package/dist/venice/video.d.ts.map +1 -0
- package/dist/venice/video.js +163 -0
- package/dist/venice/video.js.map +1 -0
- package/dist/venice/voices.d.ts +40 -0
- package/dist/venice/voices.d.ts.map +1 -0
- package/dist/venice/voices.js +194 -0
- package/dist/venice/voices.js.map +1 -0
- 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
|
+
}
|