Buscar

Ebook Python com Arduino - Assistente Virtual

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 40 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 40 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 40 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

INDICE
Apresentação ........................................................................................................... 03
1. O que é o Python ................................................................................................. 03
2. Introdução ao Python .......................................................................................... 05
a. Variáveis ......................................................................................................... 05
b. Entrada e Saída ............................................................................................... 07
c. Condicional ..................................................................................................... 08
d. Bibliotecas ...................................................................................................... 14
3. Projeto Assistente Virtual ................................................................................... 15
a. O que é um Assistente Virtual ........................................................................ 15
b. Fazendo o Python Falar .................................................................................. 16
c. Fazendo o Python Ouvir ................................................................................. 18
d. Chatbot com Python ...................................................................................... 21
4. Aduino ouvindo Python ....................................................................................... 26
5. Projeto Completo ................................................................................................. 34
6. Conclusão ............................................................................................................ 38
Bibliografia ............................................................................................................... 39
3
Apresentação
 
A Pixels Escola é uma escola de tecnologia especialista em cursos de Design, 
Software e Robótica, onde no período da pandemia de 2020 se reinventou e 
desenvolveu diversos cursos on-line, um deles é este, Assistente Virtual com 
Python e Arduino, disposto em 10h/a ministradas ao vivo e 6h/aula de vídeo 
gravado postado no Youtube, não listado, onde somente você terá o acesso a este 
conteúdo produzido especialmente para nossos alunos do curso de robótica com 
Arduino.
Para complementar a Escola Pixels produziu este ebook como um guia escrito 
para o melhor aproveitamento do curso e possibilidade de referência em pesquisa 
futura.
Aproveite este ebook e avance no conhecimento: 
“Não se deve ir atrás de objetivos fáceis, é preciso buscar o que só pode ser 
alcançado por meio dos maiores esforços.”
Albert Einstein
1. O que é o Python
Segundo o Livro Python para desenvolvedores de Luiz Eduardo Borges: “Python é 
uma linguagem de altíssimo nível (em inglês, Very High Level Language) orientada 
a objeto, de tipagem dinâmica e forte, interpretada e interativa.”
Abaixo apresento algumas características:
 Sintaxe clara e concisa
 Possui estrutura de Alto nível
 Possibilidade de adição de frameworks de terceiros
 Suporta programação modular, funcional e orientada a objetos
 Código portável
 Software de Código Aberto
A linguagem surgiu em 1990 pelo professor Guido Van Rossum do Instituto 
Nacional de Pesquisa para Matemática e Ciência da Computação da Holanda 
(CWI).
4
Python é uma linguagem interpretada ou também conhecida como uma 
linguagem de script e também é uma linguagem interpretada quanto uma 
linguagem compilada. E o que é um compilador?
É o compilador que traduz linguagem Python em linguagem de máquina - 
código Python é traduzido em um código intermediário que deve ser executado 
por uma máquina virtual conhecida como PVM (Python Virtual Machine), ops, 
máquina virtual? Isso mesmo que você se lembrou, o bom e velho Java, sim o 
Virtual Machine do Python é muito similar ao Java que tem o objetivo de traduzir 
programas Python em bytecode Java para JVM (Java Virtual Machine).
O interpretador faz esta ‘tradução’ em tempo real para código de máquina, e 
o compilador traduz o programa inteiro em código de máquina de uma só vez e 
então o executa, criando um arquivo que pode ser executado.
Alguns links são importantes para caminhada na programação Python, abaixo 
listei os principais, porém a comunidade é muito grande e com isso podemos 
encontrar informações e soluções em vários sites e livros:
● 
https://www.python.org/
https://python.org.br/
https://pypi.org/
https://anaconda.org/anaconda/python
E para finalizar esse primeiro capítulo, apresento algumas empresas que usam 
python em seu projetos ou produtos.
5
2. Introdução ao Python
 
