Communitygithub.com

swei99386-alt/video-to-text-skill

Pipeline vidéo-texte en une commande pour X / YouTube / Bilibili. Stratégie prioritaire aux sous-titres, transcription accélérée par GPU (~18x temps réel). Compatible GPU 5 Go.

Qu'est-ce que video-to-text-skill ?

Cette compétence transforme la parole en texte à partir de vidéos ou d’audios, en appliquant une méthodologie éprouvée qui évite les pièges courants. Elle commence toujours par chercher des sous-titres existants (notamment sur YouTube ou X), ce qui est rapide et gratuit, avant de recourir à la transcription automatique par GPU. Elle supporte les plateformes X, YouTube, Bilibili et tout fichier local ou lien inaccessible via enregistrement audio interne. La transcription utilise un modèle small (ou medium si installé) sur GPU NVIDIA GTX 1060 5 Go, atteignant environ 18× la vitesse réelle. L’utilisateur exécute une seule commande `grab.py` qui décide automatiquement de la méthode, et le résultat est un fichier `完整文字稿.txt` propre, sans bruit.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add swei99386-alt/video-to-text-skill

Demander à votre IA préférée

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

Documentation

Transforme la parole d'une vidéo/audio en texte. Il y a ici une méthode éprouvée qui a coûté du sang, des larmes et des sueurs : suis-la strictement dans l'ordre, ne fais pas l'intelligent en sautant l'Étape 0.

