Discuter avec quiconque
Clonez la voix d'une personne réelle à partir d'une vidéo en ligne, ou créez une voix à partir d'une photo, puis incarnez cette personne avec la synthèse vocale.
Important : Utilisation éthique et droits d'auteur
Cette compétence synthétise une parole qui imite des voix réelles. Avant de procéder, l'agent doit :
- Ne jamais usurper l'identité de quelqu'un pour tromper, frauder ou harceler.
- Utiliser uniquement des médias accessibles au public (discours publics, interviews, conférences de presse) comme audio de référence.
- Informer l'utilisateur que l'audio généré est synthétique et ne doit pas être présenté comme un enregistrement authentique.
- Refuser les demandes ciblant des personnes privées n'ayant pas donné leur consentement, ou clairement destinées à la tromperie, au harcèlement ou à la diffamation.
Si l'intention de l'utilisateur semble nuisible, refusez poliment et expliquez pourquoi.
Prérequis
| Dépendance | Type | Comment vérifier |
|---|---|---|
ffmpeg | Binaire système | ffmpeg -version |
yt-dlp | Binaire système | yt-dlp --version |
Compétence tts | Compétence Cursor | ls skills/tts/scripts/tts.py |
NOIZ_API_KEY | Variable d'environnement ou fichier | python3 skills/tts/scripts/tts.py config --show |
Avant la première exécution, vérifiez que toutes les dépendances sont présentes :
ffmpeg -version && yt-dlp --version && ls skills/tts/scripts/tts.py
Si yt-dlp est manquant, installez-le :
uv pip install yt-dlp
Si la clé API Noiz n'est pas configurée :
python3 skills/tts/scripts/tts.py config --set-api-key VOTRE_CLÉ
Sélection du mode
- L'utilisateur nomme une personne (réelle ou fictive) --> Workflow A
- L'utilisateur fournit une image, la personne n'est pas reconnaissable --> Workflow B
- L'utilisateur fournit une image, la personne est une figure publique reconnaissable --> Workflow A (la voix réelle est plus authentique)
- Plusieurs personnes dans l'image --> Demandez d'abord quelle personne
Workflow A : Basé sur le nom (voix à partir d'une vidéo en ligne)
Suivez la progression avec cette liste de vérification :
- [ ] A1. Désambiguïsation du personnage
- [ ] A2. Trouver une vidéo de référence
- [ ] A3. Télécharger l'audio et les sous-titres
- [ ] A4. Extraire le meilleur segment de référence
- [ ] A5. Générer la parole
A1. Désambiguïsation du personnage
Si ambigu (par exemple « président des États-Unis », « acteur de Spider-Man »), demandez à l'utilisateur de préciser la personne exacte avant de continuer.
A2. Trouver une vidéo de référence
Utilisez une recherche web pour trouver une vidéo YouTube (ou Bilibili) où la personne parle clairement. Les meilleurs candidats : interviews, discours, conférences de presse. Évitez les vidéos avec une musique de fond forte.
Requêtes de recherche à essayer :
{NOM_PERSONNAGE} interview/{NOM_PERSONNAGE} 采访{NOM_PERSONNAGE} discours/{NOM_PERSONNAGE} 演讲{NOM_PERSONNAGE} conférence de presse
A3. Télécharger l'audio et les sous-titres
mkdir -p "tmp/chat_with_anyone/{NOM_PERSONNAGE}"
yt-dlp -x --audio-format mp3 \
--write-subs --write-auto-subs --sub-langs "en,zh-Hans" \
--convert-subs srt \
-o "tmp/chat_with_anyone/{NOM_PERSONNAGE}/%(title)s.%(ext)s" \
"{URL_VIDÉO}"
Après le téléchargement, listez le répertoire de sortie pour identifier le fichier audio et le fichier de sous-titres SRT :
ls tmp/chat_with_anyone/{NOM_PERSONNAGE}/
Résultat attendu : un fichier audio .mp3 et un ou plusieurs fichiers de sous-titres .srt.
Si aucun fichier de sous-titres n'apparaît : essayez une autre vidéo qui possède des sous-titres automatiques, ou ajustez --sub-langs pour la langue cible.
A4. Extraire le meilleur segment de référence
Utilisez le script d'extraction automatisée — il analyse le SRT, trouve la fenêtre de parole la plus dense (3 à 12 secondes) et l'extrait en WAV :
python3 skills/chat-with-anyone/scripts/extract_ref_segment.py \
--srt "tmp/chat_with_anyone/{NOM_PERSONNAGE}/{FICHIER_SRT}" \
--audio "tmp/chat_with_anyone/{NOM_PERSONNAGE}/{FICHIER_AUDIO}" \
-o "tmp/chat_with_anyone/{NOM_PERSONNAGE}/ref.wav"
Le script affiche la plage temporelle sélectionnée et enregistre le WAV de référence. Vérifiez que le fichier existe et n'est pas vide avant de continuer.
Si le script ne trouve aucun segment approprié : essayez --min-duration 2 pour des extraits plus courts, ou téléchargez une autre vidéo.
A5. Générer la parole et incarner
Écrivez une réponse dans le personnage, puis synthétisez-la :
python3 skills/tts/scripts/tts.py \
-t "{TEXTE_RÉPONSE}" \
--ref-audio "tmp/chat_with_anyone/{NOM_PERSONNAGE}/ref.wav" \
-o "tmp/chat_with_anyone/{NOM_PERSONNAGE}/reponse.wav"
Présentez le fichier audio généré à l'utilisateur avec le texte. Pour les messages suivants, réutilisez le même chemin --ref-audio.
Workflow B : Basé sur l'image (voix à partir d'une photo)
Suivez la progression avec cette liste de vérification :
- [ ] B1. Analyser l'image
- [ ] B2. Concevoir la voix
- [ ] B3. Prévisualisation (optionnelle)
- [ ] B4. Générer la parole
B1. Analyser l'image
Utilisez votre capacité de vision pour examiner l'image :
- Si la personne est une figure publique reconnaissable --> passez au Workflow A pour une voix authentique.
- Si elle n'est pas reconnaissable, produisez une description vocale couvrant :
- Genre (homme / femme)
- Âge approximatif (par exemple « environ 30 ans »)
- Attitude apparente (par exemple joyeux, autoritaire, doux)
- Indices contextuels (par exemple costume -> ton professionnel ; tenue de sport -> énergique)
B2. Concevoir la voix
Passez à la fois l'image et la description au script de conception vocale :
python3 skills/chat-with-anyone/scripts/voice_design.py \
--picture "{CHEMIN_IMAGE}" \
--voice-description "{DESCRIPTION_VOCALE}" \
-o "tmp/chat_with_anyone/voice_design"
Le script produit :
- Les caractéristiques vocales détectées (affichées sur la sortie standard)
- Des fichiers audio de prévisualisation dans le répertoire de sortie
voice_id.txtcontenant le meilleur identifiant vocal
Lisez l'identifiant vocal :
cat tmp/chat_with_anyone/voice_design/voice_id.txt
B3. Prévisualisation (optionnelle)
Présentez les fichiers audio de prévisualisation du répertoire de sortie pour que l'utilisateur puisse entendre la voix. Si non satisfait, relancez B2 avec --voice-description ou --guidance-scale ajusté.
B4. Générer la parole et incarner
python3 skills/tts/scripts/tts.py \
-t "{TEXTE_RÉPONSE}" \
--voice-id "{IDENTIFIANT_VOCAL}" \
-o "tmp/chat_with_anyone/voice_design/reponse.wav"
Pour les messages suivants, continuez à utiliser le même --voice-id pour la cohérence.
Exemple : Basé sur le nom
Utilisateur : 我想跟特朗普聊天,让他给我讲个睡前故事。
Étapes de l'agent :
- Personnage : Donald Trump. Aucune désambiguïsation nécessaire.
- Recherche
Donald Trump speech youtube, trouve une vidéo de discours claire. - Téléchargement :
yt-dlp -x --audio-format mp3 --write-subs --write-auto-subs --sub-langs "en" --convert-subs srt -o "tmp/chat_with_anyone/trump/%(title)s.%(ext)s" "https://youtube.com/watch?v=..." - Extraction de la référence :
python3 skills/chat-with-anyone/scripts/extract_ref_segment.py --srt "tmp/chat_with_anyone/trump/....srt" --audio "tmp/chat_with_anyone/trump/....mp3" -o "tmp/chat_with_anyone/trump/ref.wav" - Génération du TTS dans le style de Trump :
python3 skills/tts/scripts/tts.py -t "Let me tell you a tremendous bedtime story..." --ref-audio "tmp/chat_with_anyone/trump/ref.wav" -o "tmp/chat_with_anyone/trump/reply.wav" - Présentez
reply.wavet le texte de l'histoire à l'utilisateur.
Exemple : Basé sur l'image
Utilisateur : [télécharge photo.jpg] 我想跟这张图片里的人聊天
Étapes de l'agent :
- Analyse visuelle : jeune femme non reconnaissable, ~25 ans, pull décontracté, sourire chaleureux.
- Conception de la voix :
python3 skills/chat-with-anyone/scripts/voice_design.py --picture "photo.jpg" --voice-description "Une jeune femme chinoise d'environ 25 ans, voix douce et chaleureuse, ton amical" -o "tmp/chat_with_anyone/voice_design" - Lisez l'identifiant vocal depuis
tmp/chat_with_anyone/voice_design/voice_id.txt. - Génération du TTS :
python3 skills/tts/scripts/tts.py -t "你好呀!很高兴认识你!" --voice-id "{IDENTIFIANT_VOCAL}" -o "tmp/chat_with_anyone/voice_design/reponse.wav" - Présentez l'audio et continuez l'échange avec le même
--voice-id.
Dépannage
| Problème | Solution |
|---|---|
Le téléchargement yt-dlp échoue ou la vidéo est indisponible | Essayez une autre URL de vidéo ; certaines régions/vidéos sont restreintes. Exécutez yt-dlp -U pour mettre à jour |
| Aucun fichier de sous-titres SRT | Retéléchargez avec --sub-lang en,zh-Hans ; si toujours rien, essayez une autre vidéo avec sous-titres automatiques |
extract_ref_segment.py ne trouve aucune fenêtre appropriée | Utilisez --min-duration 2 pour des extraits plus courts, ou essayez une autre vidéo |
| La conception vocale renvoie une erreur | Vérifiez la clé API Noiz ; assurez-vous que l'image est une photo claire d'une personne |
| Le rendu TTS sonne mal | Pour le Workflow A, essayez une autre vidéo de référence ; pour le Workflow B, ajustez --voice-description |