Um programa Python, executa instrução após instrução sendo a execução linear, 
gerando ao final um arquivo .py. Nos blocos de código, como nas condicionais que 
iremos estudar mais a frente, a indentação tem a função de delimitar esses blocos 
e organizá-los.
Imagem: Livro Python para desenvolvedores de Luiz Eduardo Borges, pag 24
Neste capítulo iremos iniciar nossa programação em Python conhecendo os 
Tipos de variáveis, como que se escreve na Tela do Computador, como recebe um 
dado do mundo externo, as formas de condicionais do programa e por fim uma 
introdução a bibliotecas.
a. Variáveis
O Python possui tipagem dinâmica, ou seja, você não precisa declarar o tipo 
de variável que está usando, basta escrever o valor que o Python identifica e irá 
atribuir corretamente. Os principais tipos internos de variáveis são números, 
sequências, mapas, classes, objetos e exceções, mas iremos focar primeiramente 
nos números (int e float), lógicos (bool) e sequências de texto (strings).
int: guarda números inteiros entre -2147483648 e 2147483647, utiliza 4 bytes
6
float: guarda números com ponto flutuante, frações ou seja números reais 
entre (aproximadamente) 10-38 e 1038, utiliza 6 bytes, precisão de 8 dígitos. 
Ao contrário dos números reais, os números representáveis pelo hardware são 
finitos. A maneira como os tipos de ponto flutuante são armazenados é abstrata 
para o programador, entretanto, o hardware segue o padrão IEEE 754 (Standard for 
Floating-Point Arithmetic).
boolean: variáveis que podem assumir apenas 2 estados, true (verdadeiro) ou 
false (falso);
String: Uma variável do tipo String pode ser iniciada ou inicializada de forma 
semelhante a uma variável de tipo primitivo além de poder ser iniciada através 
de construtores como será visto mais à frente. A iniciação é feita com literais do 
tipo String . Um literal do tipo String é uma seqüência de caracteres iniciada e 
terminada com aspas. 
O operador + também funciona com strings de uma maneira diferente dos 
números. Ele funciona concatenando strings, ou seja, juntando duas strings:
Imagem: site Caelum
O operador * também funciona com strings, multiplicando seu conteúdo por um 
inteiro. Vamos checar esse resultado:
Imagem: site Caelum
Segue na imagem abaixo um exemplo das variáveis estudadas:
O resultado será conforme imagem abaixo:
7
b. Entrada e Saída
Os comandos de entrada e saída no Python ou em qualquer outra linguagem 
de programação possuem o objetivo de comunicar o seu código com o mundo 
exterior, ou seja, o comando de entrada permite que o usuário envie dados do mundo 
exterior, como do teclado, sensores ou mouse, para uma variável do programa, 
aquela variável que definimos o tipo associada ao comando, e o comando de saída 
permite exibir, mostrar, imprimir, por exemplo na tela do computador, mensagens, 
expressões, gráficos, imagens e/ou valores armazenados em variáveis do 
programa.
O comando de Entrada permite receber o valor digitado no teclado, por exemplo, 
pelo usuário e atribuir esse valor a variável que foi associada ao comando. Comando 
(função) de entrada do python: input. Saiba que ele irá interromper a execução do 
programa para esperar que o usuário digite o valor solicitado no teclado, então 
cuidado no uso deste comando, pois elepode ser criado e nada informado ao 
usuário e com isso ele ficar sem saber o que fazer, logo é boa prática junto com o 
comando de input tenha um texto orientando o que o usuário deve fazer e ao final 
da digitação basta ser pressionada a tecla “Enter”. Após isso, o valor digitado será 
movido para variável associada ao input.
Forma Geral:
variável = input(‘Mensagem para o usuário’)
Exemplo:
nome = input(‘Digite o seu Nome Completo’)
Por padrão, o comando input move valores do tipo String para as variáveis 
associadas ao comando. Porém caso o usuário deseje digitar um número, deve 
ser usado o tipo de variável correspondente a variável para o python entender que 
não se trata de um texto e sim de um valor numérico.
Para receber um número inteiro escreva no seu código o nome da variável 
= int(input(‘Texto a ser mostrado ‘)), é essa composição da função input com 
8
a função int que garante que o resultado final armazenado na variável será um 
número inteiro.
Para receber um número real escreva no seu código o nome da variável = 
float(input(‘Texto a ser mostrado ‘)), neste caso o uso da função float garantirá 
que o resultado final que será armazenado na variável seja um número real.
O comando de saída nós já usamos aqui em nosso e-book para imprimir os 
tipos de variáveis, porém vamos oficializar a estrutura e teoria desta função no 
Python.
O comando print (função) permite exibir na tela do usuário mensagens, 
expressões e/ou valores armazenados em variáveis do programa, sua sintaxe é:
print(‘Mensagem para o usuário’, variável)
No exemplo abaixo o algoritmo recebe o ano de nascimento do usuário, o ano 
atual e imprime a idade, quer tentar fazer? Pois faça uma pausa nesta leitura, abra 
seu Pycharm (QUE JÁ ERA PRA ESTAR ABERTO!) e tente resolver essa atividade.
c. Condicional
Como seria bom se todo caminho em nossa vida fosse uma linha reta, não 
houvesse imprevistos, desvios ou tomadas de decisões, caminho único, objetivo 
único, vida perfeita não é? É, mas essa vida só existe em conto de fadas, e na 
programação é do mesmo jeito, a todo momento são impostas condições que 
devem ser analisadas, tratadas ou questionadas para o código tomar o caminho 
correto, essa situação é devido às estruturas condicionais, onde se divide em if/
else, while, for e switch/case, e vamos estudar cada uma delas.
9
IF/ELSE
 A condicional IF/ELSE é um teste onde SE a condição for verdadeira execute 
uma tarefa SENÃO executa outra tarefa:
Você observou que usamos o “==”? Esse simbolo ai é chamado de operador 
condicional, os Operadores Condicionais são utilizados para fazer as comparações 
dos valores que são passados e retornam o valor Verdadeiro ou Falso.
Imagem: Site Devmedia
Vamos fazer um exemplo para fixar: 
Ex. 01: “Faça um algoritmo que receba um número real e informe se ele é positivo, 
negativo ou nulo.”
10
Ex. 02: “Faça um algoritmo que obtém do usuário do usuário a sua idade e 
informa a qual faixa etária esse usuário pertence:
Criança menor igual a 12 anos
Adolescente maior de 12 e menor que 18 anos
Adulto entre 18 e 64 anos
Idoso maior de 64 anos
WHILE
A condicional do tipo laço de repetição é um recurso das linguagens de 
programação que é responsável por “rodar” um bloco de código repetidas vezes 
enquanto determinada condição passada for verdadeira, onde neste caso deste 
capítulo iremos estudar a condicional while.
O comando while repete um trecho do código enquanto uma condição é 
atendida. Quando o resultado dessa condição passa a ser falso, a execução do 
loop é interrompida. O uso do while poupa linhas de códigos, torna o programa 
mais legível e robusto podendo ser chamado de laço, loop ou loping, observe o 
exemplo abaixo:
11
Observe que o programa fica dentro do while enquanto a condição contador 
for menor que 10, e toda vez que passar pelo while ele vai imprimir um contador 
incrementado mais 1 unidade conforme mostra a figura abaixo.
FOR
A instrução for é um pouco diferente da while, também se trata de um laço 
em que o programa fica rodando até a condição de teste for falsa, porém ela se 
caracteriza pela obrigatoriedade em definir a quantidade de vezes [ciclos] que 
será executado, diferente do while que esse ciclo é definido dentro do laço, quando 
fizemos a instrução contador = contador +1. O Laço de Repetição for do Python se 
assemelha ao for each encontrado linguagens como o Java, PHP, C# e etc. 
12
Observe a seguir o esquema para o uso da instrução for:
A variável a ser declarada na primeira parte da estrutura, receberá, a cada ciclo, 
um elemento contido na lista que está sendo iterada. Ao término, todos elementos 
terão sido percorridos e, a cada ciclo, o elemento seguinte contido no objeto 
iterável terá sido passado pela variável definida inicialmente.
Observe o resultado impresso:
Exemplo 02, você pode percorrer uma string, pois uma string nada mais é do que 
uma lista de caracteres:
13
Exemplo 03, posso percorrer com o for uma lista de Strings:
Exemplo 04, podemos usar o método range:
Observe nos exemplo usando o range que o último elemento do incremento não 
é inclusivo.
14
SWITCH/CASE
 Cada linguagem usa uma sintaxe e abordagem própria para atacar problemas 
