7 Commits

Author SHA1 Message Date
Dmitrium12 4a0155413e micro fix 2024-04-30 08:46:16 +07:00
Dmitrium12 6a6efe8dd6 micro fix 2024-04-30 08:46:06 +07:00
Dmitrium12 08b6f95a67 add testing noisereduce 2024-04-30 08:31:33 +07:00
Dmitrium12 d2b60b53c4 add command and add its in ollama functions 2024-04-29 17:58:53 +07:00
Dmitrium12 a7abfe44b4 add linter and test ollama in python 2024-04-29 15:31:01 +07:00
Dmitrium12 3fb31e60ea .gitignore 2024-01-09 22:10:57 +07:00
Dmitrium12 c03811cb87 starting 2024-01-09 22:10:13 +07:00
24 changed files with 15 additions and 123 deletions
+2 -2
View File
@@ -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
+5 -9
View File
@@ -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):
-4
View File
@@ -72,7 +72,3 @@ weather:
- возможен дождь сегодня? - возможен дождь сегодня?
- прогноз погоды на сегодня - прогноз погоды на сегодня
- погода - погода
home_assistant:
- включи телевизор
- выключи телевизор
- начни уборку
Executable
+5
View File
@@ -0,0 +1,5 @@
VA_ALIAS = ('джарвис',)
VA_TBR = ('скажи', 'покажи', 'ответь', 'произнеси', 'расскажи', 'сколько', 'слушай')
MICROPHONE_INDEX = -1
PICOVOICE_TOKEN = "4xbwaZwZmSHeTiowFl5Rgqsc8CR4FKGV8YueJUlR4Zt2e1kB64IDcA=="
OPENAI_TOKEN = "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"
-10
View File
@@ -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 -1
View File
@@ -1,4 +1,4 @@
from modules.Jarvis import Jarvis from Jarvis import Jarvis
def main(): def main():
-31
View File
@@ -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
-5
View File
@@ -1,5 +0,0 @@
from modules.HomeAssistant import HomeAssistant
home_assistant = HomeAssistant()
response = home_assistant.get_info("")
print(response.text)
-26
View File
@@ -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 -3
View File
@@ -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
View File
@@ -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()
-31
View File
@@ -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()