Video Creator – #Parte 7: Busca e download de imagens

Bom dia, boa tarde, boa noite!

Essa é a sétima parte da série sobre o projeto Video Creator, onde mostrarei como fiz a busca pelas imagens.

Se você entrou direto nesse post, te aconselho a começar por aqui, para entender exatamente do que se trata essa série.

Sobre essa parte

Basicamente o que fiz foi concatenar o assunto pesquisado com a primeira keyword da lista de keywords de cada sentença.

Bem simples!

Requisitos:

O principal requisito, é claro, é óbvio… criação do Bing Resource na Azure e a criação da instância do Bing Custom Search. Tudo isso eu mostrei no último post!

Utilizei também 2 imports praticamente pradrões nesse projeto:

import json
import requests

rimage.py

A parte da busca e do download das imagens, ficou no robô rimage.py.

A chamada ao endpoint do ping resolvi colocar dentro de uma função que recebe 2 parâmetros: a query de pesquisa e a quantidade de imagens que o serviço irá devolver. Ficou assim:

# implementando busca de imagens pelo Bing
def search_images_on_bing(query, count="1"):
    logging.info("Searching images on Bing with custom bing image search")

    url = credentials['bing_endpoint'] + "?q=" + query + "&count="+ count +"&customconfig=" + credentials['bing_custom_config_id'] +"&licence=ShareCommercially&size=Large"
    r = requests.get(url, headers={'Ocp-Apim-Subscription-Key': credentials['azure_subscription_key']})
    response = json.loads(r.text)
    if 'value' in response:
        result = [d['contentUrl'] for d in response['value']]
    else:
        result = []
    
    return result

Notem que essa função é bem simples, recebe uma query e a quantidade que ela deve retornar de resultado, ai foi só bater na api passando esses parâmetros, fazer o parser do json e extrair somente os links das imagens para enviar como retorno.

Para esse projeto eu utilizei os seguintes parâmetros:

  • licence=ShareCommercially
    • Retornará imagens que podem ser usadas com propósito pessoal ou comercial
  • size=Large
    • Retornará imagens de no mínimo 500×500 pixels

A Api do bing é realmente fantástica. Existem inúmeros parâmetros que podem ser usados para refinar a busca. Quem quiser personalizar ainda mais a busca, só ver os parametros disponíveis na página oficial da api:

https://docs.microsoft.com/en-us/rest/api/cognitiveservices-bingsearch/bing-custom-images-api-v7-reference

Criei uma outra função responsável por iterar nas sentenças, montar a query de pesquisa e chamar a função acima. Ficou assim:


def fetch_images_from_sentences():
    logging.info("Fetching images from sentences...")
    print("Fetching images from sentences", end='\n\n')
    # loading content
    logging.info("Get sentences from object saved")
    print("Loading content from content.json")
    video_content = rcontent.load()
    for sentence in video_content['sentences']:
        if len(sentence['keywords'])>0:
            if video_content['search_term'] != sentence['keywords'][0]:
                sentence['image_search_query'] = "{} {}".format(video_content['search_term'], sentence['keywords'][0])
                sentence['images'] = search_images_on_bing(sentence['image_search_query'], "5")
                time.sleep(1.5)
    rcontent.save(video_content)

Três pontos importantes aqui:

O primeiro é sobre o atributo sentence['image_search_query'], onde eu armazeno o termo que eu utilizei para buscar as imagens, e ele é composto pelo assunto do video + a primeira keyword da lista. Isso para evitar que seja buscado imagens com uma keyword muito genérica que não tenha ligação com o assunto principal.

O segundo é sobre como foi construído o fluxo das coisas. O robô de imagem funciona completamente independente dos demais. O que ele precisa é que exista um arquivo content.json na estrutura esperada. Por isso quando rodamos o rimage.py, ele utiliza a função load() do rcontent.py para buscar o conteúdo do video e efetuar a busca das imagens. Após encontrar as imagens, ele gera uma lista com os links e grava dentro do atributo images, dentro de sentences.

O terceiro ponto é o time.sleep(1.5) no final da função, que precisei incluir para respeitar os limites de Free Tier do Bing Resource. Com isso, eu garanto que só vou fazer 1 chamada por segundo.

