IA Bíblica com Python: Como Criar um Assistente com Flask e Voz

Bem-vindo à série de Python para iniciantes do Academy Code Christ.

🌍 Este site está disponível em vários idiomas.
Fique à vontade para usar o tradutor no topo da página e aprender no seu idioma.

🤯 E se você pudesse digitar uma pergunta bíblica e receber uma resposta inteligente, com voz, em tempo real direto no navegador? 

Foi exatamente isso que construímos aqui na Academy Code Christ: um Assistente Bíblico com Inteligência Artificial, desenvolvido do zero com Python, Flask e HTML/CSS/JS — com respostas em voz usando a própria API do navegador.

Neste post, você vai entender como funciona por dentro, quais tecnologias usamos e como você também pode criar o seu. Vamos nessa? ✝️💻

🤖 O que este projeto faz?

O Assistente Bíblico IA é uma aplicação web que permite ao usuário fazer perguntas sobre a Bíblia como:
  • Responde perguntas bíblicas automaticamente
  • Busca versículos relacionados
  • Usa IA simples com TF-IDF
  • Fala as respostas em voz alta
  • Gera imagens com versículos
  • Funciona direto no navegador ou desktop

🛠️ Tecnologias Utilizadas

  • 🐍 Python 3 Backend principal da aplicação 
  • ⚙️ Flask Servidor web leve e rápido 
  • 🗃️ SQLite Base de dados com versículos (NVI) 
  • 🌐 HTML + CSS Interface visual do assistente 
  • ⚡ JavaScript Comunicação com o servidor + voz 
  • 🎙️ Web Speech API Leitura das respostas em voz alta. tem com link vou dar o exemplo  

🐍 Python — Backend da aplicação

O Python é a base principal deste projeto, responsável por toda a lógica da IA e integração com o banco de dados.

Se você está começando agora, recomendamos este guia:

👉 Estruturas Condicionais em Python: if, elif e else (Guia Completo)

 

⚙️ Flask — Servidor web da aplicação

O Flask é o framework responsável por criar a API que conecta o frontend com o backend.

💻  o Trecho de Código que é o Coração do Projeto: Veja como é simples a rota principal no Flask:

from flask import Flask, request, jsonify
import sqlite3

app = Flask(__name__)

# Rota que recebe a pergunta do usuário
@app.route('/perguntar', methods=['POST'])
def perguntar():
    dados = request.get_json()
    pergunta = dados['pergunta']
    
    # Busca na base bíblica
    resposta = buscar_na_biblia(pergunta)
    
    return jsonify({'resposta': resposta})

if __name__ == '__main__':
    app.run(debug=True)
  

🗃️ SQLite — Banco de dados dos versículos

O SQLite é utilizado para armazenar os versículos bíblicos de forma simples e leve.

⚡ JavaScript — Comunicação com o servidor + voz

O JavaScript é responsável por conectar o navegador com o backend em Python (Flask).Ele envia a pergunta do usuário para o servidor e recebe a resposta da IA em tempo real.Depois disso, usa a Web Speech API para transformar o texto em voz e ler a resposta automaticamente 🎙️.

💻 Exemplo no projeto:

// Envia pergunta e lê resposta em voz
async function perguntar() {
  const pergunta = 
    document.getElementById('input').value;

  const res = await fetch('/perguntar', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({ pergunta })
  });

  const dados = await res.json();
  
  // Lê em voz alta 🎙️
  const voz = new SpeechSynthesisUtterance(dados.resposta);
  voz.lang = 'pt-BR';
  speechSynthesis.speak(voz);
}
  


⚙️ Como Funciona Por Dentro?

A arquitetura do projeto segue um fluxo simples e poderoso:

👤 Usuário digita a pergunta
    ⬇️
🌐 JavaScript envia via fetch() para o Flask
    ⬇️
🐍 Python processa a pergunta
    ⬇️
🗃️ SQLite busca versículos relacionados
    ⬇️
📄 Arquivos .txt adicionam contexto teológico
    ⬇️
💬 Resposta é gerada e enviada ao navegador
    ⬇️
🎙️ Web Speech API lê a resposta em voz alta

🧠 Como Criar uma IA Bíblica com Python (Passo a Passo Completo)

A inteligência artificial está cada vez mais presente no nosso dia a dia.
Mas você já imaginou usar IA para estudar a Bíblia de forma inteligente?

Neste artigo, você vai aprender como criar uma IA bíblica com Python, capaz de:

  • 📖 Encontrar versículos automaticamente
  • 🧠 Entender perguntas usando análise de texto
  • 🔊 Ler versículos em voz alta
  • 🖼️ Gerar imagens com textos bíblicos

