đ¶JARVIS DJ: Criando Playlists Inteligentes e Comandos Musicais com Python
Projeto CodeVerse Python â #42/2025
đ Fala, galera dev!
Bem-vindos a mais um episĂłdio da nossa saga CodeVerse Python 2025! No artigo anterior (#41), aprendemos e ensinamos nosso JARVIS a tocar mĂșsicas diretamente do YouTube por comando de voz, um passo importante para transformar e evoluir nosso assistente em um companheiro realmente que nos ajuda em nosso dia a dia, automazando de forma real nossos pedidos.
Mas, se o Tony Stark nĂŁo repete uma armadura, por que nĂłs repetirĂamos o mesmo cĂłdigo? đ Hoje vamos evoluir esse recurso, dando ao JARVIS a capacidade de criar playlists inteligentes, lembrar preferĂȘncias musicais e atĂ© tocar sons aleatĂłrios de acordo com o seu humor ou desejo do momento.
Ă aqui que o nosso assistente começa a ganhar personalidade, aprendendo o que gostamos de ouvir e se tornando, pouco a pouco, um DJ pessoal no estilo Stark Industries. đ§
đ§ Como o JARVIS entende o que vocĂȘ quer ouvir
Antes de irmos ao cĂłdigo, vale entender a lĂłgica. O JARVIS vai escutar seu comando (âJarvis, toque minha playlist de treinoâ), identificar palavras-chave e decidir o que fazer com base nelas. E para isso, vamos usar:
- speech_recognition â para converter voz em texto;
- pyttsx3 â para dar voz ao Jarvis;
- json â para guardar suas preferĂȘncias musicais (memĂłria local);
- webbrowser â para abrir o YouTube diretamente na busca da mĂșsica ou playlist;
- random â para tocar mĂșsicas aleatĂłrias quando vocĂȘ pedir algo como âJarvis, me surpreendaâ.
Ou seja, estamos unindo tudo o que jå aprendemos em artigos anteriores, fala, escuta, memória e integração web, em uma só funcionalidade.
đ Parte 1 â Criando o arquivo de memĂłria de playlists
Antes de tudo, vamos permitir que o JARVIS lembre suas playlists. Assim, se vocĂȘ disser uma vez âJarvis, salvar playlist de treinoâ, ele vai guardar e, da prĂłxima vez, tocar automaticamente sem precisar perguntar.
import json
arquivo_playlists = "playlists_jarvis.json"
def salvar_playlist(nome, link):
try:
with open(arquivo_playlists, "r") as f:
playlists = json.load(f)
except FileNotFoundError:
playlists = {}
playlists[nome.lower()] = link
with open(arquivo_playlists, "w") as f:
json.dump(playlists, f)
def obter_playlist(nome):
try:
with open(arquivo_playlists, "r") as f:
playlists = json.load(f)
return playlists.get(nome.lower(), None)
except FileNotFoundError:
return None
đ Como funciona: O cĂłdigo cria um arquivo playlists_jarvis.json, que Ă© basicamente a âmemĂłria musicalâ do nosso assistente.
- Quando vocĂȘ salva uma playlist, o Jarvis grava o nome e o link no formato nome: link.
- Quando pede para tocar, ele procura o nome no arquivo e abre o link salvo.
Esse trecho cria uma âmemĂłria musicalâ simples para o Jarvis usando um arquivo JSON â pense nele como um caderno onde o assistente anota o nome da sua playlist e o link correspondente. Logo no começo, import json traz a ferramenta que permite transformar dados do Python em texto JSON e vice-versa. Em seguida, arquivo_playlists = "playlists_jarvis.json" define o nome do arquivo onde essas anotaçÔes serĂŁo guardadas; se ainda nĂŁo existir, serĂĄ criado quando salvarmos a primeira playlist.
A função salvar_playlist(nome, link) Ă© quem faz a anotação. Primeiro ela tenta abrir o arquivo em modo de leitura e carregar o conteĂșdo com json.load. Se o arquivo nĂŁo existir ainda, cai no except FileNotFoundError e começa com um dicionĂĄrio vazio, como um caderno em branco. Depois, registra a playlist usando a chave em minĂșsculas (nome.lower()) para evitar diferenças entre âTreinoâ, âtreinoâ ou âTREINOâ. Por fim, reabre o arquivo em modo de escrita e salva o dicionĂĄrio atualizado com json.dump. Isso garante persistĂȘncia: mesmo que vocĂȘ feche o programa, as playlists continuam lĂĄ no disco.
JĂĄ a função obter_playlist(nome) Ă© a parte da âconsultaâ. Ela tenta abrir e ler o mesmo arquivo JSON, transformando o conteĂșdo em um dicionĂĄrio. DaĂ, procura a chave correspondente ao nome pedido (tambĂ©m em minĂșsculas) e retorna o link se encontrar; se nĂŁo houver essa entrada, devolve None. Caso o arquivo inteiro nĂŁo exista (porque nada foi salvo ainda), ela tambĂ©m retorna None, indicando educadamente que nĂŁo hĂĄ playlists registradas.
Em resumo, salvar_playlist escreve (ou atualiza) uma entrada ânome â linkâ no arquivo JSON, e obter_playlist lĂȘ esse arquivo para devolver o link associado ao nome informado. Ă uma solução leve, fĂĄcil de entender e suficiente para dar ao Jarvis a capacidade de lembrar suas playlists favoritas entre uma execução e outra.
đ§ Parte 2 â Fazendo o Jarvis tocar e aprender
Agora vem a parte divertida! Vamos integrar o reconhecimento de voz, a voz do Jarvis e a reprodução no navegador.
import speech_recognition as sr
import pyttsx3
import webbrowser
import random
import json
engine = pyttsx3.init()
r = sr.Recognizer()
arquivo_playlists = "playlists_jarvis.json"
def falar(texto):
engine.say(texto)
engine.runAndWait()
def salvar_playlist(nome, link):
try:
with open(arquivo_playlists, "r") as f:
playlists = json.load(f)
except FileNotFoundError:
playlists = {}
playlists[nome.lower()] = link
with open(arquivo_playlists, "w") as f:
json.dump(playlists, f)
def obter_playlist(nome):
try:
with open(arquivo_playlists, "r") as f:
playlists = json.load(f)
return playlists.get(nome.lower(), None)
except FileNotFoundError:
return None
def tocar_playlist(nome):
link = obter_playlist(nome)
if link:
falar(f"Tocando sua playlist {nome}, senhor.")
webbrowser.open(link)
else:
falar("NĂŁo encontrei essa playlist, senhor.")
with sr.Microphone() as source:
falar("Estou ouvindo, senhor. O que deseja ouvir?")
audio = r.listen(source)
try:
comando = r.recognize_google(audio, language="pt-BR").lower()
if "salvar playlist" in comando:
falar("Qual o nome da playlist?")
with sr.Microphone() as source:
audio = r.listen(source)
nome = r.recognize_google(audio, language="pt-BR")
falar("Qual o link da playlist, senhor?")
link = input("Cole aqui o link do YouTube: ")
salvar_playlist(nome, link)
falar(f"Playlist {nome} salva com sucesso.")
elif "tocar playlist" in comando:
nome = comando.replace("tocar playlist", "").strip()
tocar_playlist(nome)
elif "me surpreenda" in comando:
opcoes = [
"https://www.youtube.com/watch?v=LYU-8IFcDPw",
"https://www.youtube.com/watch?v=5abamRO41fE",
"https://www.youtube.com/watch?v=RUi54JTgL5s",
]
musica = random.choice(opcoes)
falar("Deixe comigo, senhor. Escolhi algo especial.")
webbrowser.open(musica)
else:
falar("Desculpe, nĂŁo entendi o comando musical, senhor.")
except:
falar("NĂŁo consegui entender o que disse, senhor.")
đ” Como o cĂłdigo funciona:
- O Jarvis ouve o comando.
- Se vocĂȘ disser âsalvar playlist de treinoâ, ele pede o link e guarda.
- Se disser âtocar playlist de treinoâ, ele busca no arquivo e abre no YouTube.
- Se disser âme surpreendaâ, ele escolhe uma mĂșsica aleatĂłria e toca.
Primeiro, ele importa as âpeçasâ que vamos usar. speech_recognition Ă© o ouvido do Jarvis: capta sua voz e transforma em texto. pyttsx3 Ă© a boca: transforma texto em fala para o Jarvis responder. webbrowser abre o navegador no endereço que a gente mandar (no caso, links do YouTube). random serve para escolher algo aleatoriamente quando pedirmos âme surpreendaâ. E json Ă© o formato de arquivo onde o Jarvis guarda e lĂȘ as playlists salvas (uma memĂłria simples em disco).
Logo em seguida, o cĂłdigo inicializa a voz (pyttsx3.init()) e o reconhecedor de fala (sr.Recognizer()). TambĂ©m define o nome do arquivo onde as playlists ficam guardadas: playlists_jarvis.json. Pense nesse arquivo como um âcaderninhoâ onde o Jarvis anota o nome da playlist e o link correspondente.
A função falar(texto) Ă© direta: ela pega uma frase e faz o computador âfalarâ em voz alta. Toda vez que o Jarvis precisa responder algo, passamos a frase para essa função.
Depois vĂȘm as funçÔes de memĂłria das playlists. salvar_playlist(nome, link) tenta abrir o arquivo playlists_jarvis.json. Se o arquivo ainda nĂŁo existe, ele cria um dicionĂĄrio vazio. Em seguida, registra (ou atualiza) a entrada nome -> link e salva de volta no arquivo. Isso permite que, no futuro, ao pedir âtocar playlist Xâ, o Jarvis saiba qual link abrir. JĂĄ obter_playlist(nome) faz o contrĂĄrio: abre o arquivo (se existir), carrega as playlists e procura pelo nome pedido. Se encontrar, devolve o link; se nĂŁo, retorna None.
A função tocar_playlist(nome) junta tudo isso: ela chama obter_playlist para descobrir o link daquela playlist. Se existir, o Jarvis avisa (âTocando sua playlistâŠâ) e abre o link no navegador com webbrowser.open(link). Se nĂŁo existir, ele informa que nĂŁo encontrou.
A partir daĂ, começa a interação por voz. O bloco with sr.Microphone() as source: liga o microfone, o Jarvis diz âEstou ouvindoâŠâ e captura o que vocĂȘ falou. O ĂĄudio capturado vai para o reconhecedor, que tenta transformar fala em texto com recognize_google(..., language="pt-BR"). Esse texto Ă© guardado na variĂĄvel comando, jĂĄ em letras minĂșsculas para facilitar as comparaçÔes.
O âmini-cĂ©rebroâ estĂĄ nos ifs. Se o comando contiver âsalvar playlistâ, o Jarvis pergunta o nome da playlist (por voz, e escuta pelo microfone) e depois pede o link (aqui, por simplicidade, vocĂȘ cola no terminal). Com nome e link em mĂŁos, ele chama salvar_playlist e confirma que deu tudo certo. Se o comando for âtocar playlist âŠâ, ele extrai o nome que veio depois da frase (ex.: âtocar playlist treinoâ), chama tocar_playlist(nome) e abre a playlist no navegador. Se vocĂȘ disser âme surpreendaâ, o Jarvis escolhe aleatoriamente um link de uma lista prĂ©-definida (aqui coloquei trĂȘs exemplos) e abre no navegador â antes, ele avisa com uma fala estilosa.
Caso o que vocĂȘ disse nĂŁo combine com nenhum desses caminhos (âsalvar playlistâ, âtocar playlistâ, âme surpreendaâ), o Jarvis responde que nĂŁo entendeu o comando musical. E, se acontecer algum erro ao reconhecer a fala (por ruĂdo, conexĂŁo do serviço de reconhecimento, etc.), o except final cuida de responder de forma educada (âNĂŁo consegui entenderâŠâ), em vez de deixar o programa quebrar.
Resumindo: o script escuta o que vocĂȘ diz, entende se vocĂȘ quer salvar uma nova playlist (nome + link), tocar uma playlist jĂĄ salva pelo nome, ou te surpreender com uma mĂșsica aleatĂłria. Ele guarda tudo em um arquivo JSON simples (como um dicionĂĄrio de ânome â linkâ), fala com vocĂȘ usando voz sintetizada e abre o YouTube automaticamente quando Ă© hora de tocar. Ă uma base enxuta, fĂĄcil de expandir: vocĂȘ pode trocar as falas do Jarvis, aumentar a lista de surpresas, ou atĂ© usar um reconhecimento melhor de frases para entender comandos mais naturais.
đŠžâïž De volta ao laboratĂłrio do Stark
Imagine o Tony Stark trabalhando no laboratĂłrio, projetando uma nova armadura Mark 90, quando de repente decide ouvir algo para entrar no ritmo. Ele nĂŁo tira os olhos do holograma, nĂŁo digita nada â apenas fala:
âJarvis, toque minha playlist de testes.â
Em segundos, a mĂșsica começa a tocar. Essa Ă© a essĂȘncia do nosso projeto: automatizar a criatividade, dar liberdade ao desenvolvedor e fazer com que o cĂłdigo trabalhe por nĂłs, nĂŁo o contrĂĄrio.
Assim como o Jarvis original, o nosso assistente começa a entender o contexto, reagir e se moldar Ă rotina do seu criador â e Ă© isso que transforma um script em algo vivo.
đź Concluindo...
Hoje vocĂȘ aprendeu a dar ao JARVIS o poder de tocar mĂșsicas personalizadas, criar playlists e atĂ© te surpreender com uma seleção aleatĂłria.
- â Aprendemos a criar uma memĂłria musical com JSON.
- â Vimos como salvar e reproduzir playlists por comando de voz.
- â E ainda adicionamos um toque de aleatoriedade com o comando âme surpreendaâ.
Nos prĂłximos artigos, vamos continuar evoluindo nosso assistente: đïž ensinaremos o Jarvis a transcrever conversas completas em texto, đŹ criar um modo conversa contĂnua, e đ adicionar um modo privado, onde ele para de ouvir suas falas.
đ Curtiu esse artigo? Me siga no GitHub e no LinkedIn para acompanhar cada passo do Projeto CodeVersePython2025 e construir o seu prĂłprio Jarvis.
Porque o futuro não é esperar a tecnologia chegar. ⥠à a gente que cria ele hoje.



