Communitygithub.com

ZJU-REAL/Easel

Transcription automatique / transformation de la parole en sous-titres : reconnaît la parole dans un fichier audio ou vidéo pour générer des fichiers de sous-titres (SRT/ASS/TXT/JSON), avec possibilité de graver les sous-titres dans la vidéo.

Qu'est-ce que Easel ?

Ce skill, nommé Easel, permet de transcrire automatiquement la parole présente dans des fichiers audio ou vidéo en fichiers de sous-titres. Il repose sur un script partagé `skills/shared/scripts/asr.py` qui encapsule faster-whisper, garantissant des paramètres reproductibles et une coupure de phrases adaptée au chinois. Le skill supporte les formats de sous-titres SRT, ASS, TXT et JSON, et peut optionnellement graver les sous-titres dans une vidéo en utilisant ffmpeg. Il est idéal pour les utilisateurs ayant besoin de générer rapidement des sous-titres à partir de fichiers multimédias, que ce soit pour du contenu en chinois ou dans d'autres langues. Compatible avec Claude Code et d'autres environnements en ligne de commande, il gère les formats audio courants (mp3, wav, m4a, etc.) et vidéo (mp4, mkv, mov, etc.). Le skill nécessite une connexion internet pour le premier téléchargement du modèle et peut utiliser un proxy via les variables d'environnement EASEL_PROXY ou http_proxy.

Compatible avec~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/ZJU-REAL/Easel/tree/HEAD/skills/openclaw/auto-subtitle

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Sous-titres automatiques (parole → sous-titres)

Reconnaît la parole dans un fichier audio/vidéo pour générer des sous-titres. Basé sur le script partagé skills/shared/scripts/asr.py (encapsulation de faster-whisper), paramètres déterminés et reproductibles, avec une coupure de phrases adaptée au chinois. Optionnellement, grave les sous-titres dans la vidéo (réutilise skills/shared/scripts/video_ops.py / filtre ffmpeg subtitles).

Ne fait que "parole → fichier de sous-titres (+ gravure optionnelle)". Pour le montage vidéo général, voir video-editing ; pour la réduction de bruit, voir audio-denoise ; pour le découpage intelligent + gravure de sous-titres de longues vidéos, voir clipify.

Entrée

ChampObligatoireDescription
input_fileOuiChemin du fichier audio ou vidéo (la vidéo extrait automatiquement la piste audio)
formatNonsrt (par défaut) / ass / txt / json
languageNonauto (par défaut) ou zh/en etc. (code ISO 639-1)
modelNontiny/base (par défaut)/small/medium/large-v3, plus c'est grand, plus c'est précis et lent
burnNonGraver ou non les sous-titres dans la vidéo (nécessite une entrée vidéo)

Formats supportés : mp3/wav/m4a/aac/flac pour l'audio ; mp4/mkv/mov/webm pour la vidéo.

Sortie

  • Les fichiers de sous-titres sont placés dans outputs/nom_du_sujet/ (SRT/ASS/TXT/JSON)
  • Si gravure : vidéo avec sous-titres incrustés (*-sub.mp4)
  • Rapport : langue reconnue, nombre de sous-titres, modèle utilisé, chemins de sortie

Prérequis

  • La première exécution télécharge le modèle depuis HuggingFace, nécessite un proxy externe. Le script lit la variable d'environnement EASEL_PROXY ou http(s)_proxy comme proxy ; si aucune n'est définie, connexion directe. On peut aussi spécifier avec export https_proxy=... http_proxy=....
  • En environnement CPU, utiliser les valeurs par défaut --device cpu --compute-type int8.

Étapes d'exécution

Chemins des scripts (relatifs à la racine du projet) : skills/shared/scripts/asr.py, skills/shared/scripts/video_ops.py.

1. Générer le fichier de sous-titres

# Vidéo → SRT (extraction automatique de la piste audio + détection automatique de la langue)
python skills/shared/scripts/asr.py transcribe \
  -i input.mp4 -o outputs/nom_du_sujet/input.srt --language zh

# Vidéo → ASS (avec style, **taille de police/marge adaptées automatiquement à l'orientation de la vidéo**) : la saisie vidéo détecte automatiquement la largeur et la hauteur
python skills/shared/scripts/asr.py transcribe \
  -i input.mp4 -o outputs/nom_du_sujet/input.ass --format ass --model small