E o melhor: tudo isso rodando no seu próprio computador.

Escopo do projeto 1

import pandas as pd
import sqlite3
import string
import unidecode
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from colorama import init, Fore, Style
import tkinter as tk
from tkinter import messagebox
import pyttsx3  # Biblioteca para 
from PIL import Image, ImageDraw, ImageFont
import os


init(autoreset=True)

# Inicializar o engine de fala (pyttsx3)
engine = pyttsx3.init()

# Configuração do som (ajuste de velocidade e volume, se necessário)
engine.setProperty('rate', 150)  # Velocidade
engine.setProperty('volume', 1)  # Volume (0.0 a 1.0)

# Conectar ao banco de dados SQLite
conexao = sqlite3.connect('Projetos-Python/NVI.sqlite')

# Carregar os versículos da tabela 'verse'
versos = pd.read_sql("SELECT * FROM verse;", conexao)
livros = pd.read_sql("SELECT * FROM book;", conexao)

# Juntar nome do livro aos versículos
versiculos_completos = versos.merge(livros, left_on='book_id', right_on='id')

# Normalizar texto (remover acentos, caixa, pontuação etc.)
def normalizar(texto):
    texto = unidecode.unidecode(texto.lower())
    texto = texto.translate(str.maketrans('', '', string.punctuation))
    return texto

# Transformar textos em vetores TF-IDF
textos_versiculos = versiculos_completos['text'].apply(normalizar).values
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf.fit_transform(textos_versiculos)

# Função para gerar imagem do versículo
def gerar_imagem_versiculo(nome, cap, vers, texto):
    largura = 1080
    altura = 1080
    margem = 80

    # Criar imagem com degradê
    img = Image.new("RGB", (largura, altura), "#FFFFFF")
    draw = ImageDraw.Draw(img)

    # Degradê vertical (do azul claro pro branco)
    for y in range(altura):
        r = int(255 - (y / altura) * 30)
        g = int(255 - (y / altura) * 80)
        b = int(255 - (y / altura) * 120)
        draw.line([(0, y), (largura, y)], fill=(r, g, b))

    # Carregar fontes personalizadas
    try:
        fonte_versiculo = ImageFont.truetype("fonte.ttf", 50)
        fonte_referencia = ImageFont.truetype("fonte.ttf", 30)
    except:
        fonte_versiculo = ImageFont.load_default()
        fonte_referencia = ImageFont.load_default()

    # Função para quebrar texto
    def quebra_texto(texto, fonte, largura_max):
        palavras = texto.split()
        linhas = []
        linha = ""
        for palavra in palavras:
            teste = f"{linha} {palavra}".strip()
            if draw.textlength(teste, font=fonte) <= largura_max:
                linha = teste
            else:
                linhas.append(linha)
                linha = palavra
        if linha:
            linhas.append(linha)
        return linhas

    # Preparar o texto
    linhas = quebra_texto(texto, fonte_versiculo, largura - 2 * margem)
    referencia = f"{nome} {cap}:{vers}"

    # Centralizar verticalmente
    altura_texto = len(linhas) * 60
    y = (altura - altura_texto) // 2

    # Desenhar versículo
    for linha in linhas:
        largura_linha = draw.textlength(linha, font=fonte_versiculo)
        draw.text(((largura - largura_linha) / 2, y), linha, font=fonte_versiculo, fill="white")
        y += 60

    # Desenhar referência no rodapé
    largura_ref = draw.textlength(referencia, font=fonte_referencia)
    draw.text(((largura - largura_ref) / 2, altura - 100), referencia, font=fonte_referencia, fill="white")

    # Salvar imagem
    pasta = "versiculos_img"
    if not os.path.exists(pasta):
        os.makedirs(pasta)
    nome_arquivo = f"{pasta}/{nome.replace(' ', '_')}_{cap}_{vers}.png"
    img.save(nome_arquivo)

    return nome_arquivo


# Função para responder pergunta
def responder_pergunta(pergunta, ja_mostrados):
    pergunta_limpa = normalizar(pergunta)
    pergunta_tfidf = tfidf.transform([pergunta_limpa])
    similaridade = cosine_similarity(pergunta_tfidf, tfidf_matrix)

    # Pegar os top 3 resultados (que ainda não foram mostrados)
    indices = similaridade[0].argsort()[::-1]
    respostas = []
    for i in indices:
        if i not in ja_mostrados:
            vers = versiculos_completos.iloc[i]
            respostas.append({
                'nome': vers['name'],
                'cap': vers['chapter'],
                'vers': vers['verse'],
                'texto': vers['text']
            })
            ja_mostrados.add(i)
        if len(respostas) == 3:
            break

    return respostas

