Runway 캐릭터 퍼포먼스 생성
CometAPI와 Runway Control a character API를 사용해 참조 비디오로부터 캐릭터 퍼포먼스 작업을 시작하고, 표정과 신체 움직임을 제어합니다.
curl https://api.cometapi.com/runwayml/v1/character_performance \
-H "Authorization: Bearer $COMETAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"character": {
"type": "video",
"uri": "https://your-video-host/character.mp4"
},
"reference": {
"type": "video",
"uri": "https://your-video-host/performance.mp4"
},
"model": "act_two",
"ratio": "1280:720"
}'import os
import requests
response = requests.post(
"https://api.cometapi.com/runwayml/v1/character_performance",
headers={"Authorization": "Bearer " + os.environ["COMETAPI_KEY"]},
json={
"character": {
"type": "video",
"uri": "https://your-video-host/character.mp4"
},
"reference": {
"type": "video",
"uri": "https://your-video-host/performance.mp4"
},
"model": "act_two",
"ratio": "1280:720"
},
)
task = response.json()
print(task["id"]) # poll GET /runwayml/v1/tasks/{id} until the output array appearsconst response = await fetch("https://api.cometapi.com/runwayml/v1/character_performance", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.COMETAPI_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"character": {
"type": "video",
"uri": "https://your-video-host/character.mp4"
},
"reference": {
"type": "video",
"uri": "https://your-video-host/performance.mp4"
},
"model": "act_two",
"ratio": "1280:720"
}),
});
const task = await response.json();
console.log(task.id); // poll GET /runwayml/v1/tasks/{id} until the output array appears<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cometapi.com/runwayml/v1/character_performance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'character' => [
'type' => 'video',
'uri' => 'https://your-video-host/source.mp4'
],
'reference' => [
'type' => 'video',
'uri' => 'https://your-video-host/source.mp4'
],
'bodyControl' => true,
'expressionIntensity' => 3,
'seed' => 4294967295,
'model' => 'act_two',
'ratio' => '1280:720',
'contentModeration' => [
'publicFigureThreshold' => 'auto'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Runway-Version: <x-runway-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cometapi.com/runwayml/v1/character_performance"
payload := strings.NewReader("{\n \"character\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"reference\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"bodyControl\": true,\n \"expressionIntensity\": 3,\n \"seed\": 4294967295,\n \"model\": \"act_two\",\n \"ratio\": \"1280:720\",\n \"contentModeration\": {\n \"publicFigureThreshold\": \"auto\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Runway-Version", "<x-runway-version>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cometapi.com/runwayml/v1/character_performance")
.header("X-Runway-Version", "<x-runway-version>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"character\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"reference\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"bodyControl\": true,\n \"expressionIntensity\": 3,\n \"seed\": 4294967295,\n \"model\": \"act_two\",\n \"ratio\": \"1280:720\",\n \"contentModeration\": {\n \"publicFigureThreshold\": \"auto\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cometapi.com/runwayml/v1/character_performance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Runway-Version"] = '<x-runway-version>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"character\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"reference\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"bodyControl\": true,\n \"expressionIntensity\": 3,\n \"seed\": 4294967295,\n \"model\": \"act_two\",\n \"ratio\": \"1280:720\",\n \"contentModeration\": {\n \"publicFigureThreshold\": \"auto\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "5b91e444-c232-deaf-a4d7-8aef3e57336b"
}호출 전에 확인할 사항
- 필수
X-Runway-Version헤더를 전송하세요. 예:2024-11-06 model: act_two를 사용하세요- 접근 가능한 HTTPS URL로
characterasset 1개와referenceasset 1개를 제공하세요 - 스타일을 조정하기 전에
bodyControl: true와 중간 정도의expressionIntensity로 시작하세요
출력 비율
| 설정 | 지원 값 | 기본 시작점 | 경계 동작 |
|---|---|---|---|
ratio | 1280:720, 720:1280, 또는 선택한 Runway model/version이 허용하는 다른 비율 | 1280:720 | 캐릭터와 참조 asset이 요청한 프레임 형태와 최대한 가깝도록 유지하세요. |
작업 흐름
캐릭터 퍼포먼스 요청 제출
반환된 task id 저장
id를 보관하세요.작업 상태 폴링
입력 역할
character는 애니메이션을 적용할 대상입니다reference는 표정 퍼포먼스 또는 신체 움직임을 제공하는 소스 클립입니다bodyControl은 모션 전이가 표정 전이와 함께 신체 움직임까지 포함할지 결정합니다contentModeration은 요청에 provider의 moderation 임계값을 적용합니다
인증
Bearer token authentication. Use your CometAPI key.
헤더
Runway version header, for example 2024-11-06.
본문
The character to control. You can either provide a video or an image.
Show child attributes
Show child attributes
Reference performance clip. Provide type (video) and uri (HTTPS URL).
Show child attributes
Show child attributes
Enable body control.
Intensity of the expression transfer. Higher values produce more exaggerated expressions.
Random seed for reproducible results.
The model variant to use. Must be act_two.
Requested output frame shape, for example 1280:720 or 720:1280. Keep the character and reference assets close to the requested frame shape.
Show child attributes
Show child attributes
응답
Task accepted.
curl https://api.cometapi.com/runwayml/v1/character_performance \
-H "Authorization: Bearer $COMETAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"character": {
"type": "video",
"uri": "https://your-video-host/character.mp4"
},
"reference": {
"type": "video",
"uri": "https://your-video-host/performance.mp4"
},
"model": "act_two",
"ratio": "1280:720"
}'import os
import requests
response = requests.post(
"https://api.cometapi.com/runwayml/v1/character_performance",
headers={"Authorization": "Bearer " + os.environ["COMETAPI_KEY"]},
json={
"character": {
"type": "video",
"uri": "https://your-video-host/character.mp4"
},
"reference": {
"type": "video",
"uri": "https://your-video-host/performance.mp4"
},
"model": "act_two",
"ratio": "1280:720"
},
)
task = response.json()
print(task["id"]) # poll GET /runwayml/v1/tasks/{id} until the output array appearsconst response = await fetch("https://api.cometapi.com/runwayml/v1/character_performance", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.COMETAPI_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"character": {
"type": "video",
"uri": "https://your-video-host/character.mp4"
},
"reference": {
"type": "video",
"uri": "https://your-video-host/performance.mp4"
},
"model": "act_two",
"ratio": "1280:720"
}),
});
const task = await response.json();
console.log(task.id); // poll GET /runwayml/v1/tasks/{id} until the output array appears<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cometapi.com/runwayml/v1/character_performance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'character' => [
'type' => 'video',
'uri' => 'https://your-video-host/source.mp4'
],
'reference' => [
'type' => 'video',
'uri' => 'https://your-video-host/source.mp4'
],
'bodyControl' => true,
'expressionIntensity' => 3,
'seed' => 4294967295,
'model' => 'act_two',
'ratio' => '1280:720',
'contentModeration' => [
'publicFigureThreshold' => 'auto'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Runway-Version: <x-runway-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cometapi.com/runwayml/v1/character_performance"
payload := strings.NewReader("{\n \"character\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"reference\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"bodyControl\": true,\n \"expressionIntensity\": 3,\n \"seed\": 4294967295,\n \"model\": \"act_two\",\n \"ratio\": \"1280:720\",\n \"contentModeration\": {\n \"publicFigureThreshold\": \"auto\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Runway-Version", "<x-runway-version>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cometapi.com/runwayml/v1/character_performance")
.header("X-Runway-Version", "<x-runway-version>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"character\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"reference\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"bodyControl\": true,\n \"expressionIntensity\": 3,\n \"seed\": 4294967295,\n \"model\": \"act_two\",\n \"ratio\": \"1280:720\",\n \"contentModeration\": {\n \"publicFigureThreshold\": \"auto\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cometapi.com/runwayml/v1/character_performance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Runway-Version"] = '<x-runway-version>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"character\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"reference\": {\n \"type\": \"video\",\n \"uri\": \"https://your-video-host/source.mp4\"\n },\n \"bodyControl\": true,\n \"expressionIntensity\": 3,\n \"seed\": 4294967295,\n \"model\": \"act_two\",\n \"ratio\": \"1280:720\",\n \"contentModeration\": {\n \"publicFigureThreshold\": \"auto\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "5b91e444-c232-deaf-a4d7-8aef3e57336b"
}