File size: 1,850 Bytes
a65e95e
 
5dfc565
a65e95e
cd0e411
 
 
 
a65e95e
12506f0
a65e95e
 
 
 
cd0e411
 
 
a65e95e
cd0e411
a65e95e
816a8b6
cd0e411
 
 
 
 
 
 
 
816a8b6
a65e95e
cd0e411
 
a65e95e
cd0e411
 
 
a65e95e
caa2240
a65e95e
cd0e411
a65e95e
cd0e411
a65e95e
cd0e411
 
a65e95e
cd0e411
 
a65e95e
cd0e411
 
 
a65e95e
cd0e411
 
 
 
 
 
a65e95e
 
cd0e411
a65e95e
cd0e411
a65e95e
cd0e411
 
 
 
 
 
816a8b6
 
 
cd0e411
816a8b6
a65e95e
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
import puppeteer from "puppeteer"

import { downloadFileToTmp } from "../utils/downloadFileToTmp.mts"

export const state = {
  load: 0
}

const instances: string[] = [
  process.env.VC_VOICE_GENERATION_SPACE_API_URL
]

// TODO we should use an inference endpoint instead
export async function generateVoice(prompt: string, voiceFileName: string) {
  if (state.load === instances.length) {
    throw new Error(`all voice generation servers are busy, try again later..`)
  }

  state.load += 1

  try {
    const instance = instances.shift()
    instances.push(instance)

    console.log("instance:", instance)
    
    const browser = await puppeteer.launch({
      headless: true,
      protocolTimeout: 800000,
    })

    try {
      const page = await browser.newPage()

      await page.goto(instance, {
        waitUntil: "networkidle2",
      })

      // await new Promise(r => setTimeout(r, 1000))

      const firstTextarea = await page.$('textarea[data-testid="textbox"]')

      await firstTextarea.type(prompt)

      // console.log("looking for the button to submit")
      const submitButton = await page.$("button.lg")

      // console.log("clicking on the button")
      await submitButton.click()

      await page.waitForSelector("audio", {
        timeout: 800000, // need to be large enough in case someone else attemps to use our space
      })

      const voiceRemoteUrl = await page.$$eval("audio", el => el.map(x => x.getAttribute("src"))[0])


      console.log({
        voiceRemoteUrl,
      })


      console.log(`- downloading ${voiceFileName} from ${voiceRemoteUrl}`)

      await downloadFileToTmp(voiceRemoteUrl, voiceFileName)

      return voiceFileName
    } catch (err) {
      throw err
    } finally {
      await browser.close()
    }
  } catch (err) {
    throw err
  } finally {
    state.load -= 1
  }
}