
Flyworks Avatar Video
- 349 installs
- 424 repo stars
- Updated June 8, 2026
- freestylefly/canghe-skills
flyworks-avatar-video is a Claude Code skill that helps developers produce presenter-style avatar videos for product announcements, tutorials, onboarding, and social clips without live filming.
About
flyworks-avatar-video is a generative media skill for creating presenter-style avatar videos when products need human-feel explainer content without a video crew. It guides producing clips suited to product announcements, tutorial walkthroughs, onboarding sequences, and short social posts from scripts or talking points. Developers and technical content leads use it when documentation or UI copy exists but video assets lag behind release schedules. The skill emphasizes repeatable avatar-led production for engineering teams that ship features frequently and need consistent visual explainers tied to releases, demos, or in-app education flows.
- Generates talking-head style videos from scripts or outlines
- Supports tutorial, onboarding, and announcement formats
- Scales video production without studio recording sessions
- Pairs with launch campaigns and lifecycle education content
Flyworks Avatar Video by the numbers
- 349 all-time installs (skills.sh)
- Ranked #468 of 1,337 Generative Media skills by installs in the Skillselion catalog
- Data as of Jul 31, 2026 (Skillselion catalog sync)
npx skills add https://github.com/freestylefly/canghe-skills --skill flyworks-avatar-videoAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 349 |
|---|---|
| repo stars | ★ 424 |
| Last updated | June 8, 2026 |
| Repository | freestylefly/canghe-skills ↗ |
How do you create product tutorial videos without filming?
Produce presenter-style avatar videos for product announcements, tutorials, onboarding, and social clips when teams need human-feel media without filming.
Who is it for?
Development teams shipping frequent product updates who need scripted avatar videos for onboarding and announcements without a production crew.
Skip if: Projects requiring live-action footage, custom motion graphics pipelines, or broadcast-grade editorial control over every frame.
When should I use this skill?
A developer needs avatar-led product announcement, tutorial, onboarding, or social video without organizing a film shoot.
What you get
Presenter-style avatar video assets ready for announcements, onboarding, tutorials, or social distribution.
Files
Avatar Video Generation Skill
This skill allows you to generate videos using Flyworks (a.k.a HiFly 飞影数字人) Digital Humans. Available features: 1. Public Avatar Video: Create video from text or audio using pre-made highly realistic avatars. 2. Talking Photo: Create a "talking photo" video from a single image and text/audio. 3. Voice Cloning: Clone a voice from an audio sample to use in TTS.
For detailed documentation, see the references/ folder:
- authentication.md - API token setup
- avatars.md - Working with avatars
- voices.md - Voice selection and cloning
- video-generation.md - Video creation workflow
API Token & Limitations
This skill works with a default free-tier token, but it has limitations:
- Watermark: Generated videos will have a watermark.
- Duration Limit: Videos are limited to 30 seconds.
To remove limitations: 1. Register at hifly.cc or flyworks.ai. 2. Get your API key from User Settings. 3. Set the environment variable: export HIFLY_API_TOKEN="your_token_here"
Tools
scripts/hifly_client.py
The main entry point for all operations.
Usage
# List available public avatars
python scripts/hifly_client.py list_public_avatars
# List available public voices
python scripts/hifly_client.py list_public_voices
# Create a video with a public avatar (TTS)
python scripts/hifly_client.py create_video --type tts --text "Hello world" --avatar "avatar_id_or_alias" --voice "voice_id_or_alias"
# Create a video with a public avatar (Audio URL or File)
python scripts/hifly_client.py create_video --audio "https://... or path/to/audio.mp3" --avatar "avatar_id_or_alias"
# Create a talked photo video using bundled assets
python scripts/hifly_client.py create_talking_photo --image assets/avatar.png --title "Bundled Avatar"
# Clone a voice using bundled assets
python scripts/hifly_client.py clone_voice --audio assets/voice.MP3 --title "Bundled Voice"
# Check status of generated tasks
python scripts/hifly_client.py check_task --id "TASK_ID"
# Manage local aliases (saved in memory.json)
python scripts/hifly_client.py manage_memory add my_avatar "av_12345"
python scripts/hifly_client.py manage_memory listExamples
1. Create a simple greeting video
# First find a voice and avatar
python scripts/hifly_client.py list_public_avatars
python scripts/hifly_client.py list_public_voices
# Generate
python scripts/hifly_client.py create_video --type tts --text "Welcome to our service." --avatar "av_public_01" --voice "voice_public_01"2. Use a custom talking photo
# Create the avatar from an image URL
python scripts/hifly_client.py create_talking_photo --image "https://mysite.com/photo.jpg" --title "CEO Photo"
# Output will give you an Avatar ID, e.g., av_custom_99
# Save it to memory
python scripts/hifly_client.py manage_memory add ceo av_custom_99
# Generate video using the new avatar
python scripts/hifly_client.py create_video --type tts --text "Here is the quarterly report." --avatar ceo --voice "voice_public_01"Agent Behavior Guidelines
When assisting users with video generation, follow these guidelines:
Voice Selection Required
Video generation requires both text AND a voice. If the user provides text but no voice:
1. Check local memory first: Run manage_memory list to see if the user has saved any voice aliases. 2. Ask the user to choose:
- "I see you want to create a video with the text '[text]'. Which voice would you like to use?"
- If they have saved voices: "You have these saved voices: [list]. Or would you prefer a public voice?"
- If no saved voices: "Would you like to use a public voice, or clone your own voice from an audio sample first?"
3. Help them select:
- To see public voices:
list_public_voices - To clone a voice:
clone_voice --audio [file] --title [name]
Complete Workflow Example
For a prompt like "Create a talking photo video from my photo saying 'this is my AI twin'":
1. Ask: "Which voice would you like for your AI twin? You can use a public voice or clone your own." 2. If they want to clone: Help them with clone_voice 3. Create the talking photo with both text and voice:
python scripts/hifly_client.py create_talking_photo \
--image user_photo.jpg \
--text "this is my AI twin" \
--voice SELECTED_VOICE_ID \
--title "My AI Twin"Saving for Later
After creating avatars or cloning voices, offer to save them:
python scripts/hifly_client.py manage_memory add my_avatar AVATAR_ID --kind avatar
python scripts/hifly_client.py manage_memory add my_voice VOICE_ID --kind voice{
"ownerId": "kn72r4vz1ns6rb5pbgey200ew980g621",
"slug": "flyworks-avatar-video",
"version": "1.0.0",
"publishedAt": 1770223093366
}Flyworks Avatar Video Skill
An Agent Skill for generating videos using Flyworks (a.k.a HiFly) Digital Humans.
Features
- 🎬 Public Avatar Video: Create videos using pre-made realistic avatars with TTS
- 🖼️ Talking Photo: Turn any image into a talking video
- 🎙️ Voice Cloning: Clone voices from audio samples
Installation
Option 1: Using add-skill CLI (Recommended)
# Install globally
npx skills add Flyworks-AI/skills -a claude-code -g
# Or install to current project only
npx skills add Flyworks-AI/skills -a claude-codeWorks with Claude Code, Cursor, Codex, and other agents.
Option 2: Manual Installation
# Clone and symlink to your skills directory
git clone https://github.com/Flyworks-AI/skills.git
ln -s $(pwd)/skills/flyworks-avatar-video ~/.claude/skills/flyworks-avatar-videoOption 3: Direct Copy
git clone https://github.com/Flyworks-AI/skills.git
cp -r skills/flyworks-avatar-video ~/.claude/skills/Quick Start
1. Install Dependencies
pip install -r requirements.txt2. Try it out (with demo token)
The skill includes a demo token for testing (30s limit, watermarked videos):
# List available avatars
python scripts/hifly_client.py list_public_avatars
# Clone a voice using bundled sample
python scripts/hifly_client.py clone_voice --audio assets/voice.MP3 --title "My Voice"
# Create a talking photo
python scripts/hifly_client.py create_talking_photo --image assets/avatar.png --title "My Avatar"3. Use your own API token (optional)
For longer videos without watermarks, get your token from hifly.cc/setting:
export HIFLY_API_TOKEN="your_token_here"Example Prompts
When using with an AI agent, try prompts like:
"Create a talking photo video from my photo"
"Clone my voice from this audio file and generate a greeting video"
"List available public avatars from Flyworks"
"Generate a welcome video with a professional avatar"
"Help me create a video announcement using my custom avatar"Documentation
- SKILL.md - Complete skill documentation
- references/ - Detailed API references
- authentication.md - Token setup
- avatars.md - Working with avatars
- voices.md - Voice cloning
- video-generation.md - Video workflow
API Reference
| Item | Value |
|---|---|
| Base URL | https://hfw-api.hifly.cc/api/v2/hifly |
| Auth | Bearer token via Authorization header |
| Token Source | hifly.cc/setting |
License
MIT - See LICENSE for details.
Authentication
API Token
Flyworks uses bearer token authentication for all API requests.
Getting Your Token
1. Register at flyworks.ai or hifly.cc 2. Navigate to User Settings 3. Copy your API key
Configuration
Set the environment variable:
export HIFLY_API_TOKEN="your_token_here"Demo Token
For testing, the skill includes a demo token with limitations:
- 30 second maximum video duration
- Watermark on all videos
The demo token is automatically used if HIFLY_API_TOKEN is not set.
API Request Format
All requests use the Authorization header:
curl -X GET "https://hfw-api.hifly.cc/api/v2/hifly/avatar/list" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json"Avatars
Public Avatars
Pre-made realistic digital humans available for immediate use.
List Available Avatars
python scripts/hifly_client.py list_public_avatarsReturns avatar IDs and names. Example output:
ID: TnaRN9Z3CLxpLVuDXvVlmA | Name: single_right
ID: l_aDkE8HtOl5poFGpBha1w | Name: 徐皓然Using an Avatar
Use the avatar ID in video creation:
python scripts/hifly_client.py create_video \
--type tts \
--text "Hello world" \
--avatar "TnaRN9Z3CLxpLVuDXvVlmA" \
--voice "VOICE_ID"Custom Avatars (Talking Photos)
Create a personalized avatar from any portrait image.
Create from Image
# From local file
python scripts/hifly_client.py create_talking_photo \
--image /path/to/portrait.jpg \
--title "My Custom Avatar"
# From URL
python scripts/hifly_client.py create_talking_photo \
--image "https://example.com/portrait.jpg" \
--title "My Custom Avatar"Requirements for Best Results
- Portrait orientation preferred
- Clear face visibility - frontal view works best
- Good lighting - avoid harsh shadows
- Neutral expression - for natural lip-sync
Output
Returns an Avatar ID that can be used for video generation:
Avatar Created: lGdTqom22EKEqAkZzBdtzQVideo Generation
Overview
Videos are generated asynchronously. The workflow is: 1. Submit video creation request → Get Task ID 2. Poll task status until complete 3. Retrieve video URL
The hifly_client.py script handles polling automatically.
TTS Video (Text-to-Speech)
Generate video from text using an avatar and voice.
python scripts/hifly_client.py create_video \
--type tts \
--text "Welcome to our service. We're excited to have you here." \
--avatar "AVATAR_ID" \
--voice "VOICE_ID"Output
Task started: oHwa5ezzQQpqXtUTn5pr2g
Waiting for task oHwa5ezzQQpqXtUTn5pr2g to complete...
......
Task Completed!
Video URL: https://hfcdn.lingverse.co/.../video.mp4Audio-Driven Video
Generate video from pre-recorded audio.
python scripts/hifly_client.py create_video \
--type audio \
--audio /path/to/narration.mp3 \
--avatar "AVATAR_ID"Task Status
Check the status of any generation task:
python scripts/hifly_client.py check_task \
--id "TASK_ID" \
--type video # or "voice" or "avatar"Status Codes
| Code | Meaning |
|---|---|
| 1 | Waiting in queue |
| 2 | Processing |
| 3 | Success |
| 4 | Failed |
Limitations (Demo Token)
| Limitation | Value |
|---|---|
| Max Duration | 30 seconds |
| Watermark | Yes |
Remove limitations by using your own API token.
Voices
Public Voices
Pre-configured voices available for TTS video generation.
List Available Voices
python scripts/hifly_client.py list_public_voicesReturns voice IDs, names, and types.
Voice Types
| Type | Description |
|---|---|
| 1 | Standard TTS voice |
| 8 | Cloned voice |
Voice Cloning
Create a custom voice from an audio sample.
Clone from Audio
# From local file
python scripts/hifly_client.py clone_voice \
--audio /path/to/voice_sample.mp3 \
--title "My Cloned Voice"
# From URL
python scripts/hifly_client.py clone_voice \
--audio "https://example.com/sample.mp3" \
--title "My Cloned Voice"Audio Requirements
- Duration: 10-60 seconds recommended
- Format: MP3, WAV, M4A supported
- Quality: Clear speech, minimal background noise
- Content: Natural speaking (not singing)
Output
Returns a Voice ID for use in video generation:
Voice Clone Task Started: azvcWgpbkfK4_saDg7I_Hg
Task Completed!
Voice ID: ODmMHiBRMqkilDOa8YnWlQUsing Cloned Voice
python scripts/hifly_client.py create_video \
--type tts \
--text "This uses my cloned voice" \
--avatar "AVATAR_ID" \
--voice "ODmMHiBRMqkilDOa8YnWlQ"requests
import os
import json
import time
import requests
import argparse
import sys
from pathlib import Path
# Constants
DEFAULT_TOKEN = "2aeda3bcefac46a3"
BASE_URL = "https://hfw-api.hifly.cc/api/v2/hifly"
MEMORY_FILE = Path(__file__).parent / "memory.json"
def get_token():
token = os.environ.get("HIFLY_API_TOKEN")
if not token:
token = DEFAULT_TOKEN
print(f"Warning: Using default free-tier token ({DEFAULT_TOKEN}). Videos <30s only, watermarked.")
return token
def get_headers():
return {
"Authorization": f"Bearer {get_token()}",
"Content-Type": "application/json"
}
def load_memory():
if MEMORY_FILE.exists():
with open(MEMORY_FILE, 'r') as f:
return json.load(f)
return {}
def save_memory(memory):
with open(MEMORY_FILE, 'w') as f:
json.dump(memory, f, indent=2)
def resolve_alias(alias_or_id, kind):
memory = load_memory()
# Check if authorized kind exists in memory
if kind in memory and alias_or_id in memory[kind]:
return memory[kind][alias_or_id]
return alias_or_id
def save_alias(alias, value, kind):
memory = load_memory()
if kind not in memory:
memory[kind] = {}
memory[kind][alias] = value
save_memory(memory)
print(f"Saved alias '{alias}' -> '{value}' for {kind}")
def check_task_status(task_id, task_type="video"):
"""
Polls task status.
task_type: 'video' or 'voice'
"""
url = f"{BASE_URL}/{task_type}/task"
params = {"task_id": task_id}
headers = get_headers()
print(f"Waiting for task {task_id} to complete...")
while True:
try:
resp = requests.get(url, headers=headers, params=params)
resp.raise_for_status()
data = resp.json()
# Status: 1:Waiting, 2:Processing, 3:Success, 4:Failed
status = data.get("status")
if status == 3:
result_url = data.get("video_Url") or data.get("demo_url")
print("\nTask Completed!")
if "voice" in data:
print(f"Voice ID: {data['voice']}")
return result_url
elif status == 4:
print(f"\nTask Failed: {data.get('message')}")
return None
print(".", end="", flush=True)
time.sleep(2)
except KeyboardInterrupt:
print("\nPolling cancelled by user.")
return None
except Exception as e:
print(f"\nError checking status: {e}")
return None
def poll_avatar_task(task_id):
url = f"{BASE_URL}/avatar/task"
params = {"task_id": task_id}
headers = get_headers()
print(f"Waiting for avatar task {task_id}...")
while True:
try:
resp = requests.get(url, headers=headers, params=params)
resp.raise_for_status()
data = resp.json()
status = data.get("status")
if status == 3:
return data.get("avatar")
elif status == 4:
print(f"\nAvatar Task Failed: {data.get('message')}")
return None
print(".", end="", flush=True)
time.sleep(2)
except KeyboardInterrupt:
return None
except Exception:
return None
def upload_file(file_path):
file_path = Path(file_path)
if not file_path.exists():
print(f"Error: File not found: {file_path}")
return None, None
ext = file_path.suffix.lstrip('.')
# 1. Get Upload URL
url = f"{BASE_URL}/tool/create_upload_url"
payload = {"file_extension": ext}
headers = get_headers()
try:
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
data = resp.json()
if data.get("code", 0) != 0:
print(f"Error getting upload URL: {data}")
return None, None
upload_url = data.get("upload_url")
file_id = data.get("file_id")
content_type = data.get("content_type")
# 2. Upload content
print(f"Uploading {file_path.name}...")
with open(file_path, 'rb') as f:
headers_put = {"Content-Type": content_type}
resp_put = requests.put(upload_url, data=f, headers=headers_put)
resp_put.raise_for_status()
print(f"Upload successful. File ID: {file_id}")
return file_id, upload_url
except Exception as e:
print(f"Upload failed: {e}")
return None, None
def list_avatars():
url = f"{BASE_URL}/avatar/list"
params = {"page": 1, "size": 50, "kind": 2} # kind 2 = public
resp = requests.get(url, headers=get_headers(), params=params)
resp.raise_for_status()
data = resp.json()
if data.get("code") == 0:
for item in data.get("data", []):
print(f"ID: {item['avatar']} | Name: {item['title']}")
else:
print(f"Error: {data}")
def list_voices():
url = f"{BASE_URL}/voice/list"
params = {"page": 1, "size": 50, "kind": 1}
resp = requests.get(url, headers=get_headers(), params=params)
resp.raise_for_status()
data = resp.json()
if data.get("code") == 0:
for item in data.get("data", []):
print(f"ID: {item['voice']} | Name: {item['title']} | Type: {item['type']}")
else:
print(f"Error: {data}")
def handle_media_input(input_val):
"""
Handles input that can be either a URL or a local file path.
Returns (url_or_file_id, is_file_id)
"""
if not input_val:
return None, False
# Check if URL
if input_val.startswith("http://") or input_val.startswith("https://"):
return input_val, False
# Assume local file
file_id, _ = upload_file(input_val)
if file_id:
return file_id, True
return None, False
def create_video(text=None, audio=None, avatar_id=None, title="Generated Video"):
if not avatar_id:
print("Error: avatar_id is required")
return
avatar_id = resolve_alias(avatar_id, "avatar")
if audio:
url = f"{BASE_URL}/video/create_by_audio"
media_val, is_file_id = handle_media_input(audio)
if not media_val:
return
payload = {
"title": title,
"avatar": avatar_id
}
if is_file_id:
payload["file_id"] = media_val # Assuming file_id supported for audio driver
# Docs for create_by_audio usually take audio_url.
# Let's check docs again or assume file_id works as consistent API design.
# Actually, previous docs chunk 12 only showed audio_url.
# But create_by_video (Chunk 7) supports file_id.
# I will try to use 'audio_url' key for URL and 'file_id' key for file ID if possible,
# or maybe the API treats audio_url as file_id? Unlikely.
# I'll stick to 'audio_url' for URL. For file_id, I'll add 'file_id' to payload.
else:
payload["audio_url"] = media_val
elif text:
# Should call create_video_tts but here we are
print("Error: For TTS use create_video --type tts")
return
else:
print("Error: Either text or audio is required")
return
# Helper for POST
headers = get_headers()
try:
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
data = resp.json()
if data.get("code") == 0:
task_id = data.get("task_id")
print(f"Task started: {task_id}")
video_url = check_task_status(task_id, "video")
if video_url:
print(f"Video URL: {video_url}")
else:
print(f"API Error: {data}")
except Exception as e:
print(f"Request failed: {e}")
def create_video_tts(text, avatar_id, voice_id, title="TTS Video"):
avatar_id = resolve_alias(avatar_id, "avatar")
voice_id = resolve_alias(voice_id, "voice")
url = f"{BASE_URL}/video/create_by_tts"
payload = {
"title": title,
"text": text,
"avatar": avatar_id,
"voice": voice_id
}
headers = get_headers()
try:
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
data = resp.json()
if data.get("code") == 0:
task_id = data.get("task_id")
print(f"Task started: {task_id}")
video_url = check_task_status(task_id, "video")
if video_url:
print(f"Video URL: {video_url}")
else:
print(f"API Error: {data}")
except Exception as e:
print(f"Request failed: {e}")
def create_talking_photo(image, text=None, voice_id=None, title="Talking Photo"):
# 1. Create Avatar from Image
print("Step 1: Creating Avatar from Image...")
media_val, is_file_id = handle_media_input(image)
if not media_val:
print("Error: Invalid image input.")
return
url = f"{BASE_URL}/avatar/create_by_image"
payload = {
"title": title,
"model": 2
}
if is_file_id:
payload["file_id"] = media_val
else:
payload["image_url"] = media_val
headers = get_headers()
avatar_id = None
try:
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
data = resp.json()
if data.get("code") == 0:
task_id = data.get("task_id")
avatar_id = poll_avatar_task(task_id)
else:
print(f"API Error (Avatar Create): {data}")
return
except Exception as e:
print(f"Request failed: {e}")
return
if not avatar_id:
print("Failed to create avatar.")
return
print(f"Avatar Created: {avatar_id}")
# 2. Create Video
# If text is provided, use TTS.
if text and voice_id:
print("Step 2: Generating Video...")
create_video_tts(text, avatar_id, voice_id, title=title)
else:
print(f"Avatar created successfully with ID: {avatar_id}. Provide text/voice to generate video.")
def clone_voice(audio, title="Cloned Voice"):
media_val, is_file_id = handle_media_input(audio)
if not media_val:
print("Error: Invalid audio input.")
return
url = f"{BASE_URL}/voice/create"
payload = {
"title": title,
"voice_type": 8
}
if is_file_id:
payload["file_id"] = media_val
else:
payload["audio_url"] = media_val
headers = get_headers()
try:
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
data = resp.json()
if data.get("code") == 0:
task_id = data.get("task_id")
print(f"Voice Clone Task Started: {task_id}")
check_task_status(task_id, "voice")
else:
print(f"API Error: {data}")
except Exception as e:
print(f"Request failed: {e}")
def main():
parser = argparse.ArgumentParser(description="HiFly Agent Skill Client")
subparsers = parser.add_subparsers(dest="command", help="Command to run")
# List Avatars
subparsers.add_parser("list_public_avatars", help="List public avatars")
# List Voices
subparsers.add_parser("list_public_voices", help="List public voices")
# Manage Memory
mem_parser = subparsers.add_parser("manage_memory", help="Manage local aliases")
mem_parser.add_argument("action", choices=["add", "list"], help="Action")
mem_parser.add_argument("alias", nargs="?", help="Alias name")
mem_parser.add_argument("value", nargs="?", help="Value (ID)")
mem_parser.add_argument("--kind", choices=["avatar", "voice"], default="avatar", help="Kind of alias")
# Create Video
vid_parser = subparsers.add_parser("create_video", help="Create video")
vid_parser.add_argument("--type", choices=["tts", "audio"], default="tts")
vid_parser.add_argument("--text", help="Text to speak")
vid_parser.add_argument("--audio", help="Audio URL or Local File Path")
vid_parser.add_argument("--avatar", required=True, help="Avatar ID/Alias")
vid_parser.add_argument("--voice", help="Voice ID/Alias (required for TTS)")
# create_talking_photo
tp_parser = subparsers.add_parser("create_talking_photo", help="Create talking photo video")
tp_parser.add_argument("--image", required=True, help="Image URL or Local File Path")
tp_parser.add_argument("--text", help="Text to speak")
tp_parser.add_argument("--voice", help="Voice ID/Alias")
tp_parser.add_argument("--title", default="Talking Photo", help="Title")
# clone_voice
cv_parser = subparsers.add_parser("clone_voice", help="Clone voice")
cv_parser.add_argument("--audio", required=True, help="Audio URL or Local File Path")
cv_parser.add_argument("--title", default="Cloned Voice", help="Voice Title")
# check_task
ct_parser = subparsers.add_parser("check_task", help="Check task status")
ct_parser.add_argument("--id", required=True, help="Task ID")
ct_parser.add_argument("--type", choices=["video", "voice", "avatar"], default="video", help="Task Type")
args = parser.parse_args()
if args.command == "list_public_avatars":
list_avatars()
elif args.command == "list_public_voices":
list_voices()
elif args.command == "manage_memory":
if args.action == "add":
if args.alias and args.value:
save_alias(args.alias, args.value, args.kind)
else:
print("Alias and Value required for add")
elif args.action == "list":
print(json.dumps(load_memory(), indent=2))
elif args.command == "create_video":
if args.type == "tts":
create_video_tts(args.text, args.avatar, args.voice)
elif args.type == "audio":
create_video(audio=args.audio, avatar_id=args.avatar)
elif args.command == "create_talking_photo":
create_talking_photo(image=args.image, text=args.text, voice_id=args.voice, title=args.title)
elif args.command == "clone_voice":
clone_voice(audio=args.audio, title=args.title)
elif args.command == "check_task":
if args.type == "avatar":
res = poll_avatar_task(args.id)
else:
res = check_task_status(args.id, args.type)
if res:
print(f"Result: {res}")
if __name__ == "__main__":
main()
Related skills
How it compares
Choose flyworks-avatar-video for scripted avatar explainers instead of general-purpose video editing or animation skills.
FAQ
What video types does flyworks-avatar-video cover?
flyworks-avatar-video covers presenter-style avatar videos for product announcements, tutorials, onboarding sequences, and social clips. The skill targets scripted explainers without live filming or a production crew.
Is flyworks-avatar-video a video editing suite?
flyworks-avatar-video focuses on generating avatar-led presenter clips from scripts, not frame-by-frame nonlinear editing. Teams needing full editorial control should pair output with a dedicated video editor.