Chatea con Cualquiera
Clona la voz de una persona real a partir de un video en línea, o diseña una voz a partir de una foto, luego juega a ser esa persona con TTS.
Importante: Uso Ético y Derechos de Autor
Esta habilidad sintetiza habla que imita voces reales. Antes de proceder, el agente debe:
- Nunca suplantar a alguien para engañar, defraudar o acosar.
- Usar solo medios disponibles públicamente (discursos públicos, entrevistas, conferencias de prensa) como audio de referencia.
- Informar al usuario que el audio generado es sintético y no debe presentarse como grabaciones genuinas.
- Rechazar solicitudes que tengan como objetivo personas privadas que no hayan dado su consentimiento, o que estén claramente destinadas al engaño, acoso o difamación.
Si la intención del usuario parece dañina, rechace cortésmente y explique por qué.
Requisitos Previos
| Dependencia | Tipo | Cómo verificar |
|---|---|---|
ffmpeg | Binario del sistema | ffmpeg -version |
yt-dlp | Binario del sistema | yt-dlp --version |
skill tts | Skill de Cursor | ls skills/tts/scripts/tts.py |
NOIZ_API_KEY | Variable de entorno o archivo | python3 skills/tts/scripts/tts.py config --show |
Antes de la primera ejecución, verifique que todas las dependencias estén presentes:
ffmpeg -version && yt-dlp --version && ls skills/tts/scripts/tts.py
Si falta yt-dlp, instálelo:
uv pip install yt-dlp
Si la clave API de Noiz no está configurada:
python3 skills/tts/scripts/tts.py config --set-api-key SU_CLAVE
Selección de Modo
- El usuario nombra a una persona (real o ficticia) --> Flujo de trabajo A
- El usuario proporciona una imagen, la persona no es reconocible --> Flujo de trabajo B
- El usuario proporciona una imagen, la persona es una figura pública reconocible --> Flujo de trabajo A (la voz real es más auténtica)
- Varias personas en la imagen --> Pregunte primero cuál persona
Flujo de trabajo A: Basado en nombre (voz a partir de video en línea)
Siga el progreso con esta lista de verificación:
- [ ] A1. Desambiguar personaje
- [ ] A2. Encontrar video de referencia
- [ ] A3. Descargar audio + subtítulos
- [ ] A4. Extraer el mejor segmento de referencia
- [ ] A5. Generar habla
A1. Desambiguar Personaje
Si es ambiguo (por ejemplo, "Presidente de EE.UU.", "Actor de Spider-Man"), pregunte al usuario que especifique la persona exacta antes de continuar.
A2. Encontrar un Video de Referencia
Use la búsqueda web para encontrar un video de YouTube (o Bilibili) donde la persona hable claramente. Los mejores candidatos: entrevistas, discursos, conferencias de prensa. Evite videos con música de fondo alta.
Consultas de búsqueda para probar:
{NOMBRE_DEL_PERSONAJE} entrevista/{NOMBRE_DEL_PERSONAJE} 采访{NOMBRE_DEL_PERSONAJE} discurso/{NOMBRE_DEL_PERSONAJE} 演讲{NOMBRE_DEL_PERSONAJE} conferencia de prensa
A3. Descargar Audio y Subtítulos
mkdir -p "tmp/chat_with_anyone/{NOMBRE_DEL_PERSONAJE}"
yt-dlp -x --audio-format mp3 \
--write-subs --write-auto-subs --sub-langs "en,zh-Hans" \
--convert-subs srt \
-o "tmp/chat_with_anyone/{NOMBRE_DEL_PERSONAJE}/%(title)s.%(ext)s" \
"{URL_DEL_VIDEO}"
Después de la descarga, enumere el directorio de salida para identificar el archivo de audio y el archivo de subtítulos SRT:
ls tmp/chat_with_anyone/{NOMBRE_DEL_PERSONAJE}/
Salida esperada: un archivo de audio .mp3 y uno o más archivos de subtítulos .srt.
Si no aparecen archivos de subtítulos: pruebe con un video diferente que tenga subtítulos generados automáticamente, o ajuste --sub-langs para el idioma de destino.
A4. Extraer el Mejor Segmento de Referencia
Use el script de extracción automatizada: analiza el SRT, encuentra la ventana de habla más densa de 3 a 12 segundos y la extrae como WAV:
python3 skills/chat-with-anyone/scripts/extract_ref_segment.py \
--srt "tmp/chat_with_anyone/{NOMBRE_DEL_PERSONAJE}/{ARCHIVO_SRT}" \
--audio "tmp/chat_with_anyone/{NOMBRE_DEL_PERSONAJE}/{ARCHIVO_DE_AUDIO}" \
-o "tmp/chat_with_anyone/{NOMBRE_DEL_PERSONAJE}/ref.wav"
El script imprime el rango de tiempo seleccionado y guarda el WAV de referencia. Verifique que la salida exista y no esté vacía antes de continuar.
Si el script informa que no hay un segmento adecuado: pruebe con --min-duration 2 para clips más cortos, o descargue un video diferente.
A5. Generar Habla y Juego de Roles
Escriba una respuesta en el personaje, luego sintetícela:
python3 skills/tts/scripts/tts.py \
-t "{TEXTO_DE_RESPUESTA}" \
--ref-audio "tmp/chat_with_anyone/{NOMBRE_DEL_PERSONAJE}/ref.wav" \
-o "tmp/chat_with_anyone/{NOMBRE_DEL_PERSONAJE}/reply.wav"
Presente el archivo de audio generado al usuario junto con el texto. Para mensajes posteriores, reutilice la misma ruta --ref-audio.
Flujo de trabajo B: Basado en imagen (voz a partir de foto)
Siga el progreso con esta lista de verificación:
- [ ] B1. Analizar imagen
- [ ] B2. Diseñar voz
- [ ] B3. Vista previa (opcional)
- [ ] B4. Generar habla
B1. Analizar la Imagen
Use su capacidad de visión para examinar la imagen:
- Si la persona es una figura pública reconocible --> cambie al Flujo de trabajo A para una voz auténtica.
- Si no es reconocible, produzca una descripción de voz que cubra:
- Género (masculino / femenino)
- Edad aproximada (por ejemplo, "alrededor de 30 años")
- Actitud aparente (por ejemplo, alegre, autoritaria, amable)
- Pistas contextuales (por ejemplo, traje --> tono profesional; ropa deportiva --> enérgica)
B2. Diseñar la Voz
Pase tanto la imagen como la descripción al script de diseño de voz:
python3 skills/chat-with-anyone/scripts/voice_design.py \
--picture "{RUTA_DE_LA_IMAGEN}" \
--voice-description "{DESCRIPCIÓN_DE_LA_VOZ}" \
-o "tmp/chat_with_anyone/voice_design"
El script genera:
- Características de voz detectadas (impresas en stdout)
- Archivos de audio de vista previa en el directorio de salida
voice_id.txtque contiene el ID de la mejor voz
Lea el ID de la voz:
cat tmp/chat_with_anyone/voice_design/voice_id.txt
B3. Vista Previa (Opcional)
Presente los archivos de audio de vista previa del directorio de salida para que el usuario pueda escuchar la voz. Si no está satisfecho, vuelva a ejecutar B2 con --voice-description o --guidance-scale ajustados.
B4. Generar Habla y Juego de Roles
python3 skills/tts/scripts/tts.py \
-t "{TEXTO_DE_RESPUESTA}" \
--voice-id "{ID_DE_LA_VOZ}" \
-o "tmp/chat_with_anyone/voice_design/reply.wav"
Para mensajes posteriores, siga usando el mismo --voice-id para mantener la coherencia.
Ejemplo: Basado en nombre
Usuario: Quiero chatear con Trump, que me cuente un cuento para dormir.
Pasos del agente:
- Personaje: Donald Trump. No necesita desambiguación.
- Buscar
discurso de Donald Trump youtube, encontrar un video de discurso claro. - Descargar:
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=..." - Extraer referencia:
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" - Generar TTS al estilo de Trump:
python3 skills/tts/scripts/tts.py -t "Déjame contarte un cuento para dormir tremendo..." --ref-audio "tmp/chat_with_anyone/trump/ref.wav" -o "tmp/chat_with_anyone/trump/reply.wav" - Presentar
reply.wavy el texto del cuento al usuario.
Ejemplo: Basado en imagen
Usuario: [sube foto.jpg] Quiero chatear con la persona de esta imagen
Pasos del agente:
- Análisis de visión: mujer joven no reconocible, ~25 años, suéter informal, sonrisa cálida.
- Diseñar voz:
python3 skills/chat-with-anyone/scripts/voice_design.py --picture "foto.jpg" --voice-description "Una joven china de unos 25 años, voz suave y cálida, tono amigable" -o "tmp/chat_with_anyone/voice_design" - Leer ID de la voz de
tmp/chat_with_anyone/voice_design/voice_id.txt. - Generar TTS:
python3 skills/tts/scripts/tts.py -t "¡Hola! ¡Encantada de conocerte!" --voice-id "{ID_DE_LA_VOZ}" -o "tmp/chat_with_anyone/voice_design/reply.wav" - Presentar audio y continuar el juego de roles con el mismo
--voice-id.
Solución de Problemas
| Problema | Solución |
|---|---|
La descarga de yt-dlp falla o el video no está disponible | Pruebe con una URL de video diferente; algunas regiones/videos están restringidos. Ejecute yt-dlp -U para actualizar |
| No hay archivos de subtítulos SRT | Vuelva a descargar con --sub-lang en,zh-Hans; si aún así no aparecen, pruebe con otro video que tenga subtítulos automáticos |
extract_ref_segment.py no encuentra una ventana adecuada | Use --min-duration 2 para clips más cortos, o pruebe con otro video |
| El diseño de voz devuelve un error | Verifique la clave API de Noiz; asegúrese de que la imagen sea una foto clara de una persona |
| La salida de TTS suena mal | Para el Flujo de trabajo A, pruebe con otro video de referencia; para el Flujo de trabajo B, ajuste --voice-description |