Skip to content
DashboardGet API Key

Generate lip sync from URLs

client.Lipsync.Generate(ctx, body) (*LipsyncGenerate, error)
POST/v1/lipsync/generate

Starts a lip sync job from exactly one remote video URL and one remote audio URL. The response includes a request identifier to poll later.

ParametersExpand Collapse
body LipsyncGenerateParams
Inputs param.Field[[]LipsyncGenerateParamsInput]

Exactly one video input and one audio input (order does not matter).

Type string

Type of input media.

One of the following:
const LipsyncGenerateParamsInputTypeVideo LipsyncGenerateParamsInputType = "video"
const LipsyncGenerateParamsInputTypeAudio LipsyncGenerateParamsInputType = "audio"
URL string

URL of the media resource.

formaturi
DisableActiveSpeakerDetection param.Field[bool]optional

Disable active speaker detection and use max-face lipsync preprocessing.

ReferenceID param.Field[string]optional

Optional client-provided identifier for later retrieval.

ReturnsExpand Collapse
type LipsyncGenerate struct{…}
RequestID string

Identifier of the created lip sync request.

formatuuid
Status LipsyncGenerateStatus

Current state of the newly created request.

Generate lip sync from URLs

package main

import (
  "context"
  "fmt"

  "github.com/chamelaion/chamelaion-go"
  "github.com/chamelaion/chamelaion-go/option"
)

func main() {
  client := chamelaion.NewClient(
    option.WithAPIKey("My API Key"),
  )
  lipsyncGenerate, err := client.Lipsync.Generate(context.TODO(), chamelaion.LipsyncGenerateParams{
    Inputs: []chamelaion.LipsyncGenerateParamsInput{chamelaion.LipsyncGenerateParamsInput{
      Type: "video",
      URL: "https://cdn.example.com/episodes/42.mp4",
    }, chamelaion.LipsyncGenerateParamsInput{
      Type: "audio",
      URL: "https://cdn.example.com/dubs/42-japanese.wav",
    }},
    ReferenceID: chamelaion.String("dub-episode-42"),
  })
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", lipsyncGenerate.RequestID)
}
{
  "status": "success",
  "request_id": "6f82a2d8-a6d4-4e8a-a0fa-e8b09823a2d8"
}
{
  "error": "invalid request body"
}
{
  "error": "content-type must be application/json"
}
{
  "error": "expected exactly one video input"
}
{
  "error": "expected exactly one audio input"
}
{
  "error": "input type must be \"video\" or \"audio\""
}
{
  "error": "missing authorization header"
}
{
  "error": "invalid authorization format"
}
{
  "error": "missing token"
}
{
  "error": "invalid token"
}
{
  "error": "unauthorized"
}
{
  "error": "token limit reached"
}
{
  "error": "rate limit exceeded"
}
{
  "error": "internal error"
}
Returns Examples
{
  "status": "success",
  "request_id": "6f82a2d8-a6d4-4e8a-a0fa-e8b09823a2d8"
}
{
  "error": "invalid request body"
}
{
  "error": "content-type must be application/json"
}
{
  "error": "expected exactly one video input"
}
{
  "error": "expected exactly one audio input"
}
{
  "error": "input type must be \"video\" or \"audio\""
}
{
  "error": "missing authorization header"
}
{
  "error": "invalid authorization format"
}
{
  "error": "missing token"
}
{
  "error": "invalid token"
}
{
  "error": "unauthorized"
}
{
  "error": "token limit reached"
}
{
  "error": "rate limit exceeded"
}
{
  "error": "internal error"
}