Download das imagens

Para o download das imagens, inclui todos os passos dentro de uma função que eu chamei de download_images(). Ficou assim:


def download_images():
    logging.info("Downloading images from each sentences")
    #os.chdir('./')
    path = CONTENT_IMAGES_PATH

    # create directory
    os.makedirs(path, exist_ok=True)
    # limpando a pasta
    os.system("rm -rf {}/*".format(path))
    video_content = rcontent.load()

    list_img = []

    for idx_s, sentence in enumerate(video_content['sentences']):
        for idx_i, image in enumerate(sentence['images']):
            if image not in list_img:
                # if an image doesn't downloaded, try another one
                try:
                    print("Trying to download: ", image)
                    image_filename = "{}/{}_original.jpg".format(path,idx_s)
                    wget.download(image,image_filename)
                    list_img.append(image)
                    print("")
                    break
                except Exception as ex:
                    logging.error(ex)
                    continue
    
    video_content['images_used'] = list_img
    rcontent.save(video_content)

O que essa função faz é basicamente:

  1. verificar se a pasta onde ficará as imagens já existe, se não… cria…
  2. Remover todas as imagens existentes na pasta
  3. Carrega o conteúdo da content.json para buscar os links das imagens buscadas
  4. Itera nas sentenças e nas imagens encontradas.
  5. Faz uma verificação se a imagem já não foi baixada
  6. Tenta realizar o download da imagem, se por algum motivo ele não conseguir, ele tenta a próxima imagem.
  7. Grava o link das imagens baixadas dentro do atributo images_used e salva o objeto em content.json

Next steps?!

Com conteúdo textual e imagens devidamente providenciadas, é hora de começar a montar o video.

Mostro como fiz, no próximo post!

Abraço!

Python na prática: Projeto Video Creator – #Parte 6: Bing Custom Search!

Bom dia, boa tarde, boa noite!

Essa é a sexta parte da série sobre o projeto Video Creator, onde mostrarei um pouco sobre o Bing Custom Search.

Se você entrou direto nesse post, te aconselho a começar por aqui, para entender exatamente do que se trata essa série.

Sobre essa parte

Aqui resolvi seguir um caminho um pouco diferente do projeto original, que utilizou o Custom Search do Google, e resolvi utilizar o Bing Custom Search para realizar a busca pelas imagens.

Nos testes que realizei, os resultados do Google não foram satisfatórios, trazendo imagens completamente sem ligação com o conteúdo. Não sei o porquê!

Então resolvi pesquisar outras formas de buscar imagens e gostei muito do Bing, tanto na acurácia dos resultados, quando nas opções de filtros disponíveis.

Requisitos:

O caminho não é muito diferente do Google, você precisará de:

1) Criar conta em https://portal.azure.com/
2) Criar uma subscription pay as you go
3) Criar o bing resource com Free Tier
4) Criar uma instancia do bing custom search

Criando a conta na Azure:

Este passo é muito simples, basta entrar nesse endereço: https://portal.azure.com e clicar em criar conta:

layout fev/2022

Os próximos passos, é o mesmo de qualquer serviço web.

Criar uma subscription pay as you go

Ao finalizar a criação da conta e realizar o login, você verá as seguinte tela:

layout fev/2022

Clique em Subscriptions e depois, na opção Add +. Na tela que abrir, escolha Pay as you Go. Você pode criar uma Free trial se quiser. Como o recurso possui um Free tier, se você ficar dentro dos limites, você não será cobrado.

layout fev/2022

Agora vem uma parte um pouco mais chata, que é onde você precisa preencher alguns dados pessoais, e os dados da forma de pagamento.

Reforçando: Para este recurso que utilizei no projeto, vamos usar a camada de Free tier. Se você respeitar os limites dessa camada, você não será cobrado.

layout fev/2022

Criar o Bing Custom Search

Após a criação da subscription, busque por bing resource no topo da pagina, e escolha a opção Bing Resources na seção Services

Na tela que abrir, clique em Add+ e depois em Bing Custom Search.

