EmojiVidGen é uma ferramenta divertida que cria vídeos a partir de arquivos de texto. Ele recebe informações na forma de arquivos de texto simples contendo um roteiro (semelhante a uma história ou diálogo). Em seguida, transforma esse roteiro em um vídeo impressionante. EmojiVidGen é baseado em um sistema de plugins, que permite experimentar diferentes modelos e linguagens. Tudo que você precisa é de um pouco de imaginação e habilidades de digitação!
Principais recursos
Embora inicialmente destinado ao entretenimento com GenAI, EmojiVidGen
possui um potencial significativo para a produção de conteúdo envolvente e interessante, especialmente em mãos capazes. Este projeto é experimental e elaborado principalmente para fins educacionais, explorando as possibilidades de criação de vídeos com tecnologia de IA.
Este software destina-se exclusivamente a fins educacionais. Ele é usado por sua própria conta e risco. Esteja ciente de que os modelos de IA utilizados neste código podem ter restrições quanto ao uso comercial.
sudo apt update
sudo apt install espeak ffmpeg
git clone https://github.com/code2k13/emoji_vid_gen
cd emoji_vid_gen
wget https://github.com/googlefonts/noto-emoji/raw/main/fonts/NotoColorEmoji.ttf
pip install -r requirements.txt
Nota: Um script deve sempre começar com uma diretiva
Image:
Image: Cartoon illustration showing a beautiful landscape with mountains and a road.
Audio: Tranquil calm music occasional chirping of birds.
Title: EmojiVidGen
?: Emoji vid gen is a tool to create videos from text files using AI.
python generate_video.py stories/hello.txt hello.mp4
Image: A single trophy kept on table. comic book style.
Audio: Upbeat introduction music for cartoon show.
Title: Emoji Quiz Showdown
?: " Welcome to the Emoji Quiz Showdown! Are you ready to test your knowledge? "
?: " Meow! I'm ready! "
?: " Woof! Let's do this! "
Image: Cartoon illustration of the Eiffel Tower.
?: " First question What is the capital of France? "
Audio: suspenseful music playing.
?: " Paris! "
Audio: people applauding sound
Image: Cartoon illustration of Mount Everest.
?: " Correct! One point for the cat! Next question What is the tallest mountain in the world? "
Audio: suspenseful music playing.
?: " Mount Everest! "
Audio: people applauding sound
Image: Cartoon illustration of a water molecule.
?: " Right again! One point for the dog! Next question What is the chemical symbol for water? "
Audio: suspenseful music playing.
?: " H2O! "
Audio: people applauding sound
Image: Cartoon illustration of a globe with seven continents.
?: " Correct! Another point for the cat! Last question How many continents are there on Earth? "
Audio: suspenseful music playing.
?: " Seven! "
Audio: people applauding sound
?: " Correct! It's a tie! You both did great! Thanks for playing the Emoji Quiz Showdown! "
O emoji ?️
é reservado como narrador. Usá-lo no início da linha fará com que o sistema gere apenas som e não produza nenhuma imagem no fundo.
Se você seguiu as instruções anteriores para geração de vídeo, deve ter notado que a configuração padrão usa espeak
como mecanismo de conversão de texto em fala, resultando em uma saída com som robótico. EmojiVidGen é construído com uma estrutura interna composta por plugins, cada um capaz de modificar a forma como uma tarefa é executada ou qual modelo é utilizado.
Por exemplo, você pode designar um plugin específico para cada tipo de tarefa de geração – seja texto para imagem, texto para áudio ou texto para fala. Como cada plug-in opera com seu modelo e método exclusivos, definir essas configurações individualmente pode ser complicado. Para simplificar esse processo, introduzi o conceito de predefinições. Você pode aplicar uma predefinição fornecendo a opção --preset
ao arquivo generate_video.py
.
Por exemplo, a predefinição abaixo usa uma predefinição chamada local_medium
.
python generate_video.py stories/hello.txt hello.mp4 --preset local_medium
Todas as predefinições são armazenadas na ./presets folder
. Para criar uma nova predefinição (digamos custom_preset
), basta criar um novo arquivo custom_preset.yaml
na pasta `./presets' e começar a usá-lo assim
python generate_video.py stories/hello.txt hello.mp4 --preset custom_preset
Observe que as voice
usadas na seção characters
devem ser suportadas pelo provedor text_to_speech
selecionado. Idealmente, as imagens devem ser arquivos PNG com proporção quadrada e fundo transparente.
Nome predefinido | Descrição |
---|---|
openai_basic | Usa OpenAI para conversão de texto em fala (padrão) e geração de imagens (DALL-E 2 @ 512x512). Precisa que a variável de ambiente OPENAI_API_KEY seja preenchida |
openai_medium | Semelhante ao openai_basic, mas usa (DALL-E 3 @ 1024x1024). Precisa que a variável de ambiente OPENAI_API_KEY seja preenchida |
local_basic | Usa o pipeline de difusão estável do Huggingface com modelo stabilityai/sd-turbo para texto em imagem. Usa espeak para conversão de texto em fala e o pipeline AudioLDM do Huggingface para conversão de texto em áudio. |
local_basic_gpu | Igual ao local_basic, mas com suporte cuda habilitado. |
meio_local | Semelhante ao local_basic, mas usa brave como mecanismo de texto para fala e modelo stabilityai/sdxl-turbo para texto para imagem |
meio_local | O mesmo que local_medium, mas com suporte cuda habilitado. |
onze_médio | O mesmo que local_medium, mas usa texto para fala ElevenLabs o suporte à API está habilitado. Precisa que a internet e a variável ELEVEN_API_KEY sejam definidas no arquivo .env . Precisa de internet e conta ElevenLabs. |
parler_medium | O mesmo que local_medium, mas usa parler de texto para fala, o suporte à API está habilitado. |
Às vezes você pode não querer usar emojis como personagens em seu vídeo ou usar uma voz diferente para cada personagem. Agora isso pode ser conseguido usando a seção characters
em arquivos yaml predefinidos. Abaixo está um exemplo de como essa seção pode ser:
global :
width : 512
height : 512
use_cuda : " false "
characters :
- name : " ? "
voice : " fable "
- name : " ? "
image : " /workspace/emoji_vid_gen/cat.png "
voice : " alloy "
- name : " ? "
image : " /workspace/emoji_vid_gen/dog.png "
voice : " echo "
text_to_speech :
provider : openai
voice : Nova
WIP
EmojiVidGen utiliza um mecanismo de cache para reter ativos produzidos durante a criação do vídeo, cada um associado ao 'prompt' específico usado. Esse recurso é altamente benéfico, especialmente ao refinar vídeos iterativamente, eliminando a necessidade de regenerar ativos repetidamente. No entanto, esteja ciente de que o diretório .cache
não é limpo automaticamente. É aconselhável limpá-lo ao concluir um projeto de vídeo e iniciar outro.
Dica: Para forçar a recriação de ativos em cache, faça pequenas alterações no 'prompt', como adicionar um espaço ou pontuação
Certifique-se de que os arquivos de ativos estejam presentes na pasta .cache
. Crie o script desta maneira
Image: .cache/existing_background_hd.png
Audio: Funny opening music jingle.
Title: EmojiVidGen
?: .cache/existing_speech.wav
Copie um arquivo predefinido adequado e modifique as seguintes linhas:
global :
width : 1152
height : 896
Nota: Esta configuração afeta a saída de difusão estável. Nem todas as resoluções funcionam tão bem. Para obter mais informações, confira https://replicate.com/guides/stable-diffusion/how-to-use/ . A difusão estável parece funcionar bem com proporções quadradas.
Você verá esta mensagem de erro ao usar o provedor espeak
de texto para fala.
Traceback (most recent call last):
File " /usr/local/lib/python3.10/dist-packages/pyttsx3/drivers/espeak.py " , line 171, in _onSynth
self._proxy.notify( ' finished-utterance ' , completed=True)
ReferenceError: weakly-referenced object no longer exists
Ignore este erro por enquanto, pois ele não afeta a saída.
Se você receber o erro abaixo, exclua o diretório .cache
File " plyvel/_plyvel.pyx " , line 247, in plyvel._plyvel.DB.__init__
File " plyvel/_plyvel.pyx " , line 88, in plyvel._plyvel.raise_for_status
plyvel._plyvel.IOError: b ' IO error: lock .cache/asset/LOCK: Resource temporarily unavailable '
@misc{lacombe-etal-2024-parler-tts,
author = {Yoach Lacombe and Vaibhav Srivastav and Sanchit Gandhi},
title = {Parler-TTS},
year = {2024},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/huggingface/parler-tts}}
}
@misc{lyth2024natural,
title={Natural language guidance of high-fidelity text-to-speech with synthetic annotations},
author={Dan Lyth and Simon King},
year={2024},
eprint={2402.01912},
archivePrefix={arXiv},
primaryClass={cs.SD}
}