-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain2.py
More file actions
97 lines (81 loc) · 3.35 KB
/
Copy pathmain2.py
File metadata and controls
97 lines (81 loc) · 3.35 KB
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
import threading
import time
import logging
from src.core.porcupine_listener import PorcupineListener
from src.core.recognizer import Recognizer
from src.core.tts import HybridTTS
from src.core.skill_manager import SkillManager
from src.core.executor import Executor
from src.core.config import get_settings
logger = logging.getLogger("Jarvis")
class JarvisAssistant:
def __init__(self):
settings = get_settings()
self.config = settings.config
self.dataset = settings.dataset
self.recognizer = Recognizer(self.config)
self.tts = HybridTTS(self.config)
self.skills = SkillManager(context={
"config": self.config,
"dataset": self.dataset,
"tts": self.tts
})
self.executor = Executor(self.dataset, self.skills, config=self.config)
self.porcupine = PorcupineListener(keyword="jarvis", sensitivity=0.7)
self.active = False
self.last_heard = 0
self.active_timeout = 20 # 20 сек бездействия
self.listening_thread = threading.Thread(target=self.passive_listen, daemon=True)
def say(self, text):
"""Говорим, но не блокируем микрофон"""
threading.Thread(target=lambda: self.tts.speak(text, "ru"), daemon=True).start()
def passive_listen(self):
"""Фоновое прослушивание wake word"""
while True:
if self.porcupine.listen():
self.activate()
def activate(self):
"""Активируем ассистента после wake word"""
if self.active:
return
self.active = True
self.last_heard = time.time()
self.say("Да, сэр!")
logger.info("🎤 Активирован Jarvis")
threading.Thread(target=self.active_listen, daemon=True).start()
def active_listen(self):
"""Активное слушание команд после активации"""
while self.active:
if time.time() - self.last_heard > self.active_timeout:
logger.info("😴 Время активности истекло, Jarvis засыпает.")
self.active = False
break
text_result = self.recognizer.listen_text()
if not text_result:
continue
text, lang = text_result
text = text.strip()
logger.info(f"🧠 Распознано: {text}")
self.last_heard = time.time() # обновляем таймер при каждой фразе
response = self.executor.handle(text.lower(), lang=lang)
if response:
self.say(response)
else:
self.say("Не понял, повторите, сэр.")
def run(self):
self.listening_thread.start()
logger.info("🤖 Jarvis слушает wake word (Porcupine активен).")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
logger.info("🛑 Завершение работы Jarvis.")
self.porcupine.stop()
if __name__ == "__main__":
logging.basicConfig(
level=logging.INFO,
format="[%(asctime)s] [%(levelname)s] %(message)s",
datefmt="%H:%M:%S"
)
jarvis = JarvisAssistant()
jarvis.run()