# Audio seul → ASS : impossible de détecter les dimensions, portrait par défaut 1080x1920 ; paysage ajouter --res 1920x1080
python skills/shared/scripts/asr.py transcribe \
  -i voice.mp3 -o outputs/nom_du_sujet/voice.ass --format ass --res 1920x1080
  • Le style ASS s'adapte automatiquement aux dimensions de la vidéo cible : la taille de la police est basée sur le petit côté (min(w,h)*0.05, convient aussi bien au portrait qu'au paysage, plus de problème de taille excessive en paysage), la marge du bas est basée sur la hauteur, les marges gauche/droite sur la largeur, PlayRes = largeur/hauteur réelles. La saisie vidéo détecte automatiquement ; pour l'audio seul, spécifier avec --res largeurxhauteur. Pour graver des sous-titres stylisés, privilégiez ce fichier ASS (section suivante), plus simple et adaptable que du SRT brut avec force_style saisi manuellement.
  • En chinois, par défaut environ 18 caractères par ligne, coupure automatique en cas de dépassement ; paramétrable avec --max-line-chars.
  • Sans -o, crée un répertoire projet basé sur le nom du fichier d'entrée, par exemple talk.mp4 sort dans outputs/talk/talk.srt ; pour un projet existant, spécifier explicitement -o outputs/nom_du_sujet/<fichier>.<format>.
  • Voir les modèles/langues disponibles : python skills/shared/scripts/asr.py info.

2. (Optionnel) Graver les sous-titres dans la vidéo

Quand l'utilisateur demande "sous-titres incrustés/graver dans la vidéo", utiliser les filtres ffmpeg subtitles (SRT) ou ass (ASS) :

# Graver SRT (style personnalisable)
ffmpeg -y -i input.mp4 \
  -vf "subtitles=outputs/nom_du_sujet/input.srt:force_style='FontName=Noto Sans CJK SC,FontSize=20,PrimaryColour=&H00FFFFFF,OutlineColour=&H80000000,BorderStyle=1,Outline=2'" \
  -c:a copy outputs/nom_du_sujet/input-sub.mp4

# Graver ASS (le style est déjà dans le fichier ASS, fidèle)
ffmpeg -y -i input.mp4 \
  -vf "ass=outputs/nom_du_sujet/input.ass" \
  -c:a copy outputs/nom_du_sujet/input-sub.mp4
  • Si le chemin contient des caractères spéciaux, entourer la valeur de subtitles= de guillemets simples et échapper les deux-points.
  • Pour des sous-titres logiciels (désactivables) plutôt qu'incrustés : ffmpeg -i in.mp4 -i sub.srt -c copy -c:s mov_text out.mp4.

3. Résultats et rapport

  • Les fichiers de sous-titres et la vidéo gravée sont écrits dans outputs/nom_du_sujet/.
  • Rapporter à l'utilisateur : langue reconnue, nombre de sous-titres, modèle, chemins des fichiers ; suggérer de relancer avec --model/--max-line-chars si nécessaire.

Règles

  1. La vidéo extrait d'abord la piste audio — le script extrait automatiquement un wav 16 kHz mono avec ffmpeg, sans modifier la vidéo originale.
  2. Coupure de phrases adaptée au chinois — coupe selon la ponctuation/longueur, évite les lignes trop longues.
  3. Ne jamais supprimer les fichiers originaux — crée seulement de nouveaux fichiers dans outputs/.
  4. Choix du modèle — Pour la rapidité, utiliser base ; pour la précision, small/medium ; CPU utiliser int8.
  5. La gravure nécessite une entrée vidéo — l'audio seul ne peut pas être gravé, seulement générer le fichier de sous-titres.
  6. Aucune dépendance de profil — la transcription ne nécessite pas de profil utilisateur.

Références

  • SYSTRAN/faster-whisper — Inférence Whisper accélérée par CTranslate2
  • openai/whisper — Modèle Whisper original et méthode ASR
  • Filtres FFmpeg subtitles / ass (gravure de sous-titres)

Individual skills in this repo

This repo contains 9 individual skills — each has its own dedicated page.

ZJU-REAL/Easel