similares, no caso do Switch/Case, presente no PHP, Arduino, etc, usamos uma 
estrutura if/elif no Python.
O primeiro elif eu posso passar como parâmetro valores específicos, nesse caso 
o programa entraria nesta condição quando a variável num receber 1 ou 4.
d. Bibliotecas
import speech_recognition 
import pyttsx3
import serial
import threading
import time
Essas serão as bibliotecas que usaremos em nosso projeto que inicia no próximo 
capítulo, mas afinal, o que é uma biblioteca? O que é esse import?
15
É um conjunto de funções usado em uma linguagem de programação que foram 
pré-escritas por outro programador, para ser usado por outros desenvolvedores 
importando essas funções que irão resolver certos problemas sem que você 
precise reinventar um código. É basicamente funções que já existem no programa 
e que você pode usar.
A vantagem de criar bibliotecas para desenvolver programas é que seu programa 
será resolvido de uma forma mais simples. Mas como insiro esse outro programa 
em meu código? No python usamos o comando import.
import package
Para importar um módulo utilizamos o import.
import math
print(math.sqrt(25))
O código acima importará todos os módulos de math, para importar apenas o 
necessário utilizamos from.
from package import item
O código abaixo importará o módulo sqrt do pacote math.
from math import sqrt
print(sqrt(25))
Observe que ao utilizar from package import item, o item pode ser um subpacote, 
submódulo, classe, função ou variável.
Cada uma das cinco bibliotecas serão comentadas dentro de cada tópico 
quando fizer referência no nosso programa do Assistente Virtual, então, vamos 
fazer nosso amigo nascer, vamos iniciar a programar nosso assistente virtual.
3. Projeto Assistente Virtual
 
