跳转到内容

CLI

这一页还没有中文版,下面是英文原文。

The engine is a Python package (vstudio, in lib/). The Mac app and the Claude Code skill both call these commands; you can run them yourself from a terminal:

Terminal window
cd ~/.claude/skills/video-studio # or your clone of the repository
export PYTHONPATH="$PWD/lib:$PYTHONPATH"
python3 -m vstudio.intake --help

Every command that reports something accepts --json for one machine-readable document. Each workflow also has its own scripts under workflows/<name>/scripts; see Workflows.

Command What it does
vstudio.intake Say what you want and point at files: inventory, plan, revise, apply.
vstudio.project Every workflow as a recipe; projects, runs, checkpoints, inbox, outputs, calendar.
vstudio.batch Batch production: plan, estimate, run, status, review, package.
vstudio.cleanup Shared speech cleanup: pauses, fillers, repeats, restarts.
vstudio.export One clean master into a file, cover and post stub per platform.
vstudio.reframe Face-tracked reframe between aspect ratios.
vstudio.platform Print the platform profiles.
vstudio.effects List and inspect the effect registry.
vstudio.llm AI providers on this machine: list, route, auth, test.
vstudio.retouch Portrait retouch and makeup for photos and frames.

Say what you want and point at files: inventory, plan, revise, apply.

usage: python -m vstudio.intake [-h] {analyze,plan,revise,apply,schema} ...
python -m vstudio.intake analyze | plan | revise | apply | schema (every command: --json -> one
document).
positional arguments:
{analyze,plan,revise,apply,schema}
analyze inventory files / folders (video, audio, images, pdf / docx / pptx / md /
srt)
plan natural-language request + materials -> plan JSON
revise update a plan from a follow-up instruction
apply create the project(s) from a plan (a series when mixed); pilot run
optional
schema the plan JSON Schema
options:
-h, --help show this help message and exit

Every workflow as a recipe; projects, runs, checkpoints, inbox, outputs, calendar.

