-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNewton.py
184 lines (149 loc) · 5.1 KB
/
Newton.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
import speech_recognition as sr
import pyttsx3
import webbrowser
from googlesearch import search
from bs4 import BeautifulSoup
import requests
import nltk
from nltk import word_tokenize, corpus
from crase import *
from aonde import *
from viagem import *
from conserto import *
from incerto import *
from aspas import *
import json
nltk.download('stopwords')
nltk.download('punk')
IDIOMA_CORPUS = "portuguese"
IDIOMA_FALA = "pt-BR"
CAMINHO_CONFIGURACAO = "config.json"
ATUADORES = [
{
"nome": "crase",
"iniciar": pesquisar_crase,
"parametro_de_atuacao": None,
"atuar": quando_usar_crase,
},
{
"nome": "aonde",
"iniciar": pesquisar_aonde,
"parametro_de_atuacao": None,
"atuar": quando_usar_aonde,
},
{
"nome": "viagem",
"iniciar": pesquisar_viagem,
"parametro_de_atuacao": None,
"atuar": quando_usar_viagem,
},
{
"nome": "conserto",
"iniciar": pesquisar_conserto,
"parametro_de_atuacao": None,
"atuar": quando_usar_conserto,
},
{
"nome": "incerto",
"iniciar": pesquisar_incerto,
"parametro_de_atuacao": None,
"atuar": quando_usar_incerto,
},
{
"nome": "aspas",
"iniciar": pesquisar_aspas,
"parametro_de_atuacao": None,
"atuar": quando_usar_aspas,
}
]
def iniciar():
iniciado = False
reconhecedor = sr.Recognizer()
palavras_de_parada = None # define como None
try:
palavras_de_parada = set(corpus.stopwords.words(IDIOMA_CORPUS))
with open(CAMINHO_CONFIGURACAO, "r") as arquivo_de_configuracao:
configuracao = json.load(arquivo_de_configuracao)
nome_do_assistente = configuracao["nome"]
acoes = configuracao["acoes"]
arquivo_de_configuracao.close()
iniciado = True
except:
# processar os erros do assistente (log? recuperação de falha?)
...
raise Exception("Erro ao carregar palavras de parada")
for atuador in ATUADORES:
parametro_de_atuacao = atuador["iniciar"]()
atuador["parametro_de_atuacao"] = parametro_de_atuacao
# Verifica se palavras_de_parada foi definida com sucesso
if palavras_de_parada is None:
raise Exception("Erro ao carregar palavras de parada")
return iniciado, reconhecedor, palavras_de_parada, nome_do_assistente, acoes
def escutar_fala(reconhecedor):
tem_fala = False
with sr.Microphone() as fonte_de_audio:
reconhecedor.adjust_for_ambient_noise(fonte_de_audio)
print("fale alguma coisa")
try:
fala = reconhecedor.listen(fonte_de_audio, timeout = 4)
tem_fala = True
except:
# processar os erros de captura de fala
...
return tem_fala, fala
def processar_audio_da_fala(audio_da_fala, reconhecedor):
tem_fala = False
with sr.AudioFile(audio_da_fala) as fonte_audio:
fala = reconhecedor.listen(fonte_audio)
tem_fala = True
return tem_fala, fala
def transcrever_fala(fala, reconhecedor):
tem_transcricao = False
try:
transcricao = reconhecedor.recognize_google(fala, language=IDIOMA_FALA)
tem_transcricao = True
except:
# processar os erros de transcricao
...
return tem_transcricao, transcricao.lower()
def tokenizar_transcricao(transcricao):
return word_tokenize(transcricao)
def eliminar_palavras_de_parada(tokens, palavras_de_parada):
tokens_filtrados = []
for token in tokens:
if token not in palavras_de_parada:
tokens_filtrados.append(token)
return tokens_filtrados
def validar_comando(tokens, nome_do_assistente, acoes):
valido, acao, objeto = False, None, None
if len(tokens) >= 3:
if nome_do_assistente == tokens[0]:
acao = tokens[1]
objeto = tokens[2]
for acao_cadastrada in acoes:
if acao == acao_cadastrada["nome"]:
if objeto in acao_cadastrada["objetos"]:
valido = True
break
return valido, acao, objeto
def executar_comando(acao, objeto):
for atuador in ATUADORES:
parametro_de_atuacao = atuador["parametro_de_atuacao"]
atuou = atuador["atuar"](acao, objeto, parametro_de_atuacao)
if atuou:
break
if __name__ == "__main__":
iniciado, reconhecedor, palavras_de_parada, nome_do_assistente, acoes = iniciar()
if iniciado:
while True:
tem_fala, fala = escutar_fala(reconhecedor)
if tem_fala:
tem_transcricao, transcricao = transcrever_fala(fala, reconhecedor)
if tem_transcricao:
tokens = tokenizar_transcricao(transcricao)
tokens = eliminar_palavras_de_parada(tokens, palavras_de_parada)
valido, acao, objeto = validar_comando(tokens, nome_do_assistente, acoes)
if valido:
executar_comando(acao, objeto)
else:
print("comando inválido, por favor tente novamente")