# Função que atualiza a interface gráfica com os resultados
def buscar_pergunta():
    pergunta = entrada_pergunta.get()
    if pergunta.lower() == 'sair':
        janela.quit()
        return

    ja_mostrados = set()
    respostas = responder_pergunta(pergunta, ja_mostrados)

    if respostas:
        resultado_texto = ""
        for r in respostas:
            resultado_texto += f"\n📖 {r['nome']} {r['cap']}:{r['vers']} - {r['texto']}\n"
        
        # Exibir os resultados
        resultado_label.config(text=resultado_texto)
        
        # Falar o(s) versículo(s)
        for r in respostas:
            versiculo_texto = f"{r['nome']} {r['cap']}:{r['vers']} - {r['texto']}"
            engine.say(versiculo_texto)  # Adiciona o texto à fila de fala
        engine.runAndWait()  # Fala tudo de uma vez
        # Gerar imagem do primeiro versículo como exemplo
        imagem_path = gerar_imagem_versiculo(respostas[0]['nome'], respostas[0]['cap'], respostas[0]['vers'], respostas[0]['texto'])
        messagebox.showinfo("Imagem criada", f"📸 Imagem salva em:\n{imagem_path}")

    else:
        messagebox.showinfo("Resultado", f"{Fore.RED}❌ Nenhum versículo relevante encontrado.")

# Criando a interface gráfica com tkinter
janela = tk.Tk()
janela.title("Assistente Bíblico")
janela.geometry("500x400")

# Título
titulo_label = tk.Label(janela, text="🔎 Pergunte algo sobre a Bíblia", font=("Arial", 16))
titulo_label.pack(pady=10)

# Caixa de texto para digitar a pergunta
entrada_pergunta = tk.Entry(janela, width=40, font=("Arial", 12))
entrada_pergunta.pack(pady=10)

# Botão para buscar
botao_buscar = tk.Button(janela, text="Buscar", command=buscar_pergunta, font=("Arial", 12))
botao_buscar.pack(pady=10)

# Área para mostrar o resultado
resultado_label = tk.Label(janela, text="", font=("Arial", 12), justify="left", padx=10, pady=10)
resultado_label.pack(pady=20)

# Iniciar o loop principal da interface
janela.mainloop()

🧠Explicação:


import pandas as pd
👉 Biblioteca pra trabalhar com dados tipo tabela (DataFrame)
👉 Aqui você usa pra ler o banco SQLite

import sqlite3
👉 Permite conectar no banco de dados .sqlite (onde estão os versículos)

import string
👉 Usado pra pegar lista de pontuações (.,!? etc)

import unidecode
👉 Remove acentos
Ex:
“fé” → “fe”
“oração” → “oracao”

from sklearn.feature_extraction.text import TfidfVectorizer
👉 Transforma texto em números (vetores)
👉 É o coração da sua “IA”

from sklearn.metrics.pairwise import cosine_similarity
👉 Mede o quão parecidos dois textos são

from colorama import init, Fore, Style
👉 Cores no terminal (não muito usado aqui na prática)

import tkinter as tk
from tkinter import messagebox

👉 Cria interface gráfica (janelinha)

import pyttsx3
👉 Faz o computador falar (voz offline)

from PIL import Image, ImageDraw, ImageFont
👉 Cria imagens (tipo os versículos bonitos)

import os
👉 Trabalha com arquivos e pastas

⚙️ 2. CONFIGURAÇÃO INICIAL

init(autoreset=True)
👉 Ativa colorama e reseta cores automaticamente

engine = pyttsx3.init()
👉 Inicializa o sistema de voz

engine.setProperty('rate', 150)
👉 Velocidade da fala

engine.setProperty('volume', 1)
👉 Volume máximo

🗄️ 3. BANCO DE DADOS

conexao = sqlite3.connect('Projetos-Python/NVI.sqlite')
👉 Conecta no banco da Bíblia

versos = pd.read_sql("SELECT * FROM verse;", conexao)
👉 Pega todos os versículos

livros = pd.read_sql("SELECT * FROM book;", conexao)
👉 Pega os nomes dos livros

versiculos_completos = versos.merge(livros, left_on='book_id', right_on='id')
👉 Junta tudo
Resultado:
Gênesis 1:1 + texto

🧹 LIMPEZA DE TEXTO (MUITO IMPORTANTE)