usage: python -m vstudio.project [-h]
{recipes,new,plan-items,show,status,preview,context,refresh,run,resume,checkpoint,set,export,list,adopt,touch,output,ai,series,inbox,calendar}
...
python -m vstudio.project - every workflow as a recipe; projects of N items (N=1 = one video). See
positional arguments:
{recipes,new,plan-items,show,status,preview,context,refresh,run,resume,checkpoint,set,export,list,adopt,touch,output,ai,series,inbox,calendar}
recipes list recipe manifests
new create a project
plan-items planner recipes: draft the items (segments of a recording)
show manifest + project.yaml + status
status items and stages
preview preview artifacts
context agent hook: compact state + playbook + commands
refresh re-read project.yaml + item files, re-plan
run run until done or a checkpoint
resume run until done or a checkpoint
checkpoint pending checkpoints / answer one
set edit params
export collect final files
list registered projects (+ adopted work folders, series)
adopt an existing folder made with the skill -> work record + registry
touch register a job folder + report its live status (desk 进行中 lane)
output second-pass edit of a finished output (references/OUTPUT_EDIT.md)
ai project-level AI edit of every output (grouped per output; needs_rerender)
series series presets
inbox pending checkpoints across projects
calendar publish calendar
options:
-h, --help show this help message and exit
python -m vstudio.project - every workflow as a recipe; projects of N items (N=1 = one video). See
references/PROJECTS.md.
recipes [--json] [--schema] all recipe manifests + capabilities (--schema: the JSON Schema)
new --recipe R --dir P [--name N] [--input key=path ...] [--folder D [--glob G]] [--list F] [--csv F]
[--episodes N] [--param k=v ...] [--set JSON] [--series S] [--client C] [--variants JSON] [--auto a,b]
[--spec JSON] create a project (items from files / lines / rows / episodes)
plan-items --dir P [--replace] [--provider X] [--count N] [--min S --max S] planner recipes: draft the items
show | status | preview [--item I] [--stage S] | context [--write] | refresh --dir P [--json]
run | resume --dir P [--pilot N] [--confirm-pilot] [--items a,b] [--auto ids|all] [--concurrency k=n]
[--json | --json-events] run until done or a checkpoint needs you (exit 7)
checkpoint --dir P [--id X] [--item I | --items a,b] [--answer JSON | --answer-file F | --default] [--run]
list pending payloads / record an answer
set --dir P [--item I] (--param k=v ... | --set JSON) edit params in project.yaml, then refresh
export --dir P [--out D] [--all] [--items a,b] final files + manifest.json (sha256)
list registered projects (lanes) with their state + adopted work
folders (kind work) + series
adopt DIR [--recipe guess|NAME] [--title T] [--client C] a plain folder made with the skill (final/, REPORT.md,
post.md, ...) -> DIR/.vstudio/work.json + registry (works.py)
touch DIR [--status running|waiting|done|failed] [--stage S] [--progress 0..1] [--message M] [--eta S]
[--needs-you] [--recipe R] [--title T] [--outputs a,b] register a job folder + its live status (heartbeat)
output list | show | edit | preview-edl | render | undo | redo | revert | ai | chat | effects --project P --output O 2nd-pass edit of
one finished output (references/OUTPUT_EDIT.md): edit --ops JSON | --op NAME --param k=v | --op ai
--instruction T [--apply]; render [--quality preview|final] [--targets primary,douyin:vertical|all]
ai --project P --instruction T [--outputs all|a,b] [--context JSON] [--timeout 120] [--json | --json-events]
project-level AI edit: one model call for every output ->
grouped changes per output, or needs_rerender (burned-in text
on flattened outputs; answered by rules, no model call)
series new --id S --recipe R [--name N] [--set JSON] [--cadence JSON] | show --id S | list | update --id S --set JSON
inbox [--json] | inbox answer (--project P --id X [--item I] | --id X / --kind K [--projects a,b]) (--answer JSON | --default)
calendar account add --id A --platform P [--times 12:00,19:00] [--per-day N] [--days 0,1,2,3,4]
calendar plan --project P [--accounts a,b] [--start ISO] | calendar set --post ID --state S [--at ISO] [--url U]
calendar list [--start ISO] [--end ISO] [--account A] | calendar add --account A --at ISO [--title T]
--json: one JSON document on stdout; --json-events: one JSON event per line on stdout (logs -> stderr).
Exit codes: 0 ok, 1 failed items, 2 refused (budget), 3 paused, 4 pilot waits, 5 bad input, 6 busy, 7 needs you.

Batch production: plan, estimate, run, status, review, package.