Chegamos ao objetivo principal deste ebook, aprender a criar um Assistente 
Virtual em Python, que além de um chatbot também tenha a função de ligar e 
desligar componentes conectados no meu Arduino no próximo capítulo.
Iremos, neste capítulo fazer o python falar, ouvir e por ultimo responder, mas 
antes, vamos alinhar aqui sobre o que é um assistente virtual.
a. O que é um Assistente Virtual
Um assistente virtual é um robô que pode estar instalado em seu computador, 
16
em uma caixa de som, no seu carro ou embarcado em uma placa como o Raspberry, 
ele tem a função de auxiliar em atividades como ligar eletrodomésticos, lembretes, 
leitura de livros e pesquisas na internet por exemplo. Alguns modelos comerciais 
temos a Siri, Cortana e o Jarvis, neste e-book iremos fazer um conceito e programar 
um assistente com comandos simples e sem inteligência Artificial.
A Cortana, por exemplo, é a assistente virtual da Microsoft. Ou seja, suas 
funções são parecidas com as da Siri, da Apple, ou do Google Assistente, do 
Google, ela possuiuma inteligência artificial aprendendo com os hábitos de 
utilização do usuário. Dessa forma, quanto mais você usa a assistente virtual, 
mais personalizadas ficam as respostas. Sem esquecer, claro, da possibilidade de 
usar comandos de voz em algumas ações.
Uma das vantagens da Cortana é que a assistente virtual pode ser usada em 
computadores e notebooks com Windows 10 e em smartphones Android e iOS, por 
meio do aplicativo. Dessa forma, todas as suas informações podem ser acessadas 
em diferentes dispositivos.
b. Fazendo o Python Falar
Nesta primeira programação de nosso Estudo de um Assistente Virtual com 
Python, gostaria de mostrar o pacote e a programação responsável por fazer o 
Python falar.
Um assistente virtual é um software que auxilia o humano em atividades 
rotineiras como alarme, buscar informações na rede de internet, controlar casas 
ou carros e até mesmo um bom bate papo.
E todo bom assistente tem que falar, por isso iremos ensinar como programar o 
Python para falar, bora lá?
17
Para quem está iniciando na linguagem de programação terá que ter um pouco 
mais de dedicação pois nesse projeto do assistente iremos considerar que você 
tem o mínimo de conhecimento, mas vamos sempre, na medida do possível 
explanar cada linha do código.
Da linha 1 até a 4, as aspas dupla (“) repetida por 3x (“””) garante que o que 
tiver escrito após as primeiras aspas, linha 1, e a última aspas, linha 4, será um 
comentario, ou seja, não faz parte do meu código, é apenas um texto ao qual deve 
me lembrar de algo importante referente a esse código.
Na linha 6 do meu programa eu importo o pacote pyttsx3, responsável por 
executar o áudio usando o próprio sistema operacional do Windows.
import pyttsx3
O pacote PYTTSX3 é uma biblioteca OFFLINE de texto em fala Python (TTS) que 
funciona tanto para python3 quanto para python2. Esta biblioteca é muito útil, 
especialmente se você não deseja nenhum atraso no discurso produzido e não 
deseja depender apenas da Internet para a conversão de TTS. Ele também suporta 
vários mecanismos TTS como Sapi5, nsss, espeak. 
Podemos baixá-la e instalar usando o comando: pip install pyttsx3 no CMD de 
seu computador, o link ao lado explica um pouco mais sobre o pacote e como 
baixá-lo.
E o que é esse TTS? TTS, que significa Text to Speech, nada mais é do que uma 
técnica de sintetização da fala humana, que converte texto em linguagem normal. 
Ou seja uma pesquisa sobre um conceito de tecnologia num evento de tecnologia. 
Muitos usam esse pacote mas poucos entendem o que realmente significa TTS, 
agora nós sabemos.
Para instalar em outro sistema operacional eu recomendo a leitura no site 
https://pyttsx.readthedocs.io/en/latest/install.html
Continuando o desmembramento de nosso código, na linha 7, o meu programa 
chama a função .init( ) do meu pacote pyttsx, pyttsx.init( ), para inicializar e obter 
uma referência para o meu pacote de texto que suporta até 2 vozes, uma do sexo 
feminino e outra do sexo masculino fornecido pelo SAPI5 no caso do Windows, 
no MAC OSx o mecanismo TTS é o nsss - NSSpeechSynthesizer e para qualquer 
outro sistema operacional o mecanismo usado será o speak - Speak . Ainda na 
mesma linha eu crio um novo objeto chamado engine. 
18
engine = pyttsx3.init()
A linha 9, ordena que o Python diga (say em inglês) o que está escrito em 
parênteses através do objeto engine que foi criado anteriormente e carrega toda 
a configuração para executar essa tarefa. Logo, tudo que você escrever entre 
parênteses usando o método .say irá ser dito em voz pelo seu computador, basta 
escrever a linha baixo no seu código.
engine.say(“Python com Arduíno!”)
A linha 10, através da função .runAndWait( ) , o seu Python irá pronunciar o texto 
que foi carregado no objeto engine na linha anterior, esse método é importante 
pois sua função consiste em duas ações básicas, a ordem de executar a pronúncia 
do texto e aguardar um tempo para garantir a execução completa.
engine.runAndWait()
Na última linha, a linha 11, é executado o comando de parar o processo de 
reprodução da fala, deixando assim o programa livre para as próximas ações 
necessárias.
engine.stop()
c. Fazendo o Python Ouvir
Na tópico passado, Fazendo o Python falar, aprendemos um programa que faz o 
nosso assistente virtual falar, agora vamos dar mais um passo em nosso projeto, 
vamos fazer o Python ouvir nossa voz e confirmar o que ouviu nos devolvendo 
um texto, usando a rede neural do Google você verá a precisão que ficará esse 
programa, e ai vamos lá?
Observe o código abaixo, é nele que iremos trabalhar neste tópico.
Abaixo temos mais uma vez nosso super Python, como pode perceber um código 
simples e intuitivo onde o resultado alcançado é surpreendente, com esse simples 
código seu Assistente Virtual começará a lhe ouvir, basta falar que ele identifica a 
fala, reduz o ruído do ambiente, envia o que ouviu para o Google (isso mesmo, para 
esse assistente funcionar você precisa de uma conexão com o Google, logo você 
precisa estar conectado na internet) e devolve para o meu programa um arquivo 
de texto que será usado para confirmarmos se realmente nosso programa ouviu o 
que falamos. Então vamos explorar o código linha a linha.
19
O reconhecimento de fala é o processo de conversão de palavras faladas em 
texto. O Python suporta muitos mecanismos de reconhecimento de voz e APIs, 
incluindo Google Speech Engine, Google Cloud Speech API, Microsoft Bing Voice 
Recognition e IBM Speech to Text. Neste programa, usaremos o Google pacote 
speech_recognition e este módulo depende do pyaudio para funcionar, logo vamos 
instalar esses dois pacotes através dos comandos conda install -c anaconda 
pyaudio e pip install SpeechRecognition no seu CMD, basta copiar e colar, porém 
caso queira pesquisar esse comando de instalação na internet, basta acessar os 
links ao lado para ter acesso a esses pacotes e outros mais.
Na linha 01, importamos o pacote de reconhecimento de fala e como ele é um 
nome grande, quando formos usá-lo como objeto ficaria um pouco trabalhoso 
ficar reescrevendo o nome “speech_recognition”, logo abreviamos esse nome para 
“sr”, assim fica mais fácil e prático a escrita do código.
import speech_recognition as sr
Na linha 03, o método “Recognizer” ativa a função de reconhecimento de fala e 
áudio e pega as configurações de seu computador para usá-la no reconhecimento. 
Observe que usamos o objeto “sr” para chamar o método e as informações 
adquiridas já atribuímos a um novo objeto que chamamos de “r”.
r = sr.Recognizer()
20
Na linha 05, o método “Microphone” também chamado pelo objeto “sr” tem a 
função de habilitar o microfone para ouvir o usuário do Assistente Virtual e já 
atribuímos a um novo objeto que chamamos de “mic”.
mic = sr.Microphone()
Na linha 07, já com o “mic em mãos”, dizemos para o Python praticamente assim 
com essa linha de comando: “Python use a sua configuração do microfone com a 
fonte, que seria sua voz captada”.
with mic as fonte:
Já na linha 08, eu chamo a função de redução de ruído através do objeto “r”, 
que trata do reconhecimento de fala disponível no pacote “speech_recognition” e 
aplico essa redução de ruído passando como parâmetro a minha “fonte”.
 r.adjust_for_ambient_noise(fonte)
Na linha 09 usamos a função print, ela permite que apareça na tela do usuário a 
informação que eu escrever ou chamar dentro dos parênteses, nesse caso, como já 
foi filtrado o ruído na linha de comando anterior, nós usamos o print para informar 
ao usuário que o programa está pronto para ouvi-lo.
print(“Fale alguma coisa”)
Na linha 10, a função “listen” coloca o reconhecimento em modo passivo e 
armazena a informação que ouviu na variável áudio.
 audio = r.listen(fonte)