Règle de fer (la plus importante, retiens-la d'abord)

Cherche toujours d'abord des « sous-titres existants », et seulement en dernier recours utilise la « transcription audio ». La grande majorité des conférences sérieuses, des événements et des podcasts sont mis sur YouTube, et YouTube a presque toujours des sous-titres intégrés — une seule commande suffit pour les récupérer en quelques secondes, gratuitement, sans télécharger toute la vidéo, sans occuper la carte graphique. Aujourd'hui, j'ai justement négligé ce raccourci : j'ai bêtement téléchargé une vidéo de 450 Mo, j'ai fait tourner la transcription sur le processeur pendant une demi-heure, et j'ai obtenu un texte bourré de fautes. Ce piège, on ne le refera plus.

Étape 0 : Dès que tu as un lien, distingue deux choses, puis décide de l'ordre

Transcrire (obtenir le texte de ce passage) et se renseigner (qui parle, quand a eu lieu la version originale, est-ce la version complète) sont deux choses distinctes, ne les mélange pas. L'ancienne méthode qui consistait à « dès qu'on voit X, on va sur YouTube » était fausse — X a souvent ses propres sous-titres, donc ce détour par YouTube était inutile.

Transcrire : cherche toujours d'abord les sous-titres du lien lui-même, sans faire le détour par YouTube par défaut.

  1. Exécute directement grab.py — le script va d'abord chercher les sous-titres intégrés à ce lien (X a souvent des sous-titres en/en, etc.). Si trouvé, fini, c'est le chemin le plus rapide.
  2. Ce n'est que dans les deux cas suivants qu'il vaut la peine de faire un détour par YouTube pour trouver la version originale :
    • X n'a aucun sous-titre (YouTube en a probablement) ;
    • X est un clip — le texte parle d'une vidéo plus longue, mais le post X ne dure qu'une ou deux minutes (le récupérer ne donne qu'un extrait ; pour la vidéo complète, il faut chercher l'original). Méthode : cherche « intervenant + thème/titre + nom de l'événement » pour trouver la version originale YouTube, puis utilise-la pour l'Étape 1.

La durée, c'est le révélateur : D'abord, fais yt-dlp --no-download --print "%(duration_string)s" pour voir. Si la durée du post X correspond à ce qui est annoncé dans le texte (par exemple « 28 minutes » et tu trouves 27 min) = c'est une copie complète, tu peux la récupérer directement ; si c'est beaucoup plus court = c'est un clip, il faut chercher l'original.

Se renseigner (qui / quand / si c'est complet) est une autre affaire, à faire seulement si l'utilisateur le demande, ce n'est pas une étape obligatoire pour la transcription. Et arrête-toi dès que tu as assez d'infos : une fois que tu as les réponses pour l'utilisateur, ne cherche pas la précision absolue sur la date, la version officielle, etc. si l'utilisateur ne l'a pas demandée (j'ai appris cette leçon le 2026-07-22).

Étape 1 : Exécute le script en une commande (il décide lui-même entre sous-titres et transcription)

python "C:/Users/Administrator/.claude/skills/视频转文字/scripts/grab.py" "<lien ou fichier local>" "nom_dossier_sortie" [langue]

Le troisième paramètre [langue] est optionnel : pour une vidéo chinoise, passe zh (force la sortie en chinois simplifié) ; pour de l'anglais, en ; si omis, détection automatique. Logique interne du script (déjà codée en dur) :

  • Cherche d'abord les sous-titres existants → si trouvé, produit instantanément 完整文字稿.txt, fini.
  • Si pas de sous-titres → alors seulement extrait le son et lance la transcription sur la carte graphique (GPU) (pas sur le processeur).
  • Les résultats atterrissent tous dans le dossier <nom_dossier_sortie> sur le bureau : 完整文字稿.txt (texte pur) + fichiers de sous-titres originaux.

Une fois terminé, signale simplement à l'utilisateur l'emplacement de 完整文字稿.txt et le nombre de mots.

Bilibili / Sites chinois (différent de YouTube, à retenir séparément)

  • Téléchargement possible : l'outil de téléchargement prend en charge Bilibili (B站) et plusieurs autres sites chinois. La récupération de la vidéo/son ne pose pas de problème.
  • Mais le raccourci gratuit des « sous-titres existants » est quasiment impossible : Bilibili n'a pas de sous-titres automatiques comme YouTube ; seuls quelques créateurs ont ajouté des CC sous-titres. Les danmaku ne sont pas des sous-titres (les danmaku sont des commentaires qui défilent, pas les paroles), ne les récupère pas.
  • Donc la grande majorité des vidéos Bilibili passent directement par la « transcription GPU ». Pense à passer zh comme troisième paramètre pour les vidéos chinoises :
    python ".../grab.py" "<lien Bilibili>" "nom_dossier_sortie" zh
    
  • Précision pour le chinois : actuellement, un petit modèle (small) est utilisé. Il ne peut « comprendre qu'à peu près » le chinois, avec des risques de fautes d'orthographe. Pour plus de précision, il faudrait passer au modèle moyen (medium) d'environ 1,5 Go (téléchargement unique, pas encore installé). L'utilisateur a choisi le 2026-07-21 de « se contenter du petit modèle pour l'instant ». Si plus de précision est nécessaire, installe le medium et modifie --model small en medium dans le script.
  • Connexion : pour les vidéos Bilibili réservées aux membres, en haute définition, ou nécessitant une connexion, il faut un cookie de compte. Demande d'abord à l'utilisateur, ne touche pas au compte sans autorisation.

Vidéos inaccessibles par lien (WeChat Video / pages payantes cryptées / tout ce qui ne peut être lu qu'à l'écran) → enregistrement audio de l'écran

Les outils de téléchargement ne peuvent pas atteindre ces vidéos (WeChat Video est enfermé dans l'App, les pages payantes sont cryptées). La seule solution universelle : joue la vidéo tout en enregistrant le son qui sort de l'ordinateur, puis transforme-le en texte. La machine a déjà la capacité d'enregistrement interne installée (bibliothèque soundcard, pas besoin de pilote ni de réglage).

Trois étapes :

  1. Lance l'enregistrement (en arrière-plan, jusqu'à ce que tu l'arrêtes) :
    python "C:/Users/Administrator/.claude/skills/视频转文字/scripts/record.py" "nom_dossier_sortie"
    
  2. Joue la vidéo du début à la fin (en temps réel : une vidéo de 3 heures nécessite 3 heures d'enregistrement, impossible d'accélérer).
  3. Arrête le processus d'enregistrement (l'agent stoppe la tâche en arrière-plan = arrêt brutal, pas de problème), puis donne directement le fichier 录音.pcm à grab.py pour la transcription (il reconnaît le pcm ; pour du chinois, ajoute zh) :
    python "C:/Users/Administrator/.claude/skills/视频转文字/scripts/grab.py" "<chemin_bureau>/<dossier>/录音.pcm" "<dossier>" zh
    
  • L'enregistrement écrit au fur et à mesure sur le disque : même en cas d'arrêt brutal, rien n'est perdu (le pcm est constamment sauvegardé, aucun « nettoyage final » nécessaire).
  • Si tu peux obtenir un lien, ne te sers pas de l'enregistrement : le téléchargement prend quelques minutes, l'enregistrement demande d'attendre la durée réelle complète. L'enregistrement d'écran est réservé aux cas où le lien est vraiment inaccessible.

Étape 2 : Ce qui ne concerne que la transcription

  • Doit utiliser la carte graphique : cette machine a une NVIDIA GTX 1060 (5 Go de VRAM). Le script la priorisera automatiquement. Si un jour les logs montrent « processeur (CPU) », cela signifie que « torch compatible GPU » a été remplacé par la version CPU. Suis alors la section [Fondations GPU] ci-dessous pour réparer.
  • Pour une durée longue (> 20 minutes), le ralentissement est normal, mais avec le GPU, cela reste de l'ordre de quelques minutes ; si cela prend une demi-heure, c'est que le CPU est utilisé à la place.
  • La transcription peut avoir des erreurs/omissions, c'est « un aperçu approximatif », moins précis que les sous-titres natifs. Si tu peux récupérer des sous-titres, ne fais pas de transcription.

Fondations GPU (nécessaires pour la transcription, à réparer si cassé)

La transcription sur GPU nécessite une version de torch qui « utilise le GPU ». Vérification :

C:/Users/Administrator/portable-python311/runtime/python.exe -c "import torch;print(torch.__version__, torch.cuda.is_available())"
  • Si affiche ...+cu126 True = normal, le GPU est utilisable.
  • Si affiche ...+cpu False = retour au CPU uniquement, réinstalle :
C:/Users/Administrator/portable-python311/runtime/python.exe -m pip install --force-reinstall torch==2.11.0 --index-url https://download.pytorch.org/whl/cu126

(driver CUDA 12.6 → source cu126. Cette carte 5 Go suffit pour la reconnaissance vocale, l'OCR et les modèles de taille moyenne ; elle ne peut pas supporter les gros modèles nécessitant 8 Go de VRAM minimum.)

Commandes manuelles courantes (en dehors du script, pour référence)

  • Voir les langues de sous-titres disponibles : yt-dlp --no-download --list-subs "<url>"
  • Récupérer uniquement les sous-titres anglais sans télécharger la vidéo : yt-dlp --skip-download --write-auto-subs --sub-langs "en-orig,en.*" --convert-subs srt -o "%(title)s.%(ext)s" "<url>"
  • Vérifier la durée / date de publication : yt-dlp --no-download --print "%(title)s | %(duration_string)s | %(upload_date)s" "<url>"

Skills associés