AI 视频生成:文生视频 / 图生视频 / 数字人首帧驱动。通过可插拔 provider(通义万相 Wan / 火山 Seedance / 快手可灵 / OpenAI 兼容)异步生成视频,用户自备 API key。当用户说 AI 视频生成、文生视频、图生视频、AI 生成视频、AI 短视频、让图片动起来、数字人视频、生成一段视频 时使用。与 video-strategy(选型/策略)、video-editing(剪辑处理)、clipify(切片)区别:本 SKILL 是从 0 用 AI 生成新视频。

ZJU-REAL/Easel

通用音频处理:音频剪辑/裁剪、格式转码(mp3/wav/m4a/aac)、音量归一化、从视频提取音轨、多段拼接、淡入淡出、变速(保音高)。当用户说“剪音频”“裁一段”“转成 mp3”“调音量/响度”“提取音轨/扒音频”“拼接音频”“淡入淡出”“加速/减速音频”“变速不变调”时使用。与 audio-denoise 的区别:audio-denoise 专做降噪,audio-editing 做除降噪外的通用音频操作(也内置 denoise 作为兜底)。

ZJU-REAL/Easel

一句话主题 → 成品短视频:自动串联 文案→配图/AI视频→配音→字幕→BGM→合成,把 Easel 制作层零件编排成一条'一键出片'流水线。**单条视频、口播/资讯向,画面默认逐句配图 + Ken Burns 缓动,需要动态时才逐段图生视频**。当用户说 一键生成视频、自动做短视频、主题生成视频、帮我做条视频、口播视频一条龙、自动出片、短视频一键生成 时使用。**有剧情/角色/对白/反转/多集的短剧改用 short-drama(每镜强制图生视频、不用静态图冒充);只写脚本用 video-script;只生成单个片段用 ai-video-gen。**

ZJU-REAL/Easel

音乐卡点视频 / 踩点视频:检测背景音乐的节拍,让图片或片段在节拍点上切换,配推进/白闪特效,做出燃系'卡点'短视频。当用户说 卡点视频、踩点视频、音乐卡点、节奏卡点、按音乐切换、鼓点视频、踩节奏、beat 卡点、图片卡点、卡点混剪 时使用。基于 shared/scripts/beatsync.py(librosa 节拍检测)。与 slideshow-video 区别:slideshow 每图固定时长、柔和转场,本 SKILL 切换点由音乐节拍决定、硬切踩点带特效。

ZJU-REAL/Easel

Easel clipify: long English talk → punchline cuts → optional 16:9→9:16 face-pan/split → opus word-by-word ASS burn. Ships scripts + assets/preview.png. Part of 1.6k★ Easel suite.

ZJU-REAL/Easel

>- 通用图像处理加工:改尺寸/缩放、裁剪、补边适配平台尺寸、格式转换(png/jpg/webp)、 压缩到目标大小、加文字或图片水印、圆角、多图拼接、生成缩略图、读图片信息。 基于 image_ops.py 确定性处理。 使用时机:用户说"改尺寸"、"缩放图片"、"裁剪"、"压缩图片"、"加水印"、"转格式"、 "圆角"、"拼图/多图联排"、"缩略图"、"适配小红书/朋友圈尺寸"、"把图 pad 成 1:1"。 和 card-*(卡片类)的区别:card-* 是"HTML 设计→渲染出图", image-editing 只加工已有图片,不负责视觉设计。

ZJU-REAL/Easel

多角色对话配音:按 cast 和逐行对白为不同角色分配音色与情绪,合成多声线音轨和带角色名字幕。 当用户说“多角色/双人/剧本/对话配音、多人对白、不同角色不同声音、有声剧配音”时使用。 单一公共音色用 tts-voiceover;克隆本人音色用 voice-clone;整部短剧制作由 short-drama 编排。

ZJU-REAL/Easel

Easel video-highlights: CN/livestream highlight extract + stable static vertical reframe (sibling to clipify).

ZJU-REAL/Easel

>- 视频制作策略与工具选型:AI 视频生成模型对比、视频脚本结构设计、制作流程规划,覆盖产品演示/解说/社媒短视频场景。 当用户说"视频怎么做""视频选型""用什么工具做视频""视频制作流程""视频策略""视频系列规划"时使用。 和 video-script 的区别:video-strategy 做内容规划与工具选型,video-script 写具体某条视频的脚本。

Skills associés