Como o envio para o Google pode demorar alguns segundos, dependerá se 
sua internet e processamento de seu computador, na linha 11 eu notifico mais 
uma vez o usuário com a função print informando que o está sendo enviado para 
reconhecimento de áudio o que meu Assistenteouviu.
print(“Enviando para reconhecimento”)
A linha 13, é a chave de entrada para passar o áudio para o Google ou informar 
para o usuário que meu assistente não entendeu o que foi dito, logo o “try” é um 
teste onde se o programa estiver reconhecido um padrão de fala permitirá entrar 
nessa condicional e dar continuidade a conversa, caso contrário o programa pula 
para a linha 17 que habilita a entrada na linha 18 que estudaremos logo em seguida.
21
try:
Na linha 14, o áudio é enviado para o reconhecimento do Google através da 
função “recognize_google” sempre sendo chamado pelo objeto “r”, passando 
nessa função dois parâmetros: (o áudio salvo na linha 10, idioma), quando retornar 
do reconhecimento do Google a informação é salva na variável “text”.
text = r.recognize_google(audio, language = “pt-BR”)
Agora na linha 15 chegou a hora de confirmar o que meu Assistente virtual ouviu, 
pois a informação salva na variável “text” da linha anterior será impressa nessa 
linha usando o método “.format()”.
O método format() serve para criar uma string que contém campos entre 
chaves a serem substituídos pelos argumentos de format. Repare os campos de 
substituição na string (que é tudo que está entre aspas) estão associadas aos 
parâmetros de format onde se eu tivesse dentro da string 3 chaves o meu format 
passaria 3 parâmetros que respectivamente cada parâmetro corresponderia a 
uma chave.
print(“Você disse: { }”.format(text))
E o nosso programa encerra nas linhas 17 e 18 que ocorre quando o padrão de 
fala não é reconhecido.
Gostou desse código? Se interessou em aprender mais? Pois aguarde que a 
próxima postagem, no dia 28/11 iremos ensinar ao seu Python a repetir o que você 
fala.
except:
print(“Não entendi o que você disse”)
d. Chatbot com Python
Agora iremos dar um pouco de empatia para nosso sistema, que tal montar uma 
programação que ele me responda? Lógico que não será uma inteligência Artificial 
onde ele aprenda, mas poderemos montar uns if’s e marcar umas perguntas chave, 
ou palavras chaves onde quando o python detectar ele monte a resposta mais 
coerente, legal né?
Pois isso fica como atividade, aqui iremos mostrar como ele testa uma frase 
22
para neste caso enviar uma resposta, onde no próximo capítulo além da resposta 
ele irá atuar o nosso Arduino.
Observe o código abaixo, iremos detalhar o que ainda não conhecemos e explicar 
a lógica dos blocos escrito.
23
As importações dos pacotes e inicialização já é de nosso conhecimento dos 
tópicos passados, apenas estamos juntando 2 códigos em 1.
import speech_recognition as sr
import pyttsx3
engine = pyttsx3.init()
r = sr.Recognizer()
mic = sr.Microphone()
Para começar, definimos um ponto inicial para o Assistente começar a conversar 
conosco, que seria eu chamá-lo pelo nome Python, então, quando inicia o sistema 
aparece na tela do usuário a mensagem e o python também fala avisando que 
caso queira conversar basta chamá-lo pelo nome.
with mic as fonte:
 print(“Se quiser conversar me chame pelo meu nome: Python!”)
 engine.say(“If you want to talk, call me by my name: Python!”)
 engine.runAndWait()
 engine.stop()
 audio = r.listen(fonte)
 r.adjust_for_ambient_noise(fonte)
 print(“Enviando para reconhecimento”)
24
Após o usuário falar, o Python vai enviar o reconhecimento para o Google que irá 
devolver em forma de texto, se a comunicação for bem sucedida o programa entra 
no try e confere se o texto recebido do google é o nome “Python”, sendo verdadeiro 
o programa ficará neste loop enquanto esta variável “text” for verdadeira, porém 
o programa pergunta o nome de quem está falando para a partir deste ponto o 
nosso assistente saber quem é o usuário e tratá-lo pelo nome.
 try:
 text = r.recognize_google(audio, language = “pt-BR”)
 while text == “Python”:
 print(“Olá, qual o seu nome?”)
 engine.say(“Hello. Whats your name?”)
 engine.runAndWait()
 engine.stop()
 r.adjust_for_ambient_noise(fonte)
 audio = r.listen(fonte)
 print(“Enviando para reconhecimento”)
 try:
 text2 = r.recognize_google(audio, language = ”pt-BR”)
 engine.say(“Nice too meet you Teacher: { }”.format(text2))
 engine.runAndWait()
 engine.stop()
 print(“É um prazer conhecê-lo Professor: { }”.format(text2))
A partir daqui, o Assistente já sabe com quem está falando e está habilitado no 
modo conversa, logo usamos a mesma variável para ele permanecer neste while 
mais interno, pois caso contrário o programa voltaria a perguntar o nome. Neste 
bloco o sistema simplesmente aguarda uma frase, onde ele ouvindo poderá tomar 
várias possibilidades como respostas, é a partir daqui que um assistente será 
diferente do outro.
while text == “Python”:
 print(“Fale algo!”)
 text3 = r.recognize_google(audio, language = ”pt-BR”)
 r.adjust_for_ambient_noise(fonte)
 audio = r.listen(fonte)
 print(“Enviando para reconhecimento”)
 try:
 text3 = r.recognize_google(audio, language = ”pt-BR”)