Na nova tela, dê um nome para o recurso, selecione a subscription, e no Pricing Tier, selecione a opção F0, essa opção é referente ao Free Tier. Lembre-se de respeitar os limites de chamada.

layout fev/2022

Após tudo preenchido, clique em criar. Pronto :D.

Agora entre na página do recurso que você acabou de criar, e procure por Manage keys e clique em click here to manage keys.

Na tela que abrir você terá acesso a 2 chaves, você precisará delas para fazer as chamadas.

layout fev/2022

Eu salvei a Key 1 dentro do atributo azure_subscription_key no meu arquivo credentials.yml.

Criar uma instancia do bing custom search

Acesso a página https://www.customsearch.ai/applications e faça login com sua conta Azure.

Clique em New Instance. Na tela que abrir, digite um nome para a nova instancia.

layout fev/2022

Após a nova instancia criada, clique nela e vc entrará na tela de configuração dessa instancia. No topo da página, clique em Production:

layout fev/2022

Precisaremos apenas guardar a Custom Configuration ID. Criei uma variável dentro do arquivo credentials.yml chamada bing_custom_config_id, onde eu guardei esse ID.

E agora?!

Nesse momento, já temos os recursos necessários para realizar a pesquisa das imagens.

Mas se quiser testar, na página do recurso no Portal Azure, vai ter uma aba chamada Sample code, onde você terá alguns exemplos de código para testar.

Você precisará apenas da subscription key, que é a Key do recurso, o endpoint e o id da instancia do Custom Search que criamos logo acima.

Próximo passo? Buscar as imagens 😀

Abraço

Gerando videos para o Youtube com linguagem Python

Navegando pelo Youtube a mais ou menos 2 anos atrás, me deparei com uma playlist do canal Filipe Deschamps onde ele mostrava como havia programado 4 robôs para automatizar a criação de videos para o Youtube fornecendo apenas o assunto para o robô.

Para quem quiser conferir, esse é o link do primeiro video da série:

Programei 4 robôs que criam vídeos para mim no YouTube

Bom, na época havia começado minha jornada de aprendizado em Python, e resolvi que faria um projeto similar, utilizando Python, e ferramentas alternativas as utilizadas no projeto original.

Pelos meses seguinte, a idéia não saiu do papel, por diversas razões que não precisam ser citadas aqui.

Até que no final de 2021, resolvi que tiraria esse projeto do papel, apenas por diversão e para praticar um pouco de Python… foi bem divertido :D.

O projeto ficou pronto e pode ser conferido no repositório que postarei mais abaixo. Porém não foi fácil concluí-lo. Diversas coisas no projeto segui o exatamente o que ele fez, outras nem tanto. Também utilizei muito do conhecimento passado nos videos do Filipe Deschamps, porém ele usou Node.js e como resolvi fazer em Python, muitas coisas precisei pesquisar como poderia fazer, quais libs poderia usar, etc.

Então para registrar o conhecimento que adquiri com esse pequeno projeto, resolvi escrever uma série de posts, cada qual abordando um pedaço do projeto, assim como o Filipe fez em video.

O objetivo principal é para reforçar, por meio do repasse, o aprendizado adquirido. Espero que estes posts possam ajudar vocês de alguma forma, seja com o conteúdo técnico ou simplesmente motivando-os a iniciarem seus projetos pessoais. É a melhor forma de aprender, e como o Filipe falou nos videos, são nesses projetos, que podemos usar toda e qualquer tecnologia que temos vontade, sem nos preocupar se é viável ou não.

Repositório com o projeto concluído:
https://github.com/thmlima87/videocreator

O que foi usado no projeto?

Apesar de parecer simples, o projeto envolveu bastante coisa legal:

Bora começar!

Abaixo os links de todos os posts para facilitar a navegação.

Parte 1: Arquitetura da aplicação
Parte 2: Idéias de conteúdo!
Parte 3: Buscando o assunto escolhido na Wikipedia
Parte 4: Limpeza e interpretação do texto
Parte 5: Persistência do conteúdo
Parte 6: Bing Custom Search
Parte 7: Busca e download de imagens
Parte 8: Tratamento das imagens
Parte 9: Renderização do video
Parte 10: Upload para o Youtube

Exit mobile version