def normalizar(texto):
👉 Cria função pra limpar texto

texto = unidecode.unidecode(texto.lower())
👉 Tudo minúsculo + sem acento

texto = texto.translate(str.maketrans('', '', string.punctuation))
👉 Remove pontuação

return texto
👉 Retorna texto limpo

🧠  TRANSFORMAR TEXTO EM “IA”

textos_versiculos = versiculos_completos['text'].apply(normalizar).values
👉 Pega todos os versículos e limpa

tfidf = TfidfVectorizer(stop_words='english')
👉 Cria o modelo

⚠️ OBS: aqui tem erro (depois te explico)

tfidf_matrix = tfidf.fit_transform(textos_versiculos)
👉 Converte TODOS os versículos em números
👉 Isso vira o “cérebro” da busca

🖼️ FUNÇÃO DE GERAR IMAGEM

def gerar_imagem_versiculo(nome, cap, vers, texto):
👉 Função que cria imagem do versículo

img = Image.new("RGB", (largura, altura), "#FFFFFF")
👉 Cria imagem branca

draw = ImageDraw.Draw(img)
👉 Permite desenhar na imagem
🎨 Gradiente
for y in range(altura):
👉 Loop linha por linha
draw.line([(0, y), (largura, y)], fill=(r, g, b))
👉 Desenha cor → cria degradê
🔤 Fonte
ImageFont.truetype("fonte.ttf", 50)
👉 Usa fonte personalizada
Se falhar:
ImageFont.load_default()

🧩 Quebra de texto

def quebra_texto(...)
👉 Divide texto em várias linhas
👉 Pra não estourar a imagem

🧾 Desenhar texto

draw.text(...)
👉 Escreve o versículo na imagem

💾 Salvar

img.save(nome_arquivo)
👉 Salva no computador

🤖 FUNÇÃO PRINCIPAL (IA)

def responder_pergunta(pergunta, ja_mostrados):
👉 Aqui acontece a “mágica”
pergunta_limpa = normalizar(pergunta)
👉 Limpa a pergunta
pergunta_tfidf = tfidf.transform([pergunta_limpa])
👉 Converte pergunta em vetor
similaridade = cosine_similarity(pergunta_tfidf, tfidf_matrix)
👉 Compara com TODOS versículos
indices = similaridade[0].argsort()[::-1]
👉 Ordena do mais parecido → menos parecido
for i in indices:
👉 Loop pelos melhores
vers = versiculos_completos.iloc[i]
👉 Pega versículo correspondente
respostas.append({...})
👉 Guarda resposta
if len(respostas) == 3:
break

👉 Limita a 3 resultados

🖥️  INTERFACE (INTERAÇÃO COM USUÁRIO)

def buscar_pergunta():
👉 Função chamada quando clica no botão

pergunta = entrada_pergunta.get()
👉 Pega o que o usuário digitou
respostas = responder_pergunta(...)
👉 Chama a IA

📺 Mostrar resultado

resultado_label.config(text=resultado_texto)
👉 Atualiza a tela

🔊 Falar
engine.say(versiculo_texto)
👉 Adiciona fala

engine.runAndWait()
👉 Executa fala

🖼️ Gerar imagem

gerar_imagem_versiculo(...)
👉 Cria imagem automaticamente

💬 Popup

messagebox.showinfo(...)
👉 Mostra mensagem na tela

CRIAÇÃO DA JANELA

janela = tk.Tk()
👉 Cria app

janela.title("Assistente Bíblico")
👉 Título

janela.geometry("500x400")
👉 Tamanho
🧾 Elementos
Label = texto
Entry = campo de digitação
Button = botão
botao_buscar = tk.Button(..., command=buscar_pergunta)
👉 Quando clicar → roda a função

🔁 LOOP FINAL

janela.mainloop()
👉 Mantém o programa rodando

📚 O Que Você Aprende Construindo Este Projeto?


🐍 Python
Lógica de programação, funções, leitura de arquivos e banco de dados
⚙️ Flask
Criação de APIs REST, rotas, métodos POST e integração com frontend
JavaScript
Fetch API, manipulação do DOM e Web Speech API para síntese de voz
🗃️ SQLite
Modelagem e consulta de banco de dados relacional com Python

📚 Continue Aprendendo:

Esse conteúdo faz parte do projeto Academy Code Christ, criado para ajudar iniciantes a aprender programação de forma gratuita e direta.

Se esse conteúdo te ajudou, você pode me pagar um café ☕
Pix: antropologiacrista@gmail.com



Comentários

Postagens mais visitadas