🎙️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.



