8 Commits

Author SHA1 Message Date
Dmitrium12 8504126d4a Merge pull request 'add_noisereduce' (#2) from add_noisereduce into master
Reviewed-on: #2
2024-05-01 10:38:58 +07:00
Dmitrium12 4dc4ffa58c micro fix 2024-04-30 08:46:16 +07:00
Dmitrium12 26b38811cc micro fix 2024-04-30 08:46:06 +07:00
Dmitrium12 1d63461e35 add testing noisereduce 2024-04-30 08:31:33 +07:00
Dmitrium12 5f1e2e67a4 add command and add its in ollama functions 2024-04-29 17:58:53 +07:00
Dmitrium12 c23b1d42bf add linter and test ollama in python 2024-04-29 15:31:01 +07:00
Dmitrium12 b2866d073c .gitignore 2024-01-09 22:10:57 +07:00
Dmitrium12 a889c68e40 starting 2024-01-09 22:10:13 +07:00
24 changed files with 46 additions and 133 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 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.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):
-6
View File
@@ -72,9 +72,3 @@ weather:
- возможен дождь сегодня? - возможен дождь сегодня?
- прогноз погоды на сегодня - прогноз погоды на сегодня
- погода - погода
home_assistant_execute:
- включи телевизор
- выключи телевизор
- начни уборку
home_assistant_get:
- тест
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"
-4
View File
@@ -1,4 +0,0 @@
пылесос:
- entity_id:vacuum.roborock_vacuum_m1s
- state:находится в
- attributes.battery_level:а его уровень зарядки
+1 -1
View File
@@ -1,4 +1,4 @@
from modules.Jarvis import Jarvis from Jarvis import Jarvis
def main(): def main():
-67
View File
@@ -1,67 +0,0 @@
import requests
import yaml
from fuzzywuzzy import process
from data import config
class HomeAssistant:
def __init__(self):
self.url = "http://192.168.0.112:9999/api"
self.token = config.HOME_ASSISTANT_TOKEN
self.HA_CMD_LIST = yaml.safe_load(open('data/home_assistant_entities.yaml', encoding='utf8'))
def get_info(self, state):
response = requests.get(
url=f"{self.url}/states",
headers={
"Authorization": "Bearer " + self.token
}
)
for entity in response.json():
if entity["entity_id"] == state:
return entity
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
def voice_to_name(self, voice: str) -> str:
words = voice.lower().split()
best_match = None
highest_score = 0
for word in words:
result, score = process.extractOne(word, self.HA_CMD_LIST.keys())
if score > highest_score:
highest_score = score
best_match = result
return best_match
def validate_info(self, name: str):
answer = name
entity_config = self.HA_CMD_LIST.get(name)
if entity_config:
# Создание словаря, разделяя каждый элемент конфигурации на ключ и значение
entity_details = {item.split(':')[0]: item.split(':')[1] for item in entity_config}
entity_id = entity_details.pop("entity_id", None)
if entity_id:
responses = self.get_info(entity_id)
for attribute_path, label in entity_details.items():
response = responses
try:
for attribute in attribute_path.split("."):
response = response[attribute]
answer += f" {label} {response}"
except KeyError:
continue
return answer
-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 -7
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,9 +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_execute':
self.home_assistant.send_process(recognized_phrase)
elif cmd == 'home_assistant_get':
entity_name = self.home_assistant.voice_to_name(voice)
entity_info = self.home_assistant.validate_info(entity_name)
print(entity_info)
+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()
Executable
+31
View File
@@ -0,0 +1,31 @@
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()