Nesta próxima linha abaixo nós temos um comando novo, que é transformar 
qualquer texto recebido para letras minúsculas, isso é necessário pois o Python 
25
diferencia letras maiúsculas de minúsculas logo a palavra “Python” é diferente de 
“python”, sendo assim para evitar erros, todo o texto que for devolvido pelo google 
para o meu sistema será transformado para caixa baixa.
text3 = text3.lower()
Neste bloco IF tentamos fazer a primeira conversação, se a pessoa tiver falado 
a frase “como vai você” o python irá retornar uma resposta “Eu vou bem e você”, 
lembrando que em um programa mais avançado, não é legal “engessar” uma frase, 
o interessante é que o python tenha palavras chaves e tente adivinhar uma frase, 
pois se no lugar da pergunta “como vai você” fosse “como você está”? Tem o 
mesmo sentido porém com palavras diferentes, neste caso, poderíamos alimentar 
o python como palavras chaves “como”, “está”, “vai” e etc...assim ele buscaria 
essas palavras e faria uma associação delas e montaria um sentido.
if text3 == “como vai você”:
 engine.say(“I am fine, and you? { }”.format(text2))
 engine.runAndWait()
 engine.stop()
 print(“Eu vou bem, e você? { }”.format(text2))
 Porém, se a variável “text3”, que é a devolutiva do google, não coincidir com 
“como vai você”, o else será acessado e o python irá repetir o que foi falado e 
complementar com o nome do usuário que já foi armazenado em text2 na primeira 
pergunta no inicío do programa, esse bloco é bom para saudações como “bom 
dia”, “boa tarde”, “boa noite”, onde o Assistente irá responder, “bom dia, Sandro” 
por exemplo.
else:
 engine.say(text3 + “ “ + text2)
 engine.runAndWait()
 engine.stop()
 print(text3 + “ “ + text2)
O except é uma estrutura específica para tratamento de exceções que Python 
usa para lhe indicar que algo anormal aconteceu durante a execução do seu código. 
Ou seja, se algo de errado acontecer na execução do try, o seu código chama o 
except para tratar essa exceção, que no nosso caso é informar para o usuário que 
o pacote de reconhecimento de voz não entendeu o que foi dito.
 except:
 engine.say(“Sorry, I didn’t understand what you said.”)
26
 engine.runAndWait()
 engine.stop()
 print(“Desculpe, não entendi o que você disse.”)
 except:
 engine.say(“Sorry, I didn’t understand what you said.”)
 engine.runAndWait()
 engine.stop()
 print(“Desculpe, não entendi o que você disse.”)
except:
 engine.say(“My name is not { }, sorry but we can’t talk”.format(text))
 engine.runAndWait()
 engine.stop()
print(“Meu nome não é { }, desculpe mas não podemos conversar”.format(text))
Pronto, se até aqui rodou tudo bem, você está preparado para avançar e agora o 
Python falar com o Arduino, lembra do nosso primeiro ebook? Radar Ultrassônicocom Processing. Pois sim, será semelhante a relação do computador, nesse caso 
o Python e o nosso Arduino, pois vamos lá, vencer mais esse capítulo.
4. Arduino ouvindo o Python
 
O programa apresentado na figura 31 é o código que será carregado no Arduino 
para receber os comando do Python, observe ele que iremos tratá-lo e explicá-lo 
nas próximas linhas deste ebook.
27
Para ficar mais fácil você entender vamos detalhar esse código, lembrando que 
iremos tratá-lo considerando que você já programa em Arduino e domina Lógica 
de programação.
Cria uma variável inputString e declara como tipo String para armazenar dados 
recebidos pelo Python.
String inputString = “”; 
 
Cria uma variável stringComplete e declara como tipo bool para verificar se 
o estado da palavra recebida esta completa, ou seja, se já recebeu toda a frase 
enviada pelo Python.
bool stringComplete = false; 
Setup do Código
void setup() {
 
Inicializa a comunicação serial com uma taxa de transmissão de 115.200 
baunds.
 Serial.begin(115200);
 
Função que reserva 200 bytes para a variável que o Arduino vai receber
 inputString.reserve(200);
 
Define o pino 13 do Arduino como Saída
 pinMode(LED_BUILTIN, OUTPUT);
 }
