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

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

Compartilhe
Comentários (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.