Files
Eve 89d28b99bc feat: add heygen-translate skill (video translation / dubbing) (#82)
* feat: add heygen-translate skill (video translation / dubbing)

Adds a third skill, heygen-translate/, for translating and dubbing existing
videos into 175+ languages with voice cloning and lip-sync. Built on the
same independent-skill structure as heygen-avatar and heygen-video.

What:
- heygen-translate/SKILL.md (4-phase workflow: Discovery → Pre-flight →
  Submit+Poll → Deliver) with the same API Mode Detection ladder as
  heygen-video (OpenClaw plugin → CLI w/ HEYGEN_API_KEY → MCP → CLI
  fallback). All operations shown with MCP and CLI side-by-side, no raw
  curl.
- heygen-translate/references/troubleshooting.md (errors → action map,
  polling patterns, harness-specific notes for Claude Code / OpenClaw /
  Cursor)
- heygen-translate/references/language-locale-guide.md (regional variant
  defaults, formality registers, RTL caption collisions, tonal
  compression/expansion table, lip-sync ceiling per language)
- heygen-translate/references/proofreads-workflow.md (the high-stakes
  review-edit-render path: extract SRT → glossary discipline → register
  fixes → upload edited SRT → final render)
- heygen-translate/references/asset-routing.md (URL vs asset_id vs local
  upload routing, HEAD-check pattern, auth-walled URL fallbacks, 32 MB
  limit handling)

Replaces PR #46 with the new repo structure (independent skills, no root
SKILL.md, references inside the skill, validate-skills.yml self-contained
checks, MCP+CLI transport not raw API).

Why:
- PR #46's SKILL.md frontmatter declared 'allowed-tools: mcp__heygen__*'
  but every example used raw curl against api.heygen.com. Mismatch fixed
  here by using the heygen video-translate CLI (with MCP fallthrough)
  per the established pattern in heygen-avatar/heygen-video.
- PR #46 was authored against the pre-#79 structure (root SKILL.md +
  shared references/). Repo restructured 24h ago — each skill now owns
  its own SKILL.md and references/. This PR matches.
- PR #46 lacked embedded translation expertise. This SKILL.md adds:
  speaker-count discipline, source-quality triage, locale-pair gotchas
  (formality registers in ja/ko/de/th/hi, RTL caption collisions,
  tonal compression for en→zh/ja/ko, regional variants for es/pt/zh),
  lip-sync ceiling, captions burned-in vs sidecar, audio-only as a
  different deliverable not a workaround, cost/time math, and a
  failure-mode decoder.
- PR #46 used 'video-translate/' breaking the heygen-avatar/heygen-video
  prefix pattern. Renamed to 'heygen-translate/' for consistency in ls
  output and plugin manifest paths.
- Adds a true proofreads workflow (extract SRT → user/agent edits →
  upload corrected SRT → render) — this is the missing high-stakes path
  that distinguishes the skill from API docs.

Plumbing:
- .claude-plugin/marketplace.json registers heygen:translate
- .claude-plugin/plugin.json updates description + keywords
- .codex-plugin/plugin.json updates description, keywords, longDescription,
  defaultPrompt
- .cursor-plugin/plugin.json adds heygen-translate to skills array, plus
  keywords/tags
- .github/workflows/validate-skills.yml adds heygen-translate to path
  filter and runs the same self-contained-bundle checks as the other two
  skills
- release-please-config.json adds heygen-translate/SKILL.md as a
  release-please extra-files target so the version bumps in lockstep
- README.md, INSTALL.md, INSTALL_FOR_AGENTS.md, CLAUDE.md, CONTRIBUTING.md
  all updated to reference the third skill

Out of scope (followups):
- platforms/nanoclaw/heygen-translate/ NanoClaw container variant
- Eval scenarios for heygen-translate (mirror of R17-R23 pattern from
  heygen-video)
- gh skill / agentskills.io spec compliance check (handled by the
  spec-validate-soft job already in validate-skills.yml)
- Mark PR #46 as superseded once this lands

Refs: PR #46 (predecessor), #79 (independent-skills restructure), #77
(gh skill install path)