Bloco loop de programação do código
 void loop() {
Verifica se chegou uma nova linha de texto
 if (stringComplete) {
Imprime a mensagem que o Assistente Virtual está falando
 Serial.print(“Assistente Virtual Arduino Falando: “);
Imprime o texto recebido
 Serial.print(inputString);
Se o texto recebido iniciar com a palavra “ligar”
28
 if(inputString.startsWith(“ligar”)){
Liga o LED
 digitalWrite(LED_BUILTIN, HIGH);
 }
Se o texto recebido iniciar com a palavra “desligar”
if(inputString.startsWith(“desligar”)){
Desliga o LED
 digitalWrite(LED_BUILTIN, LOW);// toggle
 }
Limpa a String
 inputString = “”;
 stringComplete = false;
 }
}
SerialEvent ocorre sempre que novos dados chegam no RX serial do hardware.
A rotina é executada entre cada vez que o loop () é executado, portanto, o atraso 
no loop pode gerar um atraso na resposta. Vários bytes de dados podem estar 
disponíveis.
void serialEvent() {
Verifica se teve uma interação com a comunicação serial e obtem o número 
de bytes (caracteres) disponíveis para leitura na porta serial. São dados que já 
chegaram e são armazenados no buffer de recebimento serial (que contém 64 
bytes).
 while (Serial.available()) {
Obtém o novo byte (que no caso é uma letra) e salva na variável inChar
 char inChar = (char)Serial.read();
 
Soma mais um na posição da String que está sendo formada
 inputString += inChar;
Se o caractere recebido for uma nova linha, define um sinalizador para que o 
loop principal possa continuar na próxima atividade
29
 if (inChar == ‘\n’) {
 stringComplete = true;
 }
 }
}
Pronto, agora que nosso Arduino está preparado para ouvir o Python, vamos 
escrever um código exemplo no Python para enviar mensagens para o Arduino e 
fazê-lo piscar o LED.
30
Importa o pacote serial para estabelecer a comunicação entre a porta USB do 
computador e a comunicação serial do Arduino
import serial
O pacote threading é importado pois precisamos trabalhar com os threads em 
Python que são fluxos de programas que executam em paralelo dentro de uma 
aplicação, isto é, uma ramificação de uma parte da aplicação que é executada de 
forma independente e escalonada independentemente do fluxo inicial da aplicação.
import threading
O time é necessário para trabalharmos com a gestão de tempo dentro do 
programa.
import time
conectado = False
Nesta linha de programação escrevemos entre aspas simples a porta COM que 
seu computador reconheceu o Arduino, então volte na IDE do Arduino e identifique 
qual a porta que está selecionada.
porta = ‘COM7’ # linux ou mac em geral -> ‘/dev/ttyS0’
Para comunicação com um computador use uma destas taxas: 300, 1200, 2400, 
4800, 9600, 14400, 19200, 28800, 57600, 115200. Logo optamos por usar a maior 
taxa de transmissão ofertada, assim a comunicação ficaria mais eficiente e rápida, 
31
lembrando que o valor que for setado aqui no Python deverá ser igual no Arduino.
velocidadeBaud = 115200
mensagensRecebidas = 1;
desligarArduinoThread = False
try:
A função “serial.Serial” exige 3 parâmetros que são: A porta COMO que será 
realizada a comunicação serial, a taxa de transmissão e o tempo de espera para 
tentar nova conexão, o timeout=1, ele serve para no caso de tentarmos conectar 
e o dispositivo não responder, o programa vai ficar ocioso aguardando, de forma 
blocante, como usamos timeout=0.2 tem-se um tempo de 0.2s para a conexão 
responder.
 SerialArduino = serial.Serial(porta, velocidadeBaud, timeout=0.2)
except:
 print(“Verificar porta serial ou religar arduino”)
O “def” é a chamada para uma nova função criada no programa Python, uma 
função é uma sequência de comandos que executa alguma tarefa e que tem um 
nome. A sua principal finalidade é nos ajudar a organizar programas em pedaços 
que correspondam a como imaginamos uma solução do problema.
Neste caso essa função tem como objetivo manipular os dados que estão sendo 
recebidas do Arduino
def handle_data(data):
Em Python, as variáveis definidas ficam acessíveis às funções declaradas dentro 
de um mesmo escopo, ou seja, a variável que você declara só é reconhecida dentro 
do bloco declarado, mas há a possibilidade de declararmos globalmente, ou seja, 
onde irá valer para todo o programa, global e “meio global” — no caso algo mais 
específico da versão 3.x do Python.
 global mensagensRecebidas
 print(“Recebi “ + str(mensagensRecebidas) + “: “ + data)
 mensagensRecebidas += 1
Esta função tem o objetivo de ler os dados recebidos na porta serial.
32
def read_from_port(ser):
 global conectado, desligarArduinoThread
Quando usamos a sintaxe “while conectado:” eu estaria criando um laço de 
repetição onde enquanto a variável conectado for “true”, ou seja, verdadeira o 
programa iria continuar nesse bloco, porém se você voltar um pouco neste e-book 
irá observar que iniciamos o conectado com “false”, logo este é o motivo de incluir 
o “not” neste teste, assim a lógica ficou enquanto não conectado entre neste bloco, 
logo entraria na primeira passagem por ele.
 while not conectado:
Porém ao entrar no bloco, o primeiro comando é alterar a variável conectado 
para “True”, assim quando retornasse para o teste while acima o programa não 
entraria mais.
 conectado = True
Neste bloco criou-se um loop infinito, até que o break seja executado
 while True:
Este comando ler a linha recebida na comunicação serial, decodifica e carrega 
em uma variável reading.
 reading = ser.readline().decode()
Se a variável não estiver carregada com o uma string vazia ele entra neste bloco 
e chama a função “handle_data” já estudada acima e executa os comandos lá.
 if reading != “”:
 handle_data(reading)
Se a variável “desligarArduinoThread” for verdadeira, mais na frente iremos 
ver quando esta variável vira verdadeira, este bloco é executa e o break realizado 
fazendo com que saia do while e pare o programa.
 if desligarArduinoThread:
 print(“Desligando Arduino”)
 break
Parece estranho, mas essa linha é executada antes dos blocos anteriores, essa 
33
é uma das características em trabalhar com funções, o seu código não é linear, ele 
executa os blocos de acordo com as solicitações.
Basicamente essa linha é a que manda o Python ler a porta serial em paralelo 
pelo pacote threading, funciona assim: é invocado o método Thread da biblioteca 
threading onde esse método leva dois parâmetros, que são necessários para a 
execução de sua atividade, esse parâmetros estão dentro dos parênteses e são 
o target que traduzindo é alvo, e o args que é o argumento. Ou seja, ele executa 
a leitura da porta serial e escrita dentro da função read_from_port levando para 
lá as configurações da comunicaçãoserial com a variável SerialArduino que foi 
configurada no início do programa.
lerSerialThread = threading.Thread(target=read_from_port, 
args=(SerialArduino,))
Inicia o objeto lerSerialThread criado na linha anterior
lerSerialThread.start()
print(“Preparando Arduino”)
time.sleep(2)
print(“Arduino Pronto”)
Cria-se aqui um laço infinito, onde enquanto for verdadeiro o programa irá ficar 
executando este bloco ligando e desligando o led, onde somente quando houver 
algum erro, o programa será direcionado para o except e irá sair do loop com o 
break.
while (True):
 try:
 print(“Enviando”)
 SerialArduino.write(‘ligar luzes\n’.encode())
 time.sleep(2)
 print(“Enviando”)
 SerialArduino.write(‘desligar luzes\n’.encode())
 time.sleep(2)
 except KeyboardInterrupt:
 print(“Apertou Ctrl+C”)
 desligarArduinoThread = True
 SerialArduino.close()
 lerSerialThread.join()
 break
