File size: 3,605 Bytes
5fb05e6
 
 
 
 
5dfc565
5fb05e6
5dfc565
5fb05e6
7bea24d
5dfc565
 
 
5fb05e6
 
5dfc565
e4e0e54
 
5fb05e6
 
 
e4e0e54
 
 
 
 
 
 
 
 
5fb05e6
 
 
 
b2bd451
5fb05e6
 
 
 
 
 
 
 
 
 
 
ef22617
5fb05e6
 
 
c08a992
5fb05e6
 
 
 
 
57adb5c
5fb05e6
 
ccd48b8
5fb05e6
 
 
 
 
 
 
 
 
 
 
9571f2e
5dfc565
5fb05e6
 
 
 
 
 
 
 
 
 
b2bd451
 
 
 
 
 
 
 
5fb05e6
e4e0e54
5fb05e6
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import { v4 as uuidv4 } from "uuid"

// convert a request (which might be invalid)

import { VideoSequence, VideoShot, VideoShotMeta } from "../types.mts"
import { generateSeed } from "./generateSeed.mts"
import { getValidNumber } from "./getValidNumber.mts"
import { shotFormatVersion } from "../config.mts"

export const parseShotRequest = async (sequence: VideoSequence, maybeShotMeta: Partial<VideoShotMeta>): Promise<VideoShot> => {
  // we don't want people to input their own ID or we might have trouble,
  // such as people attempting to use a non-UUID, a file path (to hack us), etc
  const id = uuidv4()

  const shot: VideoShot = {
    id,
    sequenceId: sequence.id,
    ownerId: sequence.ownerId,

    shotPrompt: `${maybeShotMeta.shotPrompt || ""}`,

    // background, weather, lights, time of the day, etc
    environmentPrompt: `${maybeShotMeta.environmentPrompt || ""}`,

    // camera parameters, angle, type of shot etc
    photographyPrompt: `${maybeShotMeta.photographyPrompt || ""}`,

    // dynamic elements of the scene, movement etc
    actionPrompt: `${maybeShotMeta.actionPrompt || ""}`,

    // describe the background audio (crowd, birds, wind, sea etc..)
    backgroundAudioPrompt: `${maybeShotMeta.backgroundAudioPrompt || ""}`,

    // describe the foreground audio (cars revving, footsteps, objects breaking, explosion etc)
    foregroundAudioPrompt: `${maybeShotMeta.foregroundAudioPrompt || maybeShotMeta.shotPrompt || ""}`,

    // describe the main actor visible in the shot (optional)
    actorPrompt: `${maybeShotMeta.actorPrompt || ""}`,

    // describe the main actor voice (man, woman, old, young, amused, annoyed.. etc)
    actorVoicePrompt: `${maybeShotMeta.actorVoicePrompt || ""}`,

    // describe the main actor dialogue line
    actorDialoguePrompt: `${maybeShotMeta.actorDialoguePrompt || ""}`,

    // a video sequence SHOULD NOT HAVE a consistent seed, to avoid weird geometry similarities
    seed: getValidNumber(maybeShotMeta.seed, 0, 2147483647, generateSeed()),

    // a video sequence SHOULD HAVE a consistent grain
    noise: sequence.noise,
    noiseAmount: sequence.noiseAmount,

    // a video sequence CAN HAVE inconsistent scene duration, like in any real movie
    durationMs: getValidNumber(maybeShotMeta.durationMs, 0, 6000, 3000),
    
    // a video sequence CAN HAVE inconsistent iteration steps
    steps: getValidNumber(maybeShotMeta.steps || sequence.steps, 10, 50, 45),

    // a video sequence MUST HAVE consistent frames per second
    fps: getValidNumber(sequence.fps, 8, 60, 30),

    // a video sequence MUST HAVE a consistent resolution
    resolution: sequence.resolution,

    // a video sequence CAN HAVE intro transitions for each shot
    introTransition: 'fade',
    introDurationMs: 500,

    // for internal use

    version: shotFormatVersion,
    fileName: `${sequence.ownerId}_${sequence.id}_${id}.mp4`,
    hasGeneratedPreview: false,
    hasGeneratedVideo: false,
    hasUpscaledVideo: false,
    hasGeneratedBackgroundAudio: false,
    hasGeneratedForegroundAudio: false,
    hasGeneratedActor: false,
    hasInterpolatedVideo: false,
    hasAddedAudio: false,
    hasPostProcessedVideo: false,
    nbCompletedSteps: 0,

    // - generate with Zeroscope
    // - upscale with Zeroscope XL
    // - interpolate with FILE
    // - generate audio background
    // - generate audio foreground
    // - add audio to video
    // - post-processing
    nbTotalSteps: 5,
    progressPercent: 0,
    createdAt: new Date().toISOString(),
    completedAt: '',
    completed: false,
    error: '',
  }

  return shot
}