Гайд [Python] Голосовой помощник

its_niks

Новичок
Всем, привет!
:animewave:

Решил я тут написать небольшого помощника, если его можно так назвать.
Нуу-с... Приступим.
Заходим на сайт [preview]https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio [/preview]и скачиваем нужную версию модуля в формате WHL.

Заходим в CMD и пишем

pip install {путь к файлу whl}

Например:

pip install C:\Users\Nikita\Downloads\PyAudio-0.2.11-cp39-cp39-win_amd64.whl

Так, PyAudio установили, поехали дальше.
Устанавливаем Vosk
[SRCI]pip install vosk[/SRCI]

Заходим на сайт [preview]https://alphacephei.com/vosk/models [/preview]ищем модель на русском(да в принципе не важно, если вам надо на английском, то можете такую скачать), их там 2 штуки(маленькая и большая), я для демонстрации скачал маленькую(43MB). Закидываете ее в папку с скриптом и готово.
:flexing_parrot:
Python:
pip install fuzzywuzzy
pip install pyttsx3
Создаем файлы:
Код:
import json
import pyaudio
from vosk import Model, KaldiRecognizer, SetLogLevel
from fuzzywuzzy import fuzz
import sys, webbrowser, colorama, datetime, pyttsx3, random, os

class Helper():
    def __init__(self):
        SetLogLevel(-1)
        model = Model("./vosk-model-small-ru-0.22")
        self.rec = KaldiRecognizer(model, 16000)
        p = pyaudio.PyAudio()
        self.stream = p.open(format=pyaudio.paInt16, channels=1,
                        rate=16000, input=True, frames_per_buffer=8000)
        self.stream.start_stream()
        self.cmds = {
            ('время', 'сколько времени', 'какой час', 'сколько время') : self.get_time,
            ('спасибо', 'от души', 'сенк') : self.thx,
            ('прощай', 'пока', 'до свидания', 'гуд бай') : self.exit,
            ('привет', 'ку', 'приветствую', 'хелоу') : self.hello,
        }
        self.engine = pyttsx3.init()
        self.engine.setProperty('rate', 200)
        self.engine.setProperty('volume', 1)
    # Выход
    def exit(self):
        list_1 = ['Надеюсь мы скоро увидимся', 'Рада была помочь', 'Пока пока', 'Я отключаюсь']
        self.say(random.choice(list_1))
        self.engine.stop()
        os.system('cls')
        raise SystemExit(0)
    # Поиск
    def google(self, text):
        url = f'https://www.google.com/search?q={" ".join(text)}'
        self.say(f'Ищу в интернете: {" ".join(text)}')
        webbrowser.open(url)
    # Приветствие
    def hello(self):
        hello_list = ['привет', 'ку', 'приветствую', 'хелоу', 'дарова', 'здорово']
        self.say(random.choice(hello_list))
    # Открытие браузера
    def open_browser(self, task):
        links = {
            ('ютуб', 'ютюб'): 'https://youtube.com/',
            ('вк', 'вконтакте', 'контакт'): 'https:vk.com/feed',
            ('браузер', 'интернет', 'гугл'): 'https://google.com/',
            ('инстаграм', 'инста', 'инсту'): 'https://www.instagram.com/',
        }
        j = 0
        if 'и' in task:
            task = task.replace('и', '').replace('  ', ' ')
        double_task = task.split()
        if j != len(double_task):
            for i in range(len(double_task)):
                for vals in links:
                    for word in vals:
                        if fuzz.ratio(word, double_task[i]) > 75:
                            webbrowser.open(links[vals])
                            self.say('Открываю ' + double_task[i])
                            j += 1
                            os.system('cls')
                            print("Я вас слушаю...")
                            break
    # Получить время
    def get_time(self):
        now = datetime.datetime.now()
        self.engine.say("Сейчас " + str(now.hour)  + ":" + str(now.minute))
        self.engine.runAndWait()
    # Спасибо
    def thx(self):
        thx_list = ['На здоровье', 'Обращайся', 'Не за что', 'Не стоит благодарности', 'Это моя работа', 'Обращайтесь еще', 'Рад был помочь']
        self.say(random.choice(thx_list))
    # Говорилка
    def say(self, text):
        self.engine.say(text)
        self.engine.runAndWait()
    # Слушание
    def listen(self):
        print("Я вас слушаю...")
        while True:
            data = self.stream.read(4000, exception_on_overflow=False)
            if self.rec.AcceptWaveform(data) and len(data) > 0:
                answer = json.loads(self.rec.Result())
                if answer["text"]:
                    yield answer["text"]
    # Распознование речи
    def recognize(self):
        for text in self.listen():
            if text.startswith(('открой', 'запусти', 'зайди', 'зайди на')):
                self.open_browser(text)
            elif text.startswith(('узнай', 'найди')):
                self.google(text.split()[1:])
            else:
                for word in text.split():
                    for keywords in self.cmds:
                        if word in keywords:
                            self.cmds[keywords]()

if __name__ == '__main__':
    Helper().recognize()
На 10 строке должны ввести название папки с моделью.

Код:
py main.py

pause

Папка должна выглядеть так:
[IMG]

Ну и все вроде)

Возможности помощника:
  • Возможность открыть определенный сайт.
  • Возможность узнать инфу в гугле.
  • Возможность узнать время.
  • Помощник умеет здороваться и прощаться. Также отвечает на спасибо.
Все команды можно кастомизировать под себя.

Python 3.9.6

Кому лень все вводить держите архив(модель + скрипт): https://wdfiles.ru/2673d6
Не знаю зачем VT на архив, но держите: https://www.virustotal.com/gui/file...20a112eac7de66b27d3a81b340e3ef29c34?nocache=1

Запуск - start.bat

Спасибо, пока!
:animewave:
 
Сверху