O que Converse com Qualquer Um faz?
Clone a voz de uma pessoa real a partir de um vídeo online, ou crie uma voz a partir de uma foto, e então roleplay como essa pessoa com TTS.
Importante: Uso Ético e Direitos Autorais
Esta skill sintetiza fala que imita vozes reais. Antes de prosseguir, o agente deve:
- Nunca se passar por alguém para enganar, fraudar ou assediar.
- Usar apenas mídia publicamente disponível (discursos públicos, entrevistas, coletivas de imprensa) como áudio de referência.
- Informar o usuário de que o áudio gerado é sintético e não deve ser apresentado como gravações genuínas.
- Recusar solicitações que tenham como alvo indivíduos privados que não consentiram, ou que sejam claramente destinadas a engano, assédio ou difamação.
Se a intenção do usuário parecer prejudicial, recuse educadamente e explique o motivo.
Pré-requisitos
| Dependência | Tipo | Como verificar |
|---|---|---|
ffmpeg | Binário do sistema | ffmpeg -version |
yt-dlp | Binário do sistema | yt-dlp --version |
tts skill | Skill do Cursor | ls skills/tts/scripts/tts.py |
NOIZ_API_KEY | Variável de ambiente ou arquivo | python3 skills/tts/scripts/tts.py config --show |
Antes da primeira execução, verifique se todas as dependências estão presentes:
ffmpeg -version && yt-dlp --version && ls skills/tts/scripts/tts.py
Se yt-dlp estiver faltando, instale-o:
uv pip install yt-dlp
Se a chave da API Noiz não estiver configurada:
python3 skills/tts/scripts/tts.py config --set-api-key SUA_CHAVE
Seleção de Modo
- O usuário nomeia uma pessoa (real ou fictícia) --> Fluxo A
- O usuário fornece uma imagem, a pessoa não é reconhecível --> Fluxo B
- O usuário fornece uma imagem, a pessoa é uma figura pública reconhecível --> Fluxo A (a voz real é mais autêntica)
- Várias pessoas na imagem --> Pergunte qual pessoa primeiro
Fluxo A: Baseado em nome (voz a partir de vídeo online)
Acompanhe o progresso com esta lista de verificação:
- [ ] A1. Desambiguar personagem
- [ ] A2. Encontrar vídeo de referência
- [ ] A3. Baixar áudio + legendas
- [ ] A4. Extrair o melhor segmento de referência
- [ ] A5. Gerar fala
A1. Desambiguar Personagem
Se ambíguo (por exemplo, "Presidente dos EUA", "Ator do Homem-Aranha"), pergunte ao usuário para especificar a pessoa exata antes de prosseguir.
A2. Encontrar um Vídeo de Referência
Use pesquisa na web para encontrar um vídeo no YouTube (ou Bilibili) da pessoa falando claramente. Melhores candidatos: entrevistas, discursos, coletivas de imprensa. Evite vídeos com música de fundo pesada.
Consultas de pesquisa para tentar:
{NOME_DO_PERSONAGEM} entrevista{NOME_DO_PERSONAGEM} discurso{NOME_DO_PERSONAGEM} coletiva de imprensa
A3. Baixar Áudio e Legendas
mkdir -p "tmp/converse_com_qualquer_um/{NOME_DO_PERSONAGEM}"
yt-dlp -x --audio-format mp3 \
--write-subs --write-auto-subs --sub-langs "en,pt" \
--convert-subs srt \
-o "tmp/converse_com_qualquer_um/{NOME_DO_PERSONAGEM}/%(title)s.%(ext)s" \
"{URL_DO_VIDEO}"
Após o download, liste o diretório de saída para identificar o arquivo de áudio e o arquivo de legenda SRT:
ls tmp/converse_com_qualquer_um/{NOME_DO_PERSONAGEM}/
Saída esperada: um arquivo de áudio .mp3 e um ou mais arquivos de legenda .srt.
Se nenhum arquivo de legenda aparecer: tente um vídeo diferente que tenha legendas geradas automaticamente, ou ajuste --sub-langs para o idioma alvo.
A4. Extrair o Melhor Segmento de Referência
Use o script de extração automatizada — ele analisa o SRT, encontra a janela de fala mais densa de 3 a 12 segundos e a extrai como um WAV:
python3 skills/converse-com-qualquer-um/scripts/extract_ref_segment.py \
--srt "tmp/converse_com_qualquer_um/{NOME_DO_PERSONAGEM}/{ARQUIVO_SRT}" \
--audio "tmp/converse_com_qualquer_um/{NOME_DO_PERSONAGEM}/{ARQUIVO_AUDIO}" \
-o "tmp/converse_com_qualquer_um/{NOME_DO_PERSONAGEM}/ref.wav"
O script imprime o intervalo de tempo selecionado e salva o WAV de referência. Verifique se a saída existe e não está vazia antes de prosseguir.
Se o script relatar nenhum segmento adequado: tente --min-duration 2 para clipes mais curtos, ou baixe um vídeo diferente.
A5. Gerar Fala e Roleplay
Escreva uma resposta no personagem e a sintetize:
python3 skills/tts/scripts/tts.py \
-t "{TEXTO_DA_RESPOSTA}" \
--ref-audio "tmp/converse_com_qualquer_um/{NOME_DO_PERSONAGEM}/ref.wav" \
-o "tmp/converse_com_qualquer_um/{NOME_DO_PERSONAGEM}/reply.wav"
Apresente o arquivo de áudio gerado ao usuário junto com o texto. Para mensagens subsequentes, reutilize o mesmo caminho --ref-audio.
Fluxo B: Baseado em imagem (voz a partir de foto)
Acompanhe o progresso com esta lista de verificação:
- [ ] B1. Analisar imagem
- [ ] B2. Projetar voz
- [ ] B3. Visualizar (opcional)
- [ ] B4. Gerar fala
B1. Analisar a Imagem
Use sua capacidade de visão para examinar a imagem:
- Se a pessoa for uma figura pública reconhecível --> mude para o Fluxo A para uma voz autêntica.
- Se não for reconhecível, produza uma descrição de voz cobrindo:
- Gênero (masculino / feminino)
- Idade aproximada (por exemplo, "cerca de 30 anos")
- Aparente comportamento (por exemplo, alegre, autoritário, gentil)
- Pistas contextuais (por exemplo, terno --> tom profissional; roupa esportiva --> enérgico)
B2. Projetar a Voz
Passe tanto a imagem quanto a descrição para o script de design de voz:
python3 skills/converse-com-qualquer-um/scripts/voice_design.py \
--picture "{CAMINHO_DA_IMAGEM}" \
--voice-description "{DESCRIÇÃO_DA_VOZ}" \
-o "tmp/converse_com_qualquer_um/voice_design"
O script gera:
- Características de voz detectadas (impressas no stdout)
- Arquivos de áudio de visualização no diretório de saída
voice_id.txtcontendo o melhor ID de voz
Leia o ID da voz:
cat tmp/converse_com_qualquer_um/voice_design/voice_id.txt
B3. Visualizar (Opcional)
Apresente os arquivos de áudio de visualização do diretório de saída para que o usuário possa ouvir a voz. Se não estiver satisfeito, execute novamente B2 com --voice-description ou --guidance-scale ajustados.
B4. Gerar Fala e Roleplay
python3 skills/tts/scripts/tts.py \
-t "{TEXTO_DA_RESPOSTA}" \
--voice-id "{ID_DA_VOZ}" \
-o "tmp/converse_com_qualquer_um/voice_design/reply.wav"
Para mensagens subsequentes, continue usando o mesmo --voice-id para consistência.
Exemplo: Baseado em nome
Usuário: Eu quero conversar com o Trump, pedir para ele me contar uma história de ninar.
Passos do agente:
- Personagem: Donald Trump. Nenhuma desambiguação necessária.
- Pesquise
Donald Trump discurso youtube, encontre um vídeo de discurso claro. - Baixe:
yt-dlp -x --audio-format mp3 --write-subs --write-auto-subs --sub-langs "en" --convert-subs srt -o "tmp/converse_com_qualquer_um/trump/%(title)s.%(ext)s" "https://youtube.com/watch?v=..." - Extraia referência:
python3 skills/converse-com-qualquer-um/scripts/extract_ref_segment.py --srt "tmp/converse_com_qualquer_um/trump/....srt" --audio "tmp/converse_com_qualquer_um/trump/....mp3" -o "tmp/converse_com_qualquer_um/trump/ref.wav" - Gere TTS no estilo do Trump:
python3 skills/tts/scripts/tts.py -t "Deixe-me contar uma história de ninar tremenda..." --ref-audio "tmp/converse_com_qualquer_um/trump/ref.wav" -o "tmp/converse_com_qualquer_um/trump/reply.wav" - Apresente
reply.wave o texto da história ao usuário.
Exemplo: Baseado em imagem
Usuário: [envia foto.jpg] Eu quero conversar com a pessoa desta foto
Passos do agente:
- Análise de visão: jovem mulher não reconhecível, ~25 anos, suéter casual, sorriso caloroso.
- Projete a voz:
python3 skills/converse-com-qualquer-um/scripts/voice_design.py --picture "foto.jpg" --voice-description "Uma jovem chinesa de cerca de 25 anos, voz gentil e calorosa, tom amigável" -o "tmp/converse_com_qualquer_um/voice_design" - Leia o ID da voz de
tmp/converse_com_qualquer_um/voice_design/voice_id.txt. - Gere TTS:
python3 skills/tts/scripts/tts.py -t "Olá! Prazer em conhecer você!" --voice-id "{ID_DA_VOZ}" -o "tmp/converse_com_qualquer_um/voice_design/reply.wav" - Apresente o áudio e continue o roleplay com o mesmo
--voice-id.
Solução de Problemas
| Problema | Solução |
|---|---|
Falha no download do yt-dlp ou vídeo indisponível | Tente uma URL de vídeo diferente; algumas regiões/vídeos são restritos. Execute yt-dlp -U para atualizar |
| Nenhum arquivo de legenda SRT | Baixe novamente com --sub-lang en,pt; se ainda assim não aparecer, tente um vídeo diferente com legendas automáticas |
extract_ref_segment.py não encontra janela adequada | Use --min-duration 2 para clipes mais curtos, ou tente um vídeo diferente |
| Erro no design de voz | Verifique a chave da API Noiz; certifique-se de que a imagem é uma foto clara de uma pessoa |
| Saída TTS soa errada | Para o Fluxo A, tente um vídeo de referência diferente; para o Fluxo B, ajuste --voice-description |