* docs(heygen-translate): document what the proofread CLI actually performs

Per Ken's ask in #tmp-vt-skill: rewrite proofreads-workflow.md (and the
Phase 3 proofread snippet in SKILL.md) against verified live behavior of
the heygen video-translate proofreads commands, not assumed/inferred
behavior.

Verified against the live API + CLI on Apr 27 with two real proofread
sessions (b84c8e8d... silent-source failure, 8ce0fba6c... Spanish
Sintel-trailer success).

Now documented:

- Five subcommands mapped to real REST endpoints:
    create     POST /v3/video-translations/proofreads
    get        GET  /v3/video-translations/proofreads/{id}
    srt get    GET  /v3/video-translations/proofreads/{id}/srt
    srt update PUT  /v3/video-translations/proofreads/{id}/srt
    generate   POST /v3/video-translations/proofreads/{id}/generate
- What the engine actually does between create and completed (downloads
  source, runs ASR for original_srt_url, translates to srt_url, no
  render yet).
- Real response shapes for create / get / srt get / srt update / generate
  with verified JSON examples and field-by-field meanings.
- Real status enum: processing | completed | failed (NOT pending|running
  — that's the translation-render endpoint, which is a different state
  machine the resource graduates into after generate).
- Polling cadence verified empirically: 3-5 min for SRT extraction on a
  50-second source. Hard timeout 30 min for stuck sessions.
- SRT format: standard SRT (UTF-8), well-formed timecodes, editable by
  hand or sed.
- File naming: <title>_proofread.srt and <title>_proofread_original.srt.
- original_srt_url is auto-populated source-language transcription, not
  a copy of any user-provided SRT. Useful as ground truth, never
  re-uploaded as target-language SRT.

Critical correction: heygen asset create does NOT accept SRT files.

The CLI exposes both URL and asset_id shapes for srt update, but the
asset_id upload path is currently BLOCKED:

    {"error":{"code":"invalid_parameter",
              "message":"Content type not supported application/x-subrip"}}

heygen asset create only accepts png/jpeg/mp4/webm/mp3/wav/pdf.
Renaming .srt to .txt or .mp3 does not bypass it (server sniffs content,
not extension). The asset_id route is in the request schema for forward
compatibility but cannot currently be exercised through the standard
upload path.

Use the URL route. The reference now documents practical hosts that
work (gist raw URLs, GitHub raw URLs, S3 public-read, presigned
URLs >=2h, Vercel/static).

Two new failure_message strings added to troubleshooting.md from real
API responses:
- 'Failed to download video from url, please check the url is valid or
   the video is public' (instant-fail on bad/auth-walled source URL)
- 'Your video's audio is missing or corrupted, please try with another
   video' (~30s fail when source has no speech)

Other documented quirks:
- proofreads create returns proofread_ids (plural, one per language)
  plus a session-level status — per-id status comes from proofreads get.
- After generate, polling shifts from proofreads get to
  video-translate get because the resource graduates from proofread
  to translation.
- Captions on generate are independent of the proofread session's SRT —
  --captions controls whether the FINAL video burns captions in.
- Proofread session TTL ~24h.

