File size: 2,089 Bytes
1cea837
 
d4a1dc1
1cea837
8e3d721
 
f24ad59
 
8919651
 
db70195
1cea837
 
 
8919651
1cea837
f24ad59
 
 
 
db70195
f24ad59
1cea837
 
f24ad59
1cea837
f24ad59
1cea837
58b1ffb
1cea837
d4a1dc1
58b1ffb
1cea837
 
 
 
 
c1ce586
 
 
 
8e3d721
 
 
 
f24ad59
 
db70195
 
8e3d721
 
1cea837
6419aeb
1cea837
f24ad59
1cea837
 
 
 
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
import { NextResponse, NextRequest } from "next/server"

import { ClapProject, ClapSegment, ClapSegmentCategory, newClap, parseClap, serializeClap } from "@aitube/clap"


import { processShot } from "./processShot"
import queryString from "query-string"
import { parseCompletionMode } from "@/app/api/parsers/parseCompletionMode"
import { throwIfInvalidToken } from "@/app/api/v1/auth/throwIfInvalidToken"
import { ClapCompletionMode } from "@aitube/client"
import { parseTurbo } from "@/app/api/parsers/parseTurbo"

// a helper to generate speech for a Clap
export async function POST(req: NextRequest) {
  await throwIfInvalidToken(req.headers.get("Authorization"))

  const qs = queryString.parseUrl(req.url || "")
  const query = (qs || {}).query
  
  const mode = parseCompletionMode(query?.c)
  const turbo = parseTurbo(query?.t)
  
  const blob = await req.blob()

  const existingClap: ClapProject = await parseClap(blob)

  if (!existingClap?.segments) { throw new Error(`no segment found in the provided clap!`) }
  
  // console.log(`[api/edit/dialogues] detected ${existingClap.segments.length} segments`)
  
  const shotsSegments: ClapSegment[] = existingClap.segments.filter(s => s.category === ClapSegmentCategory.CAMERA)
  // console.log(`[api/edit/dialogues] detected ${shotsSegments.length} shots`)
  
  if (shotsSegments.length > 32) {
    throw new Error(`Error, this endpoint being synchronous, it is designed for short stories only (max 32 shots).`)
  }

  const newerClap = mode === ClapCompletionMode.FULL ? existingClap : newClap({
    meta: existingClap.meta
  })

  // we process the shots in parallel (this will increase the queue size in the Gradio spaces)
  await Promise.all(shotsSegments.map(shotSegment =>
    processShot({
      shotSegment,
      existingClap,
      newerClap,
      mode,
      turbo,
    })
  ))

  // console.log(`[api/edit/dialogues] returning the clap augmented with dialogues`)

  return new NextResponse(await serializeClap(newerClap), {
    status: 200,
    headers: new Headers({ "content-type": "application/x-gzip" }),
  })
}