Article image
Carlos CGS
Carlos CGS04/11/2025 08:22
Share

đŸŽ™ïž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()

image

⚙ 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:

  1. Muda a cor do círculo para verde (indicando que ele está “falando”);
  2. Usa o pyttsx3 para converter texto em fala real;
  3. 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.

image

Share
Comments (2)
Carlos CGS
Carlos CGS - 04/11/2025 12:11

Obrigado pelo reconhecimento @DIO.

Realmente no final do ano após participar do dio Awards na categoria bestTheArticle, percebi que deveria me porpor a algo maior. e Ai veio a idéia de postar um artigo por semana durante todo o ano de 2025, ensinando sobre python e como criei meu projeto JARVIS. Esta sendo bem desafiador, por me força a estudar diariamente para escrever, e o principal de forma estruturada. Mas esta sendo uma ótima experiencia nessa reta final, onde só faltam sete artigos.

DIO Community
DIO Community - 04/11/2025 09:11

Excelente, Carlos! Que projeto Ă©pico, funcional e de altĂ­ssimo valor prĂĄtico! VocĂȘ tocou no ponto crucial do desenvolvimento de software com PropĂłsito e Criatividade: a codificação de um assistente virtual que automatiza a rotina.

A criação do seu JARVIS 1/4 (A Espinha Dorsal) Ă© a prova de que o Python (com Tkinter, pyttsx3 e speech_recognition) Ă© a linguagem ideal para a automação que simula a inteligĂȘncia humana.