đïžJarvis 1/4 : Dando Voz, Identidade e Interface ao Nosso Assistente
- #Python
đ Projeto CodeVerse Python â #44/2025
đ Fala, galera dev! đ
Finalmente chegamos na fase final da nossa saga CodeVerse Python 2025, e a partir de agora, começamos a juntar todas as peças do nosso projeto J.A.R.V.I.S.
Nos Ășltimos artigos, ensinamos o Jarvis a ouvir, falar, lembrar, pesquisar, tocar mĂșsica e atĂ© a criar playlists inteligentes. Agora, chegou a hora de unificar tudo â e construir o Jarvis completo, passo a passo.
Nesta nova etapa (que serĂĄ dividida em quatro artigos), vamos montar o nosso assistente definitivo, conectando cada mĂłdulo que criamos durante o ano. E, para começar com o pĂ© direito, o artigo #44 serĂĄ sobre algo essencial: đ dar uma voz, uma âalmaâ e uma interface visual ao Jarvis. EntĂŁo vamos lĂĄ, afinal, "Falar Ă© fĂĄcil, mostre-me o cĂłdigo!" Linus Turvals.
đŠžâïž Arrumando nosso laboratĂłrio...
Imagine o Tony Stark no laboratĂłrio, cercado de hologramas, microchips e peças da armadura espalhadas pela mesa. Antes de o Jarvis controlar os drones, as torres ou a Mark 50, ele precisou nascer como uma voz â uma presença que pudesse ouvir e responder, mesmo sem um corpo fĂsico.
Ă exatamente o que faremos agora: vamos dar ao nosso Jarvis o seu primeiro âcorpo digitalâ â uma interface com Tkinter, uma voz sintetizada com pyttsx3, e o poder de ouvir comandos reais com SpeechRecognition.
Assim como Stark precisou testar o reator Arc e ouvir o âBom dia, senhorâ pela primeira vez, nĂłs tambĂ©m vamos criar o momento em que o Jarvis fala com a gente pela primeira vez. âĄ
đ§ Entendendo o que vamos criar
Antes de colocar a mĂŁo no cĂłdigo, vale entender o objetivo tĂ©cnico desta etapa, para que possamos caminhar juntos, sem grandes exectativas e sabendo o qu evamos fazer em cada um dos quatro artigos desse mĂȘs de novembro, onde iremos juntar todas as peças do quebra cabeça e transforma-las em um projeto real, criando nosso assistente virtual por completo:
- Vamos criar uma interface simples com Tkinter, exibindo o estado atual do assistente (ouvindo, falando, pronto);
- Usar o pyttsx3 para dar voz ao Jarvis (fala artificial);
- Usar o speech_recognition para permitir que ele nos ouça (microfone real);
- Exibir uma animação sutil no cĂrculo de interface enquanto ele fala;
- Criar uma saudação inicial personalizada com data e hora â mas sem clima ainda (isso virĂĄ no artigo #46).
O cĂłdigo desta fase Ă© a espinha dorsal do Jarvis. Tudo o que faremos daqui pra frente (abrir programas, pesquisar, tocar mĂșsica, etc.) vai ser conectado sobre essa base.
đ O cĂłdigo em ação
A seguir estĂĄ o cĂłdigo inicial do nosso Jarvis â ainda de forma incompleta, pois esta Ă© apenas a primeira parte, ou como mencionei anteriormente, a espinha dorsal do projeto.
A partir dessa base, iremos construir todas as demais partes e funcionalidades que compĂ”em o nosso assistente. Acredito ser importante que vocĂȘ pegue este cĂłdigo, teste em sua mĂĄquina e vĂĄ juntando as peças do quebra-cabeça, para compreender de verdade o funcionamento do Jarvis.
Afinal, mesmo apĂłs apresentarmos o projeto completo e funcional, ainda existirĂŁo diversas possibilidades de aprimoramento. VocĂȘ poderĂĄ adicionar novas funcionalidades, otimizar recursos tĂ©cnicos e atĂ© integrĂĄ-lo com dispositivos de casa inteligente, permitindo, por exemplo, acender luzes, controlar aparelhos domĂ©sticos e muito mais â embora, nesse caso, seja necessĂĄrio investir um pouco em hardware de conexĂŁo, Ă© claro.
Mas chega de conversa â vamos ao que interessa e apresentar o cĂłdigo! âïžđĄ
import os
import random
import time
import tkinter as tk
from threading import Thread
from datetime import datetime
import speech_recognition as sr
import pyttsx3
class JarvisApp:
def __init__(self, root):
self.root = root
self.root.title("Jarvis - CodeVerse 2025")
self.root.geometry("220x200")
bg_color = "#0B3D2E"
fg_color = "#E6F2EF"
self.root.configure(bg=bg_color)
self.label = tk.Label(root, text="Assistente de Voz - J.A.R.V.I.S.",
bg=bg_color, fg=fg_color, font=("Helvetica", 9))
self.label.pack(pady=10)
# CĂrculo central (olho do Jarvis)
self.canvas = tk.Canvas(root, width=100, height=100, bg=bg_color, highlightthickness=0)
self.circle = self.canvas.create_oval(30, 30, 70, 70, outline="#00FFFF", width=5)
self.canvas.pack()
self.btn_iniciar = tk.Button(root, text="Iniciar Assistente",
command=self.iniciar_assistente,
bg=fg_color, fg=bg_color, font=("Helvetica", 9))
self.btn_iniciar.pack(pady=5)
self.running = False
self.speaking = False
def iniciar_assistente(self):
if not self.running:
self.running = True
thread = Thread(target=self.executar_assistente)
thread.start()
self.label.config(text="Assistente iniciado...")
def executar_assistente(self):
engine = pyttsx3.init()
r = sr.Recognizer()
def mudar_cor_circulo(cor):
self.canvas.itemconfig(self.circle, outline=cor)
def falar(texto):
mudar_cor_circulo("#00FF00")
self.speaking = True
engine.say(texto)
engine.runAndWait()
self.speaking = False
mudar_cor_circulo("#00FFFF")
def apresentacao():
hora_atual = datetime.now().hour
if hora_atual < 12:
saudacao = "Bom dia"
elif hora_atual < 18:
saudacao = "Boa tarde"
else:
saudacao = "Boa noite"
falar(f"{saudacao}, senhor Carlos. Hoje Ă© {datetime.now().strftime('%d/%m/%Y')}, "
f"sĂŁo {datetime.now().strftime('%H:%M')}. Me chamo Jarvis.")
self.label.config(text="Se precisar de mim, diga meu nome, senhor.")
falar("Se precisar de mim, diga meu nome, senhor.")
apresentacao()
while self.running:
with sr.Microphone() as source:
r.adjust_for_ambient_noise(source)
self.label.config(text="Ouvindo...")
audio = r.listen(source)
try:
frase = r.recognize_google(audio, language="pt-BR").lower()
print("VocĂȘ disse:", frase)
if "jarvis" in frase:
respostas = [
"Sim, senhor?",
"Ăs ordens, senhor.",
"Estou aqui, senhor.",
"Pronto para ajudar."
]
resposta = random.choice(respostas)
self.label.config(text=resposta)
falar(resposta)
else:
falar("Desculpe, nĂŁo ouvi o meu nome.")
except sr.UnknownValueError:
self.label.config(text="NĂŁo entendi, senhor.")
falar("NĂŁo entendi, senhor.")
root = tk.Tk()
app = JarvisApp(root)
root.mainloop()
âïž Como o cĂłdigo funciona (explicando passo a passo)
1ïžâŁ Interface Visual (Tkinter)
A janela foi criada com fundo verde escuro e texto claro, inspirando um estilo âtecnolĂłgicoâ. O cĂrculo central funciona como um indicador visual:
- Azul quando o Jarvis estĂĄ em repouso;
- Verde quando estĂĄ falando;
- Ciano quando volta ao modo inativo.
O botĂŁo âIniciar Assistenteâ ativa uma thread, que executa o loop principal de voz sem travar a interface. Isso Ă© fundamental, pois o Tkinter sĂł processa um evento por vez.
2ïžâŁ Voz (pyttsx3)
A função falar(texto) é o coração da fala do Jarvis. Ao ser chamada, ela:
- Muda a cor do cĂrculo para verde (indicando que ele estĂĄ âfalandoâ);
- Usa o pyttsx3 para converter texto em fala real;
- Retorna o cĂrculo para a cor original ao terminar.
Esse detalhe visual dĂĄ vida Ă interface, tornando o Jarvis mais expressivo.
3ïžâŁ Escuta (SpeechRecognition)
Dentro do loop principal, usamos:
r.adjust_for_ambient_noise(source)
audio = r.listen(source)
frase = r.recognize_google(audio, language="pt-BR").lower()
Isso calibra o microfone ao ambiente, grava o ĂĄudio e envia para a API do Google que transforma a fala em texto. Em seguida, o cĂłdigo compara se a frase contĂ©m a wake word âjarvisâ. Se sim, ele responde aleatoriamente entre as frases prĂ©-definidas. Se nĂŁo, diz: âDesculpe, nĂŁo ouvi o meu nome.â
Esse comportamento imita a forma como o Jarvis dos filmes responde apenas quando chamado â sem interromper o dono a todo instante.
4ïžâŁ Saudação inicial
Logo no inĂcio da execução, o Jarvis verifica a hora e diz:
âBom dia, senhor Carlos. Hoje Ă© (data_atual), sĂŁo (hora_atual). Me chamo Jarvis.â
Essa fala inicial é a primeira identidade do nosso assistente. Nos próximos artigos, vamos adicionar informaçÔes do clima, humor e até piadas contextuais.
Nesta primeira parte, o nosso assistente ainda estĂĄ bastante limitado, pois este cĂłdigo Ă© apenas o alicerce do Jarvis completo. Tudo o que virĂĄ a seguir â abrir aplicativos, acessar a internet, consultar o clima, tocar mĂșsicas, criar anotaçÔes e atĂ© lembrar conversas â serĂĄ conectado a partir dessa estrutura inicial de voz + interface.
Vale lembrar que, neste estĂĄgio, o Jarvis ainda possui alguns comportamentos a serem corrigidos. Um dos mais perceptĂveis Ă© quando nĂŁo dizemos nada: ele acaba repetindo vĂĄrias vezes a frase âNĂŁo entendi, senhorâ, entrando no Ășltimo bloco else do cĂłdigo. Mas nĂŁo se preocupe â esse ajuste e outros refinamentos serĂŁo implementados nos prĂłximos artigos.
O mais importante agora é que, com essa implementação inicial, garantimos que o assistente jå tenha:
- â Um corpo visual (GUI funcional);
- â Um sistema de voz confiĂĄvel (fala e escuta);
- â E uma estrutura modular sĂłlida para as prĂłximas etapas.
đź ConclusĂŁo
Com este artigo, começamos a montar o nosso Jarvis, codificando os sistemas de ouvir e falar, presença e uma identidade digital. Com isso nosso assitente acaba de nascrer, ele jĂĄ pode te ouvir, te responder e reagir a comandos bĂĄsicos â o que antes eram apenas blocos de cĂłdigo isolados, agora começa a tomar forma real. Nos prĂłximos trĂȘs artigos de novembro, vamos continuar o processo:
- â 45: Jarvis com wake word completa e comandos de automação (abrir programas, navegador, Word, Excel etc.);
- â 46: Jarvis conectado Ă internet â previsĂ”es, clima e integração com o Google Gemini;
- â 47: Jarvis avançado â playlists, transcrição de ĂĄudio, memĂłria contextual e modo privado.
O Jarvis não é apenas um programa. Ele é uma forma de mostrar que a programação pode ser criativa, viva e inspiradora, assim como as criaçÔes do próprio Tony Stark.
Porque o futuro não é esperar a tecnologia chegar. ⥠à a gente que cria ela hoje.






