Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4a0155413e | |||
| 6a6efe8dd6 | |||
| 08b6f95a67 | |||
| d2b60b53c4 | |||
| a7abfe44b4 | |||
| 3fb31e60ea | |||
| c03811cb87 |
+2
-2
@@ -6,8 +6,8 @@ __pycache__/
|
|||||||
*$py.class
|
*$py.class
|
||||||
|
|
||||||
# Custom
|
# Custom
|
||||||
data/model_small/
|
model_small/
|
||||||
data/model_large/
|
model_large/
|
||||||
|
|
||||||
# C extensions
|
# C extensions
|
||||||
*.so
|
*.so
|
||||||
|
|||||||
@@ -10,24 +10,21 @@ import yaml
|
|||||||
from fuzzywuzzy import fuzz
|
from fuzzywuzzy import fuzz
|
||||||
from pvrecorder import PvRecorder
|
from pvrecorder import PvRecorder
|
||||||
|
|
||||||
from data import config
|
import config
|
||||||
from modules.HomeAssistant import HomeAssistant
|
from utils import execute_cmd, play
|
||||||
from utils import download_models, execute_cmd, play
|
|
||||||
|
|
||||||
|
|
||||||
class Jarvis:
|
class Jarvis:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
download_models.install_vosk_model()
|
|
||||||
self.recorder = None
|
self.recorder = None
|
||||||
self.CDIR = os.getcwd()
|
self.CDIR = os.getcwd()
|
||||||
self.VA_CMD_LIST = yaml.safe_load(open('data/commands.yaml', encoding='utf8'))
|
self.VA_CMD_LIST = yaml.safe_load(open('commands.yaml', encoding='utf8'))
|
||||||
self.home_assistant = HomeAssistant()
|
|
||||||
self.porcupine = pvporcupine.create(
|
self.porcupine = pvporcupine.create(
|
||||||
access_key=config.PICOVOICE_TOKEN,
|
access_key=config.PICOVOICE_TOKEN,
|
||||||
keywords=['jarvis'],
|
keywords=['jarvis'],
|
||||||
sensitivities=[1]
|
sensitivities=[1]
|
||||||
)
|
)
|
||||||
self.kaldi_rec = vosk.KaldiRecognizer(vosk.Model("data/model_small"), 16000)
|
self.kaldi_rec = vosk.KaldiRecognizer(vosk.Model("model_large"), 16000)
|
||||||
|
|
||||||
def main(self):
|
def main(self):
|
||||||
self.recorder = PvRecorder(
|
self.recorder = PvRecorder(
|
||||||
@@ -73,7 +70,6 @@ class Jarvis:
|
|||||||
if vrt > rc['percent']:
|
if vrt > rc['percent']:
|
||||||
rc['cmd'] = c
|
rc['cmd'] = c
|
||||||
rc['percent'] = vrt
|
rc['percent'] = vrt
|
||||||
rc['recognized_phrase'] = x
|
|
||||||
if len(rc['cmd'].strip()) <= 0:
|
if len(rc['cmd'].strip()) <= 0:
|
||||||
return False
|
return False
|
||||||
elif rc['percent'] < 70 or rc['cmd'] not in self.VA_CMD_LIST.keys():
|
elif rc['percent'] < 70 or rc['cmd'] not in self.VA_CMD_LIST.keys():
|
||||||
@@ -81,7 +77,7 @@ class Jarvis:
|
|||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
execute_cmd.execute_cmd(self, rc['cmd'], rc['recognized_phrase'], voice)
|
execute_cmd.execute_cmd(self, rc['cmd'])
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def play(self, phrase, wait_done=True):
|
def play(self, phrase, wait_done=True):
|
||||||
@@ -72,7 +72,3 @@ weather:
|
|||||||
- возможен дождь сегодня?
|
- возможен дождь сегодня?
|
||||||
- прогноз погоды на сегодня
|
- прогноз погоды на сегодня
|
||||||
- погода
|
- погода
|
||||||
home_assistant:
|
|
||||||
- включи телевизор
|
|
||||||
- выключи телевизор
|
|
||||||
- начни уборку
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
VA_ALIAS = ('джарвис',)
|
||||||
|
VA_TBR = ('скажи', 'покажи', 'ответь', 'произнеси', 'расскажи', 'сколько', 'слушай')
|
||||||
|
MICROPHONE_INDEX = -1
|
||||||
|
PICOVOICE_TOKEN = "4xbwaZwZmSHeTiowFl5Rgqsc8CR4FKGV8YueJUlR4Zt2e1kB64IDcA=="
|
||||||
|
OPENAI_TOKEN = "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"
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
VA_ALIAS = ("джарвис",)
|
|
||||||
VA_TBR = ("скажи", "покажи", "ответь", "произнеси", "расскажи", "сколько", "слушай")
|
|
||||||
MODEL_NAME = "vosk-model-small-ru-0.22" # vosk-model-ru-0.42
|
|
||||||
MICROPHONE_INDEX = -1
|
|
||||||
PICOVOICE_TOKEN = "4xbwaZwZmSHeTiowFl5Rgqsc8CR4FKGV8YueJUlR4Zt2e1kB64IDcA=="
|
|
||||||
|
|
||||||
|
|
||||||
# home assistant
|
|
||||||
HOME_ASSISTANT_URL = "http://192.168.0.112:9999/api"
|
|
||||||
HOME_ASSISTANT_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI5NjczNDZjYjc2YzI0YWQzODdhMmUwMmM2MjViZGVjZCIsImlhdCI6MTcxNDQ3MzkzNywiZXhwIjoyMDI5ODMzOTM3fQ.TATpIMXivJOioCtUI8PKg6gyTQYMG6bur6enm6NxjtY"
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
from modules.Jarvis import Jarvis
|
from Jarvis import Jarvis
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
import requests
|
|
||||||
|
|
||||||
from data import config
|
|
||||||
|
|
||||||
|
|
||||||
class HomeAssistant:
|
|
||||||
def __init__(self):
|
|
||||||
self.url = "http://192.168.0.112:9999/api"
|
|
||||||
self.token = config.HOME_ASSISTANT_TOKEN
|
|
||||||
|
|
||||||
def get_info(self, state):
|
|
||||||
response = requests.get(
|
|
||||||
url=f"{self.url}/states",
|
|
||||||
headers={
|
|
||||||
"Authorization": "Bearer " + self.token
|
|
||||||
}
|
|
||||||
)
|
|
||||||
return response
|
|
||||||
|
|
||||||
def send_process(self, command="выключи телевизор"):
|
|
||||||
response = requests.post(
|
|
||||||
url=f"{self.url}/services/conversation/process",
|
|
||||||
json={"text": command},
|
|
||||||
headers={
|
|
||||||
"Authorization": "Bearer " + self.token,
|
|
||||||
"content-type": "application/json"
|
|
||||||
},
|
|
||||||
)
|
|
||||||
if response.status_code == 200:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
from modules.HomeAssistant import HomeAssistant
|
|
||||||
|
|
||||||
home_assistant = HomeAssistant()
|
|
||||||
response = home_assistant.get_info("")
|
|
||||||
print(response.text)
|
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from data import config
|
|
||||||
|
|
||||||
|
|
||||||
def install_vosk_model():
|
|
||||||
try:
|
|
||||||
open('data/model_small/README')
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
if sys.platform == "linux" or sys.platform == "linux2":
|
|
||||||
os.system(f"wget https://alphacephei.com/vosk/models/{config.MODEL_NAME}.zip")
|
|
||||||
os.system(f"unzip {config.MODEL_NAME}.zip")
|
|
||||||
os.system(f"mv {config.MODEL_NAME} data/model_small")
|
|
||||||
os.system(f"rm -rf {config.MODEL_NAME}.zip")
|
|
||||||
elif sys.platform == "darwin":
|
|
||||||
os.system(f"curl https://alphacephei.com/vosk/models/{config.MODEL_NAME}.zip")
|
|
||||||
os.system(f"unzip {config.MODEL_NAME}.zip")
|
|
||||||
os.system(f"mv {config.MODEL_NAME} data/model_small")
|
|
||||||
os.system(f"rm -rf {config.MODEL_NAME}.zip")
|
|
||||||
elif sys.platform == "win32":
|
|
||||||
os.system(f"curl https://alphacephei.com/vosk/models/{config.MODEL_NAME}.zip --output 1.zip")
|
|
||||||
os.system('powershell -command "Expand-Archive 1.zip ./"')
|
|
||||||
os.system(f"rename {config.MODEL_NAME} data/model_small")
|
|
||||||
os.system("del /s /q 1.zip")
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
def execute_cmd(self, cmd: str, recognized_phrase: str, voice: str):
|
def execute_cmd(self, cmd: str):
|
||||||
if cmd == 'thanks':
|
if cmd == 'thanks':
|
||||||
self.play("thanks")
|
self.play("thanks")
|
||||||
elif cmd == 'stupid':
|
elif cmd == 'stupid':
|
||||||
@@ -7,5 +7,3 @@ def execute_cmd(self, cmd: str, recognized_phrase: str, voice: str):
|
|||||||
self.play("off", True)
|
self.play("off", True)
|
||||||
self.porcupine.delete()
|
self.porcupine.delete()
|
||||||
exit(0)
|
exit(0)
|
||||||
elif cmd == 'home_assistant':
|
|
||||||
self.home_assistant.send_process(recognized_phrase)
|
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ def play(self, phrase, wait_done=True):
|
|||||||
if wait_done:
|
if wait_done:
|
||||||
self.recorder.stop()
|
self.recorder.stop()
|
||||||
if filename:
|
if filename:
|
||||||
wave_obj = sa.WaveObject.from_wave_file(f"{self.CDIR}/data/sound/{filename}")
|
wave_obj = sa.WaveObject.from_wave_file(f"{self.CDIR}/sound/{filename}")
|
||||||
play_obj = wave_obj.play()
|
play_obj = wave_obj.play()
|
||||||
if wait_done:
|
if wait_done:
|
||||||
play_obj.wait_done()
|
play_obj.wait_done()
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
import time
|
|
||||||
|
|
||||||
import sounddevice as sd
|
|
||||||
import torch
|
|
||||||
|
|
||||||
language = 'ru'
|
|
||||||
model_id = 'ru_v3'
|
|
||||||
sample_rate = 48000 # 48000
|
|
||||||
speaker = 'aidar' # aidar, baya, kseniya, xenia, random
|
|
||||||
put_accent = True
|
|
||||||
put_yo = True
|
|
||||||
device = torch.device('cpu') # cpu или gpu
|
|
||||||
text = "Хауди Хо, друзья!!!"
|
|
||||||
|
|
||||||
model, _ = torch.hub.load(repo_or_dir='snakers4/silero-models',
|
|
||||||
model='silero_tts',
|
|
||||||
language=language,
|
|
||||||
speaker=model_id)
|
|
||||||
model.to(device)
|
|
||||||
|
|
||||||
|
|
||||||
def va_speak(what: str):
|
|
||||||
audio = model.apply_tts(text=what + "..",
|
|
||||||
speaker=speaker,
|
|
||||||
sample_rate=sample_rate,
|
|
||||||
put_accent=put_accent,
|
|
||||||
put_yo=put_yo)
|
|
||||||
|
|
||||||
sd.play(audio, sample_rate * 1.05)
|
|
||||||
time.sleep((len(audio) / sample_rate) + 0.5)
|
|
||||||
sd.stop()
|
|
||||||
Reference in New Issue
Block a user