Задать вопрос
@maksim4ik69

Не работает replace в голосовом ассистенте?

Ввожу replace нужно чтобы меняло команду кеша видео( голосовой запрос) на просто (голосовой запрос) без "кеша видео"
но по итогу ищет sreachyoutube, как сделать чтобы находило именно голосовой запрос без команды "Кеша Видео"

Делаю на основе Silero

Вот код:
spoiler
import config
import stt
import tts
from fuzzywuzzy import fuzz
import datetime
from num2t4ru import num2text
import webbrowser
import random




print(f"{config.VA_NAME} (v{config.VA_VER}) начал свою работу ...")


def va_respond(voice: str):
    print(voice)
    if voice.startswith(config.VA_ALIAS):
        # обращаются к ассистенту
        cmd = recognize_cmd(filter_cmd(voice))

        if cmd['cmd'] not in config.VA_CMD_LIST.keys():
            tts.va_speak("Что?")
        else:
            execute_cmd(cmd['cmd'])


def filter_cmd(raw_voice: str):
    cmd = raw_voice

    for x in config.VA_ALIAS:
        cmd = cmd.replace(x, "").strip()

    for x in config.VA_TBR:
        cmd = cmd.replace(x, "").strip()

    return cmd


def recognize_cmd(cmd: str):
    rc = {'cmd': '', 'percent': 0}
    for c, v in config.VA_CMD_LIST.items():

        for x in v:
            vrt = fuzz.ratio(cmd, x)
            if vrt > rc['percent']:
                rc['cmd'] = c
                rc['percent'] = vrt

    return rc


def execute_cmd(cmd: str):
    if cmd == 'help':
        # help
        text = "Я умею: ..."
        text += "произносить время ..."
        text += "рассказывать анекдоты ..."
        text += "и открывать браузер"
        tts.va_speak(text)
        pass
    elif cmd == 'ctime':
        # current time
        now = datetime.datetime.now()
        text = "Сейч+ас " + num2text(now.hour) + " " + num2text(now.minute)
        tts.va_speak(text)

    elif cmd == 'joke':
        jokes = ['Как смеются программисты? ... ехе ехе ехе',
                 'ЭсКьюЭль запрос заходит в бар, подходит к двум столам и спрашивает .. «м+ожно присоединиться?»',
                 'Программист это машина для преобразования кофе в код']

        tts.va_speak(random.choice(jokes))

    elif cmd == 'open_browser':
        text = "Открываю"
        tts.va_speak(text)
        webbrowser.open('Google.com', new=1)

    elif cmd == "sreachyoutube":
        search_term = cmd.replace("Кеша видео", " ")
        url = "https://www.youtube.com/results?search_query=" + search_term
        webbrowser.get().open(url)


# начать прослушивание команд
stt.va_listen(va_respond)

config
spoiler
VA_NAME = 'Кеша'

VA_VER = "2.0"

VA_ALIAS = ('кеша', 'кеш', 'инокентий', 'иннокентий', 'кишун', 'киш', 'кишаня', 'кешечка', 'кэш', 'кэша')

VA_TBR = ('скажи', 'покажи', 'ответь', 'произнеси', 'расскажи', 'сколько', "")

VA_CMD_LIST = {
    "help": ('список команд', 'команды', 'что ты умеешь', 'твои навыки', 'навыки'),
    "ctime": ('время', 'текущее время', 'сейчас времени', 'который час'),
    "joke": ('расскажи анекдот', 'рассмеши', 'шутка', 'расскажи шутку', 'пошути', 'развесели'),
    "open_browser": ('открой браузер', 'запусти браузер', 'открой гугл хром', 'гугл хром',"Открой гугл"),
    "sreachyoutube":("Видео","Открой видео"),
    "OpenYoutube":("Открой ютуб", "запусти ютуб"),
    "VIKLKOPM":("Отключи компютер", "Выключи компютер"),
    "RAST":("Открой раст", "Включи раст"),
    "BYBIT":("Открой биржу","Открой BYBIT"),
    "zakrbrayzer":("Закрой ютуб", "Закрой браузер", "Закрой гугл"),
    "sozdatel":("Кто твой создатель?"),
    "Sverni":("Сверни окна", "Разверни окна", "Сверни", "Разверни"),
    "despetcher":("Открой диспетчер задач", "открой диспетчер", "диспетчер задач"),
    "pause":("нажми пробел", "поставь паузу", "включи фильм", "останови фильм"),
    "raskladka":("Смени язык", "смени расскладку", "поменяй расскладку"),
    "golosvvod":("Голосовой ввод", "голосовой ввод"),
    "wikipedia":("википедия")
}


stt(Распознавания речи)
spoiler
import vosk
import sys
import sounddevice as sd
import queue
import json

model = vosk.Model("model_small")
samplerate = 16000
device = 1

q = queue.Queue()


def q_callback(indata, frames, time, status):
    if status:
        print(status, file=sys.stderr)
    q.put(bytes(indata))


def va_listen(callback):
    with sd.RawInputStream(samplerate=samplerate, blocksize=8000, device=device, dtype='int16',
                           channels=1, callback=q_callback):

        rec = vosk.KaldiRecognizer(model, samplerate)
        while True:
            data = q.get()
            if rec.AcceptWaveform(data):
                callback(json.loads(rec.Result())["text"])
            #else:
            #    print(rec.PartialResult())
  • Вопрос задан
  • 119 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну ты же явно какую-то глупость делаешь.
if cmd == "sreachyoutube":
        search_term = cmd.replace("Кеша видео", " ")

Если в переменной cmd лежит строка sreachyoutube(!), то там по определению не может содержаться подстроки "Кеша видео".
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы