Papercut Voice
Vocaliser un épisode d'explication en papier découpé et le caler sur l'image, par l'une de trois voies : Qwen3-TTS local depuis un voice.json propre à la série (un locuteur CustomVoice intégré
- Quoi
- Vocaliser un épisode d'explication en papier découpé et le caler sur l'image, par l'une de trois voies : Qwen3-TTS local depuis un voice.json propre à la série (un locuteur CustomVoice intégré
- Coût
- Gratuit
- Prérequis
- Avant de commencer : lis ce prompt d'installation au complet, dis-moi en quelques lignes ce que ce skill fait et ce que son installation implique, et attends mon feu vert avant de faire quoi que ce soit d'autre.
- Installation
- Copiez le prompt d’installation ci-dessous dans votre Muse — votre agent fait le reste.
Sélectionné par Skill Harbor — Vocaliser un épisode d'explication en papier découpé et le caler sur l'image, par l'une de trois voies : Qwen3-TTS local depuis un voice.json propre à la série (un locuteur CustomVoice intégré, ou une voix clonée depuis un extrait de référence), ton propre enregistrement ou un autre TTS que tu as déjà, ou une voix fictive (silencieuse, ou la voix say de macOS). Il génère plusieurs prises par ligne, choisit une prise par ligne par correspondance ASR et hauteur, rogne et normalise le volume à -16 LUFS, construit les minutages de mots, puis joint les lignes en la narration, les sous-titres mot à mot et le plan de scènes que papercut-build lit ensuite. Crédit : @0xS4N4TG. Licence MIT. Skill Harbor ne vérifie jamais le code, examinez-le vous-même avant usage.
Version :
Installation
Copiez le dossier d’installation ci-dessous, puis collez-le dans Muse📌 Version épinglée : commit ff8223aLe prompt d'installation ci-dessous inclut déjà les étapes de vérification : votre agent suit la checklist communautaire avant d'installer tout ce qui contient du code exécutable. Vous en voulez plus ?
- Peut créer ou modifier des fichiers.
- Fonctionne avec une clé API ou un jeton que tu fournis.
Ce que le scan a trouvé — extraits du prompt d’installation
- écrit des fichiers — Prerequisites: none for the install itself: no account, no API key, no paid service, and nothing else to insta · - The skill folder holds 1 file only: SKILL.md (7,335 bytes). It contains no script, no audio and no reference · Prérequis : aucun pour l'installation elle-même : aucun compte, aucune clé API, aucun service payant, et rien
- utilise des clés API ou des jetons — - What leaves this machine at use time, disclosed here before it ever happens — using the skill is a separate · - Ce qui quitte cette machine à l'usage, divulgué ici avant que ça arrive — utiliser le skill est une étape sé
Avant de commencer : lis ce prompt d'installation au complet, dis-moi en quelques lignes ce que ce skill fait et ce que son installation implique, et attends mon feu vert avant de faire quoi que ce soit d'autre. Prérequis : aucun pour l'installation elle-même : aucun compte, aucune clé API, aucun service payant, et rien d'autre à installer d'abord — cette installation ne copie qu'un seul fichier d'instructions. Lis ceci avant d'utiliser le skill ensuite, parce que le fichier seul ne peut rien vocaliser : « papercut-voice » n'est PAS autonome. Son usage exige toute une installation préexistante que cette installation ne fournit PAS et ne doit jamais installer pour moi : (1) toute la bibliothèque papercut-explainer du même dépôt, trouvée via $PAPERCUT_LIB ou la ligne PAPERCUT_LIB= dans ~/.config/papercut-explainer/config.env — en pratique une installation Standard ou Full de tout le système, faite séparément via le skill papercut-setup / le script install.sh du dépôt (Standard suffit pour la seule voix fictive ; une vraie voix exige Full, ou les paquets voix installés à la main) ; (2) un projet déjà échafaudé par papercut-build (étape 1), avec narration/script.json et papercut/episode.json contenant les scènes — new_episode.sh copie build_timing.py dans narration/ ; (3) pour la voie A (Qwen3-TTS local), le venv vocal construit par library/voice/setup_tts.sh (Python 3.10-3.12, qwen-tts et torch) et un modèle Qwen3-TTS de 2,3 à 4,2 Go téléchargé depuis Hugging Face ; pour la voie B (mon propre enregistrement ou un autre TTS), un moteur ASR — mlx-whisper sur Apple Silicon ou faster-whisper ailleurs — plus librosa et numpy pour le passage de hauteur, dans les Pythons que nomment ASR_PY et QWEN_TTS_PY ; pour la voie C (fictive), ffmpeg seulement, et macOS pour la voix --say optionnelle ; plus ffmpeg dans toutes les voies, et l'outil en ligne de commande rubberband seulement si un tempo vocal autre que 1,0 est réglé ; (4) l'espace disque pour la voix locale : Full ajoute environ 4 à 6 Go (environ 1,5 Go de venv plus le modèle). Les poids Qwen3-TTS sont Apache-2.0 et les poids Whisper sont MIT (voir le THIRD_PARTY.md du dépôt ; vérifier chaque carte de modèle), et Remotion — utilisé par les étapes qui suivent celle-ci — est gratuit pour les individus et les petites équipes, mais sa propre licence devient payante au-delà d'un seuil de taille : vérifie https://www.remotion.dev/license avant un usage commercial. Le README du dépôt estime environ 14 à 19 $ de coûts d'API de l'agent par bobine de 25 à 30 s, facturés par mon propre fournisseur d'agent ; la voix elle-même roule localement et n'est pas mesurée. Les envois à l'usage (les téléchargements de modèles depuis Hugging Face au premier usage, les installations PyPI de la mise en place Full, et ce qu'un TTS ou un outil de transcription que je choisis moi-même recevrait) sont tous divulgués au point 2 ci-dessous, avant qu'aucun d'eux arrive. Ne clone qu'une voix que j'ai le droit d'utiliser, avec le consentement de la personne. Installe-moi « papercut-voice ». Il vocalise un épisode d'explication en papier découpé et le cale sur l'image, par l'une de trois voies : (A) génération Qwen3-TTS locale depuis un voice/voice.json propre à la série (un locuteur CustomVoice intégré, ou une voix clonée depuis un extrait de référence avec le modèle Base), avec plusieurs prises par ligne, un choix automatique par correspondance ASR et hauteur, un rognage et une normalisation de volume à -16 LUFS ; (B) mon propre enregistrement ou un autre TTS que j'ai déjà, déposé en un WAV par ligne ou en prises brutes ; ou (C) une voix fictive (des WAV silencieux, ou la voix say de macOS) pour construire et caler la bobine d'abord et la re-vocaliser plus tard. Sur chaque voie, il construit ensuite les minutages de mots (timing_narrator.js), joint les lignes en public/vo/voiceover.wav, écrit les sous-titres mot à mot (public/vo/captions.json) et le plan de scènes (src/plan.json), et écrit la section Timing du storyboard — le relais que papercut-build lit ensuite. Dépôt : https://github.com/0xS4N4TG/papercut-explainer (le skill est tout le dossier skills/papercut-voice/ au commit épinglé : SKILL.md seulement, 1 fichier) Version épinglée : installe le code au commit ff8223abc8136cc09e8d7e9b62ecb5d080c389e1 exactement. Ne substitue pas une version plus récente. Si ce commit est inaccessible, arrête-toi et dis-le-moi. 1. Clone https://github.com/0xS4N4TG/papercut-explainer dans un dossier temporaire, place-toi au commit ff8223abc8136cc09e8d7e9b62ecb5d080c389e1, et copie le dossier skills/papercut-voice/ de ce checkout. Compare ensuite chaque fichier du dossier aux empreintes enregistrées pour cette fiche le 2026-10-19 : [FINGERPRINTS] - SKILL.md: SHA-256 9a5333d955bf4a49056488cb02d7ea24e86dfce33dc6909585da6496ba04c9a3 Si un fichier ne correspond pas, il a changé depuis la préparation de la fiche : ne l'installe pas encore, dis-moi ce que tu as trouvé et laisse-moi décider. 2. Lis SKILL.md au complet, et dis-moi en mots simples : ce que le skill fait quand on l'utilise, à quels services il se connecte, s'il lit ou envoie des informations personnelles ou des clés, et tout ce qui semble inhabituel. Arrête-toi sur tout signal d'alerte et dis-le-moi avant d'aller plus loin. Confirme ces points à partir du fichier : - Le dossier du skill contient 1 fichier seulement : SKILL.md (7 335 octets). Il ne contient aucun script, aucun audio et aucun fichier de référence, et il n'est PAS autonome : presque tout ce qu'il nomme vit hors de son dossier, dans le même dépôt. Sa référence complète des scripts est library/voice/README.md, et il pilote la bibliothèque partagée à $PAPERCUT_LIB : tout le pipeline vocal sous library/voice/ (voice.example.json, narrate.sh/narrate.py, asr.py, analyze.py, pick.py, finalize.sh, build_timing.py, split_take.py, setup_tts.sh), les outils sous library/tools/ (placeholder_vo.py pour la voie C, build_vo.py et timing_md.py pour les sous-titres et le plan de scènes), library/env.sh (sourcé au prévol ; il charge ASR_PY, QWEN_TTS_PY et les autres valeurs depuis le fichier de configuration), et library/new_episode.sh (qui a copié build_timing.py dans le dossier narration/ du projet quand le projet a été échafaudé). Il dépend aussi de skills frères qui ne font PAS partie de cette installation : papercut-setup (réparation via ./install.sh --doctor quand la voie choisie exige plus que l'installation actuelle), papercut-build (son étape 1 échafaude le projet dans lequel ce skill travaille, et le relais final — ébauches, scènes, son, rendu — est papercut-build qui lit src/plan.json et la section Timing de papercut/STORYBOARD.md), et papercut-explainer, dont le references/style-guide.md (sections 11 et 13) fixe les règles de sous-titres que ce skill suit. Son prévol lit la ligne PAPERCUT_LIB= dans ~/.config/papercut-explainer/config.env quand $PAPERCUT_LIB n'est pas réglée, et sourcer env.sh charge les autres lignes de ce fichier — ce fichier de configuration contient des chemins d'installation et des noms de modèles (PAPERCUT_LIB, PAPERCUT_PY, QWEN_TTS_PY, ASR_PY, QWEN_TTS_MODEL), pas des identifiants. Ses entrées sont narration/script.json et papercut/episode.json, plus, par série, voice/voice.json copié de voice.example.json et édité par moi (locuteur ou référence de clonage, instruct, takes_per_line, tempo, qa_targets), un num.json optionnel d'appariement des nombres, et, sur la voie B, mes propres fichiers WAV. - Rien n'est envoyé nulle part pendant l'installation elle-même ; le seul téléchargement à l'installation est le dossier du skill depuis GitHub au commit épinglé. Aucun script n'est exécuté pendant l'installation, aucune clé n'est demandée, et il n'y a aucune télémétrie dans le dossier : SKILL.md ne nomme aucune URL https, aucun service infonuagique de TTS ou de transcription, et aucune clé API. - Ce qui quitte cette machine à l'usage, divulgué ici avant que ça arrive — utiliser le skill est une étape séparée qui ne commence que quand je demande de vocaliser ou de re-vocaliser un épisode, et les envois ci-dessous arrivent seulement dans la mise en place ou les outils que le skill pilote : (a) les téléchargements de modèles depuis Hugging Face au premier usage, quand le modèle n'est pas déjà dans le cache Hugging Face local (~/.cache/huggingface, ou $HF_HUB_CACHE / $HF_HOME) : sur la voie A, narrate.py charge le modèle Qwen3-TTS avec Qwen3TTSModel.from_pretrained et le télécharge s'il manque — Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice (environ 4,2 Go) ou le CustomVoice 0.6B (environ 2,3 Go), ou le modèle Base de même taille pour une voix clonée — et la mise en place Full qui prépare la voie A (library/voice/setup_tts.sh, roulée via papercut-setup, jamais par cette installation) télécharge les mêmes modèles explicitement avec snapshot_download de huggingface_hub (HF_HUB_DISABLE_XET=1, 3 tentatives). L'étape ASR télécharge son modèle Whisper de la même façon au premier usage : asr.py avec mlx-whisper transcrit avec mlx-community/whisper-large-v3-turbo, et avec faster-whisper il construit un WhisperModel nommé large-v3-turbo (ou le nom dans FASTER_WHISPER_MODEL), qui télécharge ses poids s'ils manquent. Ces téléchargements n'envoient que le nom du modèle à Hugging Face ; aucun script, aucun audio et aucun fichier de projet ne les accompagne, et ensuite HF_HUB_OFFLINE=1 peut arrêter les vérifications réseau. (b) Les installations de paquets de la mise en place Full : setup_tts.sh crée le venv vocal (uv venv --python 3.12 si uv est présent, sinon un venv Python 3.10-3.12) et installe qwen-tts, mlx-whisper ou faster-whisper, librosa, soundfile, numpy et huggingface_hub (torch est gros ; le venv fait environ 1,5 Go) depuis PyPI — les noms des paquets vont à PyPI, rien de chez moi. Monter cette mise en place est le travail de papercut-setup, divulgué ici parce que papercut-voice lui passe le relais (./install.sh --doctor, puis papercut-setup) quand une voie exige plus que l'installation actuelle. (c) Un service de TTS ou de transcription que je choisis moi-même, et seulement celui-là : sur la voie B, le skill utilise un TTS que j'ai déjà, tel quel — il demande une fois lequel et où il roule — donc si ce TTS est un service infonuagique, le texte du script (le text de chaque ligne ou sa réécriture tts, et son instruct) va à ce service, sous mon propre compte et ses propres conditions, et s'il roule localement, rien ne quitte la machine ; le mode Voice Design de Qwen, que narrate.py ne pilote pas, fonctionne pareil (je génère ailleurs avec lui et je ramène les WAV par la voie B : la description de voix et le texte du script vont là où je le génère). De même, seulement dans le repli sans bibliothèque pour les sous-titres, les WAV sont transcrits avec le skill de sous-titres Remotion (whisper.cpp, local) ou avec tout outil de transcription que je choisis qui rend des minutages de mots — si je choisis un outil infonuagique, l'audio de narration lui est envoyé sous mon compte ; le pipeline de la bibliothèque lui-même ne le fait jamais. Le skill ne nomme aucun tel service, ne détient aucune clé pour l'un d'eux et n'en choisit jamais un pour moi. (d) Tout le reste à l'usage est local, et en particulier ma voix ne quitte jamais la machine sur les voies de la bibliothèque : la génération de la voie A roule le modèle Qwen sur cette machine (MPS sur Apple Silicon, CUDA sur NVIDIA, CPU sinon — des minutes par ligne sur CPU), un processus à la fois ; l'extrait ref_audio et le ref_text d'une voix clonée sont lus localement par ce modèle local et n'envoyés nulle part (ne clone qu'une voix que j'ai le droit d'utiliser, avec le consentement de la personne) ; mes propres enregistrements sur la voie B restent locaux ; finalize.sh roule asr.py et analyze.py (la hauteur, via librosa) sur les prises localement, pick.py choisit une prise par ligne (correspondance ASR au moins égale à qa_targets.asr_match, 0,9 par défaut, et hauteur médiane dans la fourchette), ffmpeg rogne, passe-haut et normalise le volume à -16 LUFS en 48 kHz mono (rubberband étire l'audio d'abord, localement, seulement quand le tempo n'est pas 1,0), asr.py se relance sur les finales et build_timing.py écrit timing_narrator.js (sans ASR, il n'estime qu'à 2,75 mots par seconde, donc les sous-titres dérivent) ; split_take.py découpe une prise du script entier en fichiers par ligne localement ; placeholder_vo.py écrit des WAV silencieux localement (ou utilise la commande say de macOS, une voix locale du système d'exploitation, convertie avec ffmpeg) ; build_vo.py joint les lignes avec ffmpeg en public/vo/voiceover.wav et écrit public/vo/captions.json et src/plan.json, et timing_md.py écrit la section Timing de STORYBOARD.md. Faire jouer les trois premières lignes pour moi avant un passage complet est une lecture locale dans ma propre session. Aucune étape de papercut-voice lui-même ne lit un fichier de secrets, une clé API ou un identifiant — les variables d'environnement que lui et ses scripts lisent sont des chemins et des réglages seulement (PAPERCUT_LIB, PAPERCUT_PY, QWEN_TTS_PY, ASR_PY, QWEN_TTS_MODEL, QWEN_TTS_HOME, HF_HUB_CACHE, HF_HOME, HF_HUB_OFFLINE, FASTER_WHISPER_MODEL, et des réglages par passage comme ONLY, SPEAKER, TAKES, SEED_BASE, TTS_TEXT, ROLE, SKIP_PICK, CHOSEN, TIMING_OUT, VO_TIMING) — et aucune donnée d'usage ni télémétrie n'est envoyée à l'auteur du dépôt ni à un tiers fixe. - N'installe pas la bibliothèque, un venv, des paquets Python ni aucun modèle pendant cette installation, ne lance pas install.sh, ./install.sh --doctor ni library/voice/setup_tts.sh, ne télécharge aucun modèle Qwen ou Whisper, ne lance pas narrate.sh, finalize.sh, asr.py, placeholder_vo.py, build_vo.py, timing_md.py ni aucun autre script de la bibliothèque, et ne génère, n'enregistre ni ne transcris aucune voix : mettre en place le système Standard ou Full, choisir une voie de voix, et vocaliser un épisode sont mes décisions, plus tard, quand je le demande vraiment. 3. Quand je dis « yes, install », installe-le comme skill : copie tout le dossier papercut-voice dans le répertoire des skills de l'agent, dans un dossier nommé « papercut-voice », en gardant son 1 fichier (SKILL.md à sa racine). Un clone manuel suivi de la copie du dossier skills/papercut-voice dans ~/.claude/skills/ est la route décrite ici ; toute autre route ne convient que si chaque fichier installé correspond à son empreinte. 4. Vérifie sans appels réseau : frontmatter valide (name: papercut-voice), le 1 fichier en place avec une empreinte concordante. N'exécute aucun script ni outil de la bibliothèque pour vérifier, et ne télécharge aucun modèle pour vérifier. 5. Indique ce qui a été installé, où, et ce qu'il me reste à faire moi-même (par exemple : faire installer tout le système séparément s'il ne l'est pas déjà — une installation Standard de tout le dépôt via papercut-setup / install.sh suffit pour la seule voix fictive, tandis qu'une vraie voix exige Full (un venv vocal d'environ 1,5 Go plus un modèle Qwen3-TTS de 2,3 ou 4,2 Go depuis Hugging Face, et un modèle ASR Whisper téléchargé au premier usage) ou les paquets voix installés à la main, avec ffmpeg (et rubberband seulement pour un tempo autre que 1,0) ; échafauder d'abord le projet de l'épisode avec papercut-build pour que narration/script.json et papercut/episode.json existent ; créer le voice/voice.json de la série depuis voice.example.json et choisir le locuteur, ou fournir mon propre enregistrement ou mon propre TTS, ou me contenter de la voix fictive ; vérifier la licence Remotion avant un usage commercial de la bobine finie ; utiliser le skill est une étape séparée qui ne commence que quand je le demande, et les envois à l'usage divulgués ci-dessus — les téléchargements des modèles Qwen et Whisper depuis Hugging Face au premier usage, les installations PyPI de la mise en place Full si je les dois encore, et le texte du script ou l'audio de narration vers un TTS ou un outil de transcription infonuagique seulement si c'est moi-même qui en choisis un sur la voie B ou dans le repli de sous-titres sans bibliothèque — arrivent seulement à ce moment-là). GitHub est optionnel : si j'ai un compte GitHub ou la CLI gh, tu peux l'utiliser ; sinon l'accès public suffit. Ne jamais l'exiger sauf s'il figure dans les prérequis ci-dessus. Règles : ne touche à rien en dehors du dossier temporaire et de la cible d'installation. Si quelque chose semble anormal, arrête-toi et demande-moi.
Enregistré dans vos installs récentes. Retrouvez-le à tout moment sur /connect.
Questions
Comment installer une création ?
Chaque fiche produit contient un prompt d’installation à copier-coller. Collez-le dans votre Muse et il installe la création pour vous — sans configuration manuelle.
Où va mon argent ?
Directement au vendeur. Skill Harbor ne traite jamais les paiements : le paiement se fait sur la page du vendeur, généralement via Stripe.
Que signifie le ✓ à côté du nom d’un créateur ?
Il signifie que nous avons confirmé l’identité de la personne derrière la fiche. Il ne dit rien sur le code lui-même — vérifiez toujours une création avant de l’installer.