usage: python -m vstudio.batch [-h]
{plan,estimate,run,status,review,job,plan-segments,client,deliver,cleanup-sources,metrics,timing,package,verify-manifest,clean,du,bench,recipes}
...
python -m vstudio.batch - batch video production (Fleet F0). See references/BATCH.md.
positional arguments:
{plan,estimate,run,status,review,job,plan-segments,client,deliver,cleanup-sources,metrics,timing,package,verify-manifest,clean,du,bench,recipes}
plan spec -> jobs in the batch store
estimate time / storage / cost estimate and budget check
run run the jobs
status job table
review HTML review page / apply decisions
job one job: show (transcript, edits, captions, QC, exports) | edit | rerun
plan-segments transcript -> candidate segments (segments.draft.yaml)
client client workspace: init | show | update | list
deliver client delivery package (per-platform folders, 文案.md, 排期表, zip)
cleanup-sources list (dry run) / delete, with the dry run's code, source files of
deliveries past their cleanup date
metrics metrics: --batch / --client / --all, JSON or the weekly CSV
timing review timing event -> batch store
package publish folders + schedule + confirmation code
verify-manifest recompute a package confirmation code
clean delete regenerable intermediates
du disk use
bench benchmark table
recipes list recipes
options:
-h, --help show this help message and exit
python -m vstudio.batch - batch video production (Fleet F0). See references/BATCH.md.
plan SPEC [--batch DIR] [--planner file|claude] [--segments F] [--sync] [--json] spec -> jobs, replan
estimate [--batch DIR] [--json] machine / wall time, storage, API cost vs budget
run [--batch DIR] [--pilot N] [--confirm-pilot] [--resume] [--retry-failed] [--jobs a,b]
[--concurrency asr=1,cpu-render=2] [--json-events] run the stage DAGs (resumable; refuses over budget)
status [--batch DIR] [--json] [--events N] terminal table
review [--batch DIR] [--apply decisions.json|JSON] [--confirm-kinds a,b] [--accept-policy] [--jobs a,b]
[--approve-green] [--json]
HTML grid + decisions sheet / ingest (+ bulk answers)
job ID [--batch DIR] [--json] [--no-words] one job: transcript + cleanup edits, captions, QC, exports
package [--batch DIR] [--per-day N] [--start YYYY-MM-DD] [--times 12:00,19:00] [--json] publish folders
verify-manifest MANIFEST recompute a package's confirmation code (JSON)
clean [--batch DIR] [--dry-run] delete regenerable intermediates of finished jobs
du [--batch DIR] disk use of the batch folder
bench [--batch DIR] the benchmark table used by estimate
recipes [--json] registered recipes (--json: labels, inputs, row keys)
v0.2 (desk; all with --json):
plan-segments --source F [--transcript T] [--client C] [--count N] [--min S --max S] [--platforms a,b]
[--provider auto|claude|openai|ollama|claude-code|...|none] [--out DIR] transcript -> candidate segments -> segments.draft.yaml
client init|show|update|list --client C [--set JSON] client.yaml layered over the persona (effective config)
job show ID | job edit --job J --op caption|trim|cut|notes|hook|cover|copy|undo ... | job rerun --job J [--json-events]
deliver [--client C] [--zip] [--cleanup-days N] [--out DIR] client delivery package + manifest hash
cleanup-sources [--batch B | --client C | --all] [--confirm-delete CODE] list (dry run + code) / delete exactly
that list; sources outside the batch folder: report only
metrics --batch B | --client C | --all [--csv] metrics JSON / weekly CSV
timing --job J --event start|stop|add --what review [--seconds S] review timing -> batch store
--json: one JSON document on stdout (paths absolute); run --json-events: one JSON event per line on stdout
(the human log goes to stderr). See references/BATCH.md section 7.
--batch defaults to the current folder when it holds batch.db.
Exit codes (run): 0 ok, 1 some jobs failed, 2 refused over budget, 3 paused (circuit breaker), 4 pilot waits.

Shared speech cleanup: pauses, fillers, repeats, restarts.

usage: python -m vstudio.cleanup [-h] {analyze,review,apply,verify} ...
Speech cleanup, one shared tool: 气口 (pauses / breaths), 口头禅 fillers, repeats, stammers,
positional arguments:
{analyze,review,apply,verify}
analyze detect edits -> cleanup.json + cleanup_review.md
review print the review sheet of an EDL
apply cut the source with the decisions -> versioned output
verify re-ASR the output and flag lost content words (exit 1)
options:
-h, --help show this help message and exit

One clean master into a file, cover and post stub per platform.