Out of scope for this commit (still in followup queue):
- NanoClaw platform variant
- Eval scenarios for heygen-translate
- File issue/PR upstream re: SRT asset upload (worth surfacing to HeyGen
  CLI team — the asset_id route in the schema can't be reached today)

* fix(heygen-translate): auth gate, duration question, open-ended language input

Three improvements from dogfooding:

- Add auth verification step before Phase 1: runs `heygen auth status` in CLI
  mode, asks for API key and persists via `heygen auth login` if missing.
  One-time setup that survives across sessions.
- Add duration flexibility question to Phase 1 discovery: asks whether output
  must match source length, explains quality tradeoff, controls
  `enable_dynamic_duration` flag instead of hardcoding true.
- Make target language question explicitly open-ended: no picker, no
  pre-assigned choices. User types freely, validation in Phase 2.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(heygen-translate): align dynamic_duration references with Phase 1 question

SKILL.md:335 and references/language-locale-guide.md:49 both said "Always
enable_dynamic_duration: true", contradicting the new Phase 1 duration
flexibility question. Updated both to reference the user's choice and warn
about quality degradation on high-compression pairs when fixed-length is chosen.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: David Chou <david.chou@heygen.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-13 10:58:56 -07:00

4.2 KiB

Install HeyGen Skills

Grab an API key and set it in your shell. If you're already on a HeyGen plan with MCP connected to your agent, you can skip the key — MCP will be used automatically.

The repo ships three skills you can install:

  • heygen-avatar — build a persistent digital identity from a photo or description
  • heygen-video — generate identity-first presenter videos
  • heygen-translate — translate / dub existing videos into 175+ languages with voice cloning and lip-sync

Most users want avatar + video together. They chain: heygen-avatar returns an avatar id that heygen-video consumes. heygen-translate is independent — install it whenever you need to localize finished videos.

Option 1 — gh skill install (works across 12+ agents)

If you have GitHub CLI v2.90+ available, this is the most portable install. gh skill writes to the right directory for your agent automatically (Claude Code, Cursor, Codex, Gemini CLI, GitHub Copilot, Junie, Goose, OpenHands, Amp, Cline, OpenCode, Warp, and more):

gh skill install heygen-com/skills heygen-avatar
gh skill install heygen-com/skills heygen-video
gh skill install heygen-com/skills heygen-translate

Project scope (current repo only) is the default. For user scope (every project on this machine):

gh skill install heygen-com/skills heygen-avatar    --scope user
gh skill install heygen-com/skills heygen-video     --scope user
gh skill install heygen-com/skills heygen-translate --scope user

Pin to a release tag for reproducibility:

gh skill install heygen-com/skills heygen-avatar@v3.1.0    --pin
gh skill install heygen-com/skills heygen-video@v3.1.0     --pin
gh skill install heygen-com/skills heygen-translate@v3.1.0 --pin

Option 2 — ClawHub

clawhub install heygen-skills

ClawHub installs all three skills to your agent's default skills directory automatically.

Option 3 — OpenClaw plugin

For OpenClaw users who want bundled MCP support too:

openclaw plugins install clawhub:@heygen/openclaw-plugin-heygen

Option 4 — Git clone

Clone into your agent's skills directory:

OpenClaw (default: ~/.openclaw/skills/heygen-skills, custom installs may differ — check your config):

git clone https://github.com/heygen-com/skills.git ~/.openclaw/skills/heygen-skills

Claude Code (default: ~/.claude/skills/heygen-skills):

git clone https://github.com/heygen-com/skills.git ~/.claude/skills/heygen-skills

Not sure where your skills directory is? Ask your agent: "Where is your skills directory?"

Auth

Two auth modes with explicit priority:

Priority Mode Trigger Billing
1 CLI (API key) HEYGEN_API_KEY is set Direct API usage (separately billed)
2 MCP (OAuth) MCP tools visible AND no API key HeyGen plan credits (existing subscription)
3 CLI (fallback) heygen auth login session Direct API usage

CLI with API key (recommended for agents):

curl -fsSL https://static.heygen.ai/cli/install.sh | bash
export HEYGEN_API_KEY=<your-key>
heygen --version        # verify binary is on PATH
heygen auth status      # verify auth

If HEYGEN_API_KEY is set, the skills use the CLI. This is the most predictable setup for agent workflows.

MCP (zero-setup if on a HeyGen plan): connect HeyGen's remote MCP server to your agent — OAuth handles auth, calls use your existing plan credits. See README for agent-specific setup.

First Run

Paste this prompt to your agent — it will find the right paths automatically:

Install the HeyGen Skills from https://github.com/heygen-com/skills.git — clone it into your skills directory (find it with your config or ask if unsure). Install the HeyGen CLI via curl -fsSL https://static.heygen.ai/cli/install.sh | bash and export HEYGEN_API_KEY=<your-key> (get one at https://app.heygen.com/api). Or, if you're on a HeyGen plan and already have MCP connected to your agent, skip the key step — MCP will be used automatically. Then use the heygen-avatar skill to create an avatar for me, and heygen-video to make a 30-60 second intro video, casual tone.