34
5. Projeto Completo
Agora que você já conhece todos os recursos necessários para criar um 
assistente virtual básico usando o python para controlar um LED conectado no 
Arduino, vamos juntar os conhecimentos e construir um código só, porém usando 
uma lógica que o assistente só inicia quando chamado pelo nome e fica sempre 
a disposição para um novo comando até que ele escute a palavra “dispensado” 
onde será automaticamente desconectado e encerrado a programação.
import speech_recognition as sr
import pyttsx3
import serial
import threading
import time
conectado = False
porta = ‘COM7’ # linux ou mac em geral -> ‘/dev/ttyS0’
velocidadeBaud = 115200
mensagensRecebidas = 1;
desligarArduinoThread = False
try:
 SerialArduino = serial.Serial(porta, velocidadeBaud, timeout=0.2)
except:
 print(“Verificar porta serial ou religar arduino”)
def handle_data(data):
 global mensagensRecebidas
 print(“Recebi “ + str(mensagensRecebidas) + “: “ + data)
 mensagensRecebidas += 1
def read_from_port(ser):
 global conectado, desligarArduinoThread
 while not conectado:
 conectado = True
 while True:
 reading = ser.readline().decode()
35
 if reading != “ ”:
 handle_data(reading)
 if desligarArduinoThread:
 print(“Desligando Arduino”)
 break
lerSerialThread = threading.Thread(target=read_from_port, 
args=(SerialArduino,))
lerSerialThread.start()
print(“Preparando Arduino”)
time.sleep(2)
print(“Arduino Pronto”)
engine = pyttsx3.init()
r = sr.Recognizer()
mic = sr.Microphone()
with mic as fonte:
 r.adjust_for_ambient_noise(fonte)
 print(“Para me ativar, me chame pelo meu nome.”)
 engine.say(“To activate me, call me by my name.”)
 engine.runAndWait()
 engine.stop()
 audio = r.listen(fonte)
 print(“Enviando para reconhecimento”)
 try:
 text = r.recognize_google(audio, language= “pt-BR”)
 while (text == ‘Arduino’):
 r.adjust_for_ambient_noise(fonte)
 engine.say(“Hello teacher, what do you want?”)
 engine.runAndWait()
 engine.stop()
 print(“Olá professor, o que posso ajudar?”)
 audio = r.listen(fonte)
 print(“Enviando para reconhecimento”)
 try:
 text2 = r.recognize_google(audio, language=”pt-BR”)
36
 engine.say(“You said:: { }”.format(text2))
 engine.runAndWait()
 engine.stop()
 print(“You said:: { }”.format(text2))
 if (text2 == “Ligar LED”):
 print(“Enviando”)
 SerialArduino.write(‘ligar led\n’.encode())
 time.sleep(2)
 elif (text2 == “desligar led”):
 print(“Enviando”)
 SerialArduino.write(‘desligar led\n’.encode())
 time.sleep(2)
 elif (text2 == “dispensado”):
 text = text2
 engine.say(“Okay, I’m leaving.. Good Bye.”)
 engine.runAndWait()
 engine.stop()
 print(“Ok, irei embora. Adeus.”)
 print(“”)
 except:
 engine.say(“Did not understand, what you said.”)
 engine.runAndWait()
 engine.stop()
 print(“Não entendi o que você disse.”)
 print(“ ”)
 except:
 engine.say(“Okay, so you don’t want to talk to me. Good Bye.”)
 engine.runAndWait()
 engine.stop()
 print(“Ok, então você não quer falar comigo. Adeus.”)
Tudo que foi ensinado está neste código acima, logo te convido a comentar aqui 
abaixo a lógica de programação deste assistente e a descrição de cada função 
apresentada.
________________________________________________________________________________
_______________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
37
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
_______________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
________________________________________________________________________________
38
 6. Conclusão
 
Concluímos mais um projeto na Pixels |Escola e integramos o Arduino 
com mais um software diferente, todo o código apresentado neste ebook está 
disponível no github Sandro Mesquita ( https://github.com/Sandromesquita/
pythoncomarduino ), as vídeos aulas estão disponíveis no Youtube Sandro 
Mesquita no modo privado, logo o acesso é exclusivo pelo link: https://www.
youtube.com/playlist?list=PLAlxexaObetk7RF0RYWSlBQ6417zJGQks e dúvidas, 
correções ou criticas recebemos pelo email contato@profsandromesquita.com.
Espero ter alcançado vossas expectativas e nos encontramos no próximo ebook, 
envie sugestão a escola, o que você quer aprender?
39
Bibliografia
PYTHON PACKAGE INDEX. PyPi: suporte python, c2020. Página inicial. Disponível 
em: <https://pypi.org/>. Acesso em: 15 de jul. de 2020.
CONDA PACKAGE. Conda: suporte python, c2020. Página inicial. Disponível em: 
<https://docs.conda.io/en/latest/>. Acesso em: 16 de jul. de 2020.
PYTHON BRASIL. Comunidade Python Brasil, c2020. Página inicial. Disponível 
em: <https://python.org.br/>. Acesso em: 17 de jul. de 2020.
W3SCHOOLS. w3schools.com, c2020. Página inicial. Disponível em: <https://
www.w3schools.com/python/python_strings.asp>. Acesso em: 18 de jul. de 2020.

Outros materiais