usage: python -m vstudio.export [-h] [--platforms PLATFORMS] [--out OUT] [--cues CUES]
[--cover COVER] [--no-captions] [--title TITLE] [--post POST]
[--lang LANG] [--bilingual] [--account ACCOUNT]
[--mode {face,center,pad-blur,letterbox}]
[--fallback {center,pad-blur,letterbox}] [--start START]
[--dur DUR] [--encoder ENCODER] [--preset PRESET]
master
Multi-platform export: one clean master -> a file + cover + post stub per platform, plus a
manifest.
positional arguments:
master clean (caption-free) master video
options:
-h, --help show this help message and exit
--platforms PLATFORMS
comma list of name[:orientation], e.g. xiaohongshu:vertical,douyin,youtube
(default persona platforms.default). Known: xiaohongshu:vertical,
xiaohongshu:full, xiaohongshu:horizontal, douyin:vertical,
douyin:horizontal, tiktok:vertical, youtube:horizontal, youtube-
shorts:vertical, bilibili:horizontal, bilibili:vertical, wechat-
channels:vertical, wechat-channels:horizontal, x:horizontal, x:square,
x:vertical, instagram:reels, instagram:feed, facebook:reels,
facebook:feed, facebook:horizontal, linkedin:horizontal, linkedin:square,
linkedin:feed, threads:vertical, threads:horizontal, reddit:horizontal,
reddit:square, reddit:vertical, pinterest:vertical, pinterest:feed,
pinterest:square, snapchat:vertical, kuaishou:vertical,
kuaishou:horizontal, weibo:horizontal, weibo:vertical, zhihu:horizontal,
zhihu:vertical, dailymotion:horizontal, dailymotion:vertical,
kwai:vertical
--out OUT
--cues CUES cues.json (subs.Cue dicts) or .srt to burn per platform
--cover COVER cover image(s): a path (closest aspect wins; another aspect is fitted on a
blurred pad) or platform[:orientation]=path for one target, e.g. --cover
xiaohongshu=c34.png
--no-captions do not burn --cues (the master already carries its captions)
--title TITLE post title (checked against each platform's limit)
--post POST post.json {title, hook, body, chapters, links, tags} -> <target>.post.md
--lang LANG post copy language (en | zh); default: the content language detected from
the cues (English content -> English copy on X / Instagram / TikTok /
YouTube)
--bilingual post copy in English + Chinese (post.json en + zh blocks)
--account ACCOUNT account tier for limits, e.g. premium (X: longer videos/posts)
--mode {face,center,pad-blur,letterbox}
reframe mode when the aspect changes
--fallback {center,pad-blur,letterbox}
--start START
--dur DUR
--encoder ENCODER H.264 encoder (default $VSTUDIO_H264_ENCODER / persona export.h264_encoder
/ libx264): libx264 | videotoolbox | h264_videotoolbox | h264_mf
--preset PRESET

Face-tracked reframe between aspect ratios.

usage: python -m vstudio.reframe [-h] [--size SIZE] [--platform PLATFORM]
[--mode {face,center,pad-blur,letterbox}]
[--fallback {center,pad-blur,letterbox}] [--start START]
[--dur DUR] [--zoom ZOOM] [--every EVERY]
src dst
Reframe a video to another canvas: face-tracked virtual camera, centre crop, blurred-fill or
letterbox.
positional arguments:
src
dst
options:
-h, --help show this help message and exit
--size SIZE WxH (default from --platform)
--platform PLATFORM e.g. douyin or xiaohongshu:vertical (size + safe box)
--mode {face,center,pad-blur,letterbox}
--fallback {center,pad-blur,letterbox}
--start START
--dur DUR
--zoom ZOOM
--every EVERY detect every N frames

Print the platform profiles.

youtube:horizontal 1920x1080 safe=(96, 54, 1824, 1026) caption=(96, 880, 1824, 1020) cover=(1280, 720) title<=100 len [420, 1200]/43200s -14.0 LUFS/-1.5 dBTP
youtube-shorts:vertical 1080x1920 safe=(60, 180, 960, 1530) caption=(120, 1260, 960, 1480) cover=(1080, 1920) title<=100 len [20, 60]/180s -14.0 LUFS/-1.5 dBTP
tiktok:vertical 1080x1920 safe=(60, 130, 940, 1436) caption=(140, 1200, 940, 1420) cover=(1080, 1920) title<=55 len [21, 60]/3600s -14.0 LUFS/-1.5 dBTP
instagram:reels 1080x1920 safe=(60, 285, 950, 1470) caption=(170, 1200, 910, 1440) cover=(1080, 1920) title<=0 len [15, 90]/1200s -14.0 LUFS/-1.5 dBTP
instagram:feed 1080x1350 safe=(60, 60, 1020, 1230) caption=(60, 1010, 1020, 1200) cover=(1080, 1350) title<=0 len [15, 90]/1200s -14.0 LUFS/-1.5 dBTP
x:horizontal 1920x1080 safe=(96, 54, 1824, 990) caption=(96, 870, 1824, 990) cover=(1920, 1080) title<=0 len [15, 90]/140s -14.0 LUFS/-1.5 dBTP
x:square 1080x1080 safe=(60, 54, 1020, 990) caption=(60, 800, 1020, 980) cover=(1080, 1080) title<=0 len [15, 90]/140s -14.0 LUFS/-1.5 dBTP
x:vertical 1080x1920 safe=(60, 160, 960, 1540) caption=(120, 1240, 960, 1460) cover=(1080, 1920) title<=0 len [15, 90]/140s -14.0 LUFS/-1.5 dBTP
facebook:reels 1080x1920 safe=(65, 269, 1015, 1248) caption=(65, 1040, 1015, 1240) cover=(1080, 1920) title<=0 len [15, 90]/14400s -14.0 LUFS/-1.5 dBTP
facebook:feed 1080x1350 safe=(60, 60, 1020, 1230) caption=(60, 1010, 1020, 1200) cover=(1080, 1350) title<=0 len [15, 90]/14400s -14.0 LUFS/-1.5 dBTP
facebook:horizontal 1920x1080 safe=(96, 54, 1824, 990) caption=(96, 870, 1824, 990) cover=(1920, 1080) title<=0 len [15, 90]/14400s -14.0 LUFS/-1.5 dBTP
linkedin:horizontal 1920x1080 safe=(96, 54, 1824, 990) caption=(96, 870, 1824, 990) cover=(1920, 1080) title<=0 len [30, 120]/900s -14.0 LUFS/-1.5 dBTP
linkedin:square 1080x1080 safe=(60, 54, 1020, 990) caption=(60, 800, 1020, 980) cover=(1080, 1080) title<=0 len [30, 120]/900s -14.0 LUFS/-1.5 dBTP
linkedin:feed 1080x1350 safe=(60, 60, 1020, 1230) caption=(60, 1010, 1020, 1200) cover=(1080, 1350) title<=0 len [30, 120]/900s -14.0 LUFS/-1.5 dBTP
threads:vertical 1080x1920 safe=(60, 160, 960, 1540) caption=(120, 1240, 960, 1460) cover=(1080, 1920) title<=0 len [15, 90]/300s -14.0 LUFS/-1.5 dBTP
threads:horizontal 1920x1080 safe=(96, 54, 1824, 990) caption=(96, 870, 1824, 990) cover=(1920, 1080) title<=0 len [15, 90]/300s -14.0 LUFS/-1.5 dBTP
reddit:horizontal 1920x1080 safe=(96, 54, 1824, 990) caption=(96, 870, 1824, 990) cover=(1920, 1080) title<=300 len [15, 120]/900s -14.0 LUFS/-1.5 dBTP
reddit:square 1080x1080 safe=(60, 54, 1020, 990) caption=(60, 800, 1020, 980) cover=(1080, 1080) title<=300 len [15, 120]/900s -14.0 LUFS/-1.5 dBTP
reddit:vertical 1080x1920 safe=(60, 160, 1020, 1620) caption=(60, 1300, 1020, 1520) cover=(1080, 1920) title<=300 len [15, 120]/900s -14.0 LUFS/-1.5 dBTP
pinterest:vertical 1080x1920 safe=(65, 270, 885, 1130) caption=(195, 920, 885, 1120) cover=(1080, 1920) title<=100 len [6, 60]/900s -14.0 LUFS/-1.5 dBTP
pinterest:feed 1000x1500 safe=(60, 60, 940, 1340) caption=(60, 1120, 940, 1330) cover=(1000, 1500) title<=100 len [6, 60]/900s -14.0 LUFS/-1.5 dBTP
pinterest:square 1080x1080 safe=(60, 60, 1020, 960) caption=(60, 780, 1020, 950) cover=(1080, 1080) title<=100 len [6, 60]/900s -14.0 LUFS/-1.5 dBTP
snapchat:vertical 1080x1920 safe=(60, 200, 940, 1520) caption=(140, 1220, 940, 1440) cover=(1080, 1920) title<=0 len [10, 60]/60s -14.0 LUFS/-1.5 dBTP
xiaohongshu:vertical 1080x1440 safe=(48, 60, 1032, 1290) caption=(120, 1080, 960, 1270) cover=(1080, 1440) title<=20 len [30, 180]/900s -14.0 LUFS/-1.5 dBTP
xiaohongshu:full 1080x1920 safe=(60, 240, 1020, 1660) caption=(160, 1420, 920, 1640) cover=(1080, 1440) title<=20 len [30, 180]/900s -14.0 LUFS/-1.5 dBTP
xiaohongshu:horizontal 1920x1080 safe=(280, 60, 1640, 1020) caption=(280, 880, 1640, 1020) cover=(1920, 1080) title<=20 len [30, 180]/900s -14.0 LUFS/-1.5 dBTP
douyin:vertical 1080x1920 safe=(60, 160, 930, 1480) caption=(180, 1240, 900, 1460) cover=(1080, 1920) title<=55 len [15, 60]/900s -14.0 LUFS/-1.5 dBTP
douyin:horizontal 1920x1080 safe=(96, 60, 1824, 990) caption=(96, 870, 1824, 990) cover=(1920, 1080) title<=55 len [15, 60]/900s -14.0 LUFS/-1.5 dBTP
wechat-channels:vertical 1080x1920 safe=(60, 200, 1020, 1460) caption=(60, 1200, 1020, 1420) cover=(1080, 1440) title<=16 len [15, 120]/28800s -14.0 LUFS/-1.5 dBTP
wechat-channels:horizontal 1920x1080 safe=(96, 54, 1824, 1000) caption=(96, 870, 1824, 1000) cover=(1920, 1080) title<=16 len [15, 120]/28800s -14.0 LUFS/-1.5 dBTP
bilibili:horizontal 1920x1080 safe=(96, 54, 1824, 1000) caption=(96, 870, 1824, 1000) cover=(1146, 717) title<=80 len [180, 900]/36000s -14.0 LUFS/-1.5 dBTP
bilibili:vertical 1080x1920 safe=(60, 200, 930, 1500) caption=(150, 1260, 930, 1480) cover=(1080, 1440) title<=80 len [180, 900]/36000s -14.0 LUFS/-1.5 dBTP
kuaishou:vertical 1080x1920 safe=(60, 160, 930, 1520) caption=(180, 1240, 900, 1460) cover=(1080, 1920) title<=0 len [15, 90]/900s -14.0 LUFS/-1.5 dBTP
kuaishou:horizontal 1920x1080 safe=(96, 60, 1824, 990) caption=(96, 870, 1824, 990) cover=(1920, 1080) title<=0 len [15, 90]/900s -14.0 LUFS/-1.5 dBTP
weibo:horizontal 1920x1080 safe=(96, 54, 1824, 1000) caption=(96, 870, 1824, 1000) cover=(1920, 1080) title<=30 len [30, 300]/900s -14.0 LUFS/-1.5 dBTP
weibo:vertical 1080x1920 safe=(60, 180, 960, 1520) caption=(120, 1240, 960, 1460) cover=(1080, 1920) title<=30 len [30, 300]/900s -14.0 LUFS/-1.5 dBTP
zhihu:horizontal 1920x1080 safe=(96, 54, 1824, 1000) caption=(96, 870, 1824, 1000) cover=(1920, 1080) title<=30 len [60, 600]/3600s -14.0 LUFS/-1.5 dBTP
zhihu:vertical 1080x1920 safe=(60, 160, 960, 1560) caption=(120, 1240, 960, 1460) cover=(1080, 1920) title<=30 len [60, 600]/3600s -14.0 LUFS/-1.5 dBTP
dailymotion:horizontal 1920x1080 safe=(96, 54, 1824, 1000) caption=(96, 870, 1824, 1000) cover=(1280, 720) title<=255 len [60, 900]/7200s -14.0 LUFS/-1.5 dBTP
dailymotion:vertical 1080x1920 safe=(60, 160, 1020, 1620) caption=(60, 1300, 1020, 1520) cover=(1080, 1920) title<=255 len [60, 900]/7200s -14.0 LUFS/-1.5 dBTP
kwai:vertical 1080x1920 safe=(60, 160, 930, 1480) caption=(150, 1240, 930, 1460) cover=(1080, 1920) title<=0 len [15, 60]/300s -14.0 LUFS/-1.5 dBTP

List and inspect the effect registry.

usage: python -m vstudio.effects [-h] [--write-md] [--check] [--show ID] [--list]
[--engine {pil-frame,ffmpeg,hyperframes,html,audio}]
[--category {camera,layout,cards,text,highlight,freeze,transitions,looks,audio,progress,covers}]
Effect registry: every visual / audio effect in video-studio as one declarative catalogue.
options:
-h, --help show this help message and exit
--write-md regenerate the block in references/EFFECTS.md
--check verify every entry point
--show ID
--list
--engine {pil-frame,ffmpeg,hyperframes,html,audio}
--category {camera,layout,cards,text,highlight,freeze,transitions,looks,audio,progress,covers}

AI providers on this machine: list, route, auth, test.

usage: python -m vstudio.llm [-h] {providers,route,auth,test} ...
LLM / ASR / TTS providers on this machine
positional arguments:
{providers,route,auth,test}
providers list LLM, ASR and TTS providers and whether they work here
route show which provider each task would use
auth auth status | login | logout (see vstudio.llm_auth)
test one tiny JSON round-trip
options:
-h, --help show this help message and exit

Portrait retouch and makeup for photos and frames.

usage: python -m vstudio.retouch [-h] [--slim SLIM] [--eye EYE] [--eye-extra EYE_EXTRA] [--shine SHINE]
[--shine-feather SHINE_FEATHER] [--smooth SMOOTH] [--light LIGHT]
[--makeup MAKEUP] [--body BODY] [--pores PORES] [--tone TONE]
[--blemish BLEMISH] [--undereye UNDEREYE] [--neck NECK] [--min-face MIN_FACE]
[--natural-cap NATURAL_CAP] [--identity-guard IDENTITY_GUARD] [--lip LIP]
[--blush BLUSH] [--brow BROW] [--liner LINER] [--shadow SHADOW]
[--contour CONTOUR] [--highlight HIGHLIGHT] [--gloss GLOSS]
[--preset {daily,glam,natural,none}] [--lip-shade LIP_SHADE]
[--blush-shade BLUSH_SHADE] [--shadow-shade SHADOW_SHADE]
[--liner-shade LINER_SHADE] [--glasses {auto,none,thin,thick}]
[--faces {main,all}] [--face-strength FACE_STRENGTH] [--no-seg] [--no-region]
inp out
Portrait retouch for covers and talking-head frames (stills and video).
positional arguments:
inp
out
options:
-h, --help show this help message and exit
--slim SLIM
--eye EYE
--eye-extra EYE_EXTRA
--shine SHINE
--shine-feather SHINE_FEATHER
--smooth SMOOTH
--light LIGHT
--makeup MAKEUP
--body BODY
--pores PORES
--tone TONE
--blemish BLEMISH
--undereye UNDEREYE
--neck NECK
--min-face MIN_FACE
--natural-cap NATURAL_CAP
--identity-guard IDENTITY_GUARD
--lip LIP
--blush BLUSH
--brow BROW
--liner LINER
--shadow SHADOW
--contour CONTOUR
--highlight HIGHLIGHT
--gloss GLOSS
--preset {daily,glam,natural,none}
--lip-shade LIP_SHADE
shade name or #rrggbb
--blush-shade BLUSH_SHADE
shade name or #rrggbb
--shadow-shade SHADOW_SHADE
shade name or #rrggbb
--liner-shade LINER_SHADE
shade name or #rrggbb
--glasses {auto,none,thin,thick}
--faces {main,all}
--face-strength FACE_STRENGTH
comma list of per-face strengths, largest face first (e.g. 1,0.6)
--no-seg landmark-only skin mask
--no-region