From 657230c90485581947362d3c62af03bfcd53a02b Mon Sep 17 00:00:00 2001 From: Abraham Date: Thu, 15 Dec 2022 04:17:16 +0500 Subject: [PATCH] Initial commit --- .gitignore | 185 ++++++++++++++ _stt.py | 59 +++++ config.py | 14 ++ latest_silero_models.yml | 507 +++++++++++++++++++++++++++++++++++++++ main.py | 81 +++++++ requirements.txt | Bin 0 -> 2376 bytes speech.wav | Bin 0 -> 116780 bytes stt.py | 30 +++ tts.py | 35 +++ 9 files changed, 911 insertions(+) create mode 100644 .gitignore create mode 100644 _stt.py create mode 100644 config.py create mode 100644 latest_silero_models.yml create mode 100644 main.py create mode 100644 requirements.txt create mode 100644 speech.wav create mode 100644 stt.py create mode 100644 tts.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9bb619f --- /dev/null +++ b/.gitignore @@ -0,0 +1,185 @@ +# Created by .ignore support plugin (hsz.mobi) +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# IPython Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# dotenv +.env + +# virtualenv +venv/ +ENV/ + +# Spyder project settings +.spyderproject + +# Rope project settings +.ropeproject +### VirtualEnv template +# Virtualenv +# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ +[Bb]in +[Ii]nclude +[Ll]ib +[Ll]ib64 +[Ll]ocal +[Ss]cripts +pyvenv.cfg +.venv +pip-selfcheck.json + +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +# idea folder, uncomment if you don't need it +# .idea \ No newline at end of file diff --git a/_stt.py b/_stt.py new file mode 100644 index 0000000..efa903d --- /dev/null +++ b/_stt.py @@ -0,0 +1,59 @@ +import torch +import sounddevice as sd +import speech_recognition as sr +import time +import numpy +from glob import glob + +device = torch.device('cpu') +model, decoder, utils = torch.hub.load(repo_or_dir='snakers4/silero-models', + model='silero_stt', + language='en', # en, ru + device=device) +(read_batch, split_into_batches, + read_audio, prepare_model_input) = utils + +def callback(_r, audio): + try: + # CONVERT raw wav data to NumPy array + # wav_raw = audio.get_wav_data() + # data_s16 = numpy.frombuffer(wav_raw, dtype=numpy.int16, count=len(wav_raw) // 2, offset=0) + # np_audio = data_s16 * 0.5 ** 15 + + # Play it via sounddevice + #sd.play(np_audio, m.SAMPLE_RATE) + #time.sleep(len(np_audio) / m.SAMPLE_RATE) + #sd.stop() + + print("Распознание ...") + + # TODO: fix crutch, pass audio data directly as a model input of Silero STT + with open('speech.wav', 'wb') as f: + f.write(audio.get_wav_data()) + + test_files = glob('speech.wav') + batches = split_into_batches(test_files, batch_size=10) + input = prepare_model_input(read_batch(batches[0]), + device=device) + + output = model(input) + for example in output: + print(decoder(example.cpu())) + + # voice = recognizer.recognize_google(audio, language="ru-RU").lower() + # print("[log] Распознано: " + voice) + + except sr.UnknownValueError: + print("[log] Голос не распознан!") + + +# запуск +r = sr.Recognizer() +r.pause_threshold = 0.5 +m = sr.Microphone(device_index=1) + +with m as source: + r.adjust_for_ambient_noise(source) + +stop_listening = r.listen_in_background(m, callback) +while True: time.sleep(0.1) diff --git a/config.py b/config.py new file mode 100644 index 0000000..f926c06 --- /dev/null +++ b/config.py @@ -0,0 +1,14 @@ +VA_NAME = 'Кеша' + +VA_VER = "2.0" + +VA_ALIAS = ('кеша', 'кеш', 'инокентий', 'иннокентий', 'кишун', 'киш', 'кишаня', 'кешечка', 'кэш', 'кэша') + +VA_TBR = ('скажи', 'покажи', 'ответь', 'произнеси', 'расскажи', 'сколько') + +VA_CMD_LIST = { + "help": ('список команд', 'команды', 'что ты умеешь', 'твои навыки', 'навыки'), + "ctime": ('время', 'текущее время', 'сейчас времени', 'который час'), + "joke": ('расскажи анекдот', 'рассмеши', 'шутка', 'расскажи шутку', 'пошути', 'развесели'), + "open_browser": ('открой браузер', 'запусти браузер', 'открой гугл хром', 'гугл хром') +} \ No newline at end of file diff --git a/latest_silero_models.yml b/latest_silero_models.yml new file mode 100644 index 0000000..79b0281 --- /dev/null +++ b/latest_silero_models.yml @@ -0,0 +1,507 @@ +# pre-trained STT models +stt_models: + en: + latest: + meta: + name: "en_v6" + sample: "https://models.silero.ai/examples/en_sample.wav" + labels: "https://models.silero.ai/models/en/en_v1_labels.json" + jit: "https://models.silero.ai/models/en/en_v6.jit" + onnx: "https://models.silero.ai/models/en/en_v5.onnx" + jit_q: "https://models.silero.ai/models/en/en_v6_q.jit" + jit_xlarge: "https://models.silero.ai/models/en/en_v6_xlarge.jit" + onnx_xlarge: "https://models.silero.ai/models/en/en_v6_xlarge.onnx" + v6: + meta: + name: "en_v6" + sample: "https://models.silero.ai/examples/en_sample.wav" + labels: "https://models.silero.ai/models/en/en_v1_labels.json" + jit: "https://models.silero.ai/models/en/en_v6.jit" + onnx: "https://models.silero.ai/models/en/en_v5.onnx" + jit_q: "https://models.silero.ai/models/en/en_v6_q.jit" + jit_xlarge: "https://models.silero.ai/models/en/en_v6_xlarge.jit" + onnx_xlarge: "https://models.silero.ai/models/en/en_v6_xlarge.onnx" + v5: + meta: + name: "en_v5" + sample: "https://models.silero.ai/examples/en_sample.wav" + labels: "https://models.silero.ai/models/en/en_v1_labels.json" + jit: "https://models.silero.ai/models/en/en_v5.jit" + onnx: "https://models.silero.ai/models/en/en_v5.onnx" + onnx_q: "https://models.silero.ai/models/en/en_v5_q.onnx" + jit_q: "https://models.silero.ai/models/en/en_v5_q.jit" + jit_xlarge: "https://models.silero.ai/models/en/en_v5_xlarge.jit" + onnx_xlarge: "https://models.silero.ai/models/en/en_v5_xlarge.onnx" + v4_0: + meta: + name: "en_v4_0" + sample: "https://models.silero.ai/examples/en_sample.wav" + labels: "https://models.silero.ai/models/en/en_v1_labels.json" + jit_large: "https://models.silero.ai/models/en/en_v4_0_jit_large.model" + onnx_large: "https://models.silero.ai/models/en/en_v4_0_large.onnx" + v3: + meta: + name: "en_v3" + sample: "https://models.silero.ai/examples/en_sample.wav" + labels: "https://models.silero.ai/models/en/en_v1_labels.json" + jit: "https://models.silero.ai/models/en/en_v3_jit.model" + onnx: "https://models.silero.ai/models/en/en_v3.onnx" + jit_q: "https://models.silero.ai/models/en/en_v3_jit_q.model" + jit_skip: "https://models.silero.ai/models/en/en_v3_jit_skips.model" + jit_large: "https://models.silero.ai/models/en/en_v3_jit_large.model" + onnx_large: "https://models.silero.ai/models/en/en_v3_large.onnx" + jit_xsmall: "https://models.silero.ai/models/en/en_v3_jit_xsmall.model" + jit_q_xsmall: "https://models.silero.ai/models/en/en_v3_jit_q_xsmall.model" + onnx_xsmall: "https://models.silero.ai/models/en/en_v3_xsmall.onnx" + v2: + meta: + name: "en_v2" + sample: "https://models.silero.ai/examples/en_sample.wav" + labels: "https://models.silero.ai/models/en/en_v1_labels.json" + jit: "https://models.silero.ai/models/en/en_v2_jit.model" + onnx: "https://models.silero.ai/models/en/en_v2.onnx" + tf: "https://models.silero.ai/models/en/en_v2_tf.tar.gz" + v1: + meta: + name: "en_v1" + sample: "https://models.silero.ai/examples/en_sample.wav" + labels: "https://models.silero.ai/models/en/en_v1_labels.json" + jit: "https://models.silero.ai/models/en/en_v1_jit.model" + onnx: "https://models.silero.ai/models/en/en_v1.onnx" + tf: "https://models.silero.ai/models/en/en_v1_tf.tar.gz" + de: + latest: + meta: + name: "de_v1" + sample: "https://models.silero.ai/examples/de_sample.wav" + labels: "https://models.silero.ai/models/de/de_v1_labels.json" + jit: "https://models.silero.ai/models/de/de_v1_jit.model" + onnx: "https://models.silero.ai/models/de/de_v1.onnx" + tf: "https://models.silero.ai/models/de/de_v1_tf.tar.gz" + v1: + meta: + name: "de_v1" + sample: "https://models.silero.ai/examples/de_sample.wav" + labels: "https://models.silero.ai/models/de/de_v1_labels.json" + jit_large: "https://models.silero.ai/models/de/de_v1_jit.model" + onnx: "https://models.silero.ai/models/de/de_v1.onnx" + tf: "https://models.silero.ai/models/de/de_v1_tf.tar.gz" + v3: + meta: + name: "de_v3" + sample: "https://models.silero.ai/examples/de_sample.wav" + labels: "https://models.silero.ai/models/de/de_v1_labels.json" + jit_large: "https://models.silero.ai/models/de/de_v3_large.jit" + v4: + meta: + name: "de_v4" + sample: "https://models.silero.ai/examples/de_sample.wav" + labels: "https://models.silero.ai/models/de/de_v1_labels.json" + jit_large: "https://models.silero.ai/models/de/de_v4_large.jit" + onnx_large: "https://models.silero.ai/models/de/de_v4_large.onnx" + es: + latest: + meta: + name: "es_v1" + sample: "https://models.silero.ai/examples/es_sample.wav" + labels: "https://models.silero.ai/models/es/es_v1_labels.json" + jit: "https://models.silero.ai/models/es/es_v1_jit.model" + onnx: "https://models.silero.ai/models/es/es_v1.onnx" + tf: "https://models.silero.ai/models/es/es_v1_tf.tar.gz" + ua: + latest: + meta: + name: "ua_v3" + sample: "https://models.silero.ai/examples/ua_sample.wav" + credits: + datasets: + speech-recognition-uk: https://github.com/egorsmkv/speech-recognition-uk + labels: "https://models.silero.ai/models/ua/ua_v1_labels.json" + jit: "https://models.silero.ai/models/ua/ua_v3_jit.model" + jit_q: "https://models.silero.ai/models/ua/ua_v3_jit_q.model" + onnx: "https://models.silero.ai/models/ua/ua_v3.onnx" + v3: + meta: + name: "ua_v3" + sample: "https://models.silero.ai/examples/ua_sample.wav" + credits: + datasets: + speech-recognition-uk: https://github.com/egorsmkv/speech-recognition-uk + labels: "https://models.silero.ai/models/ua/ua_v1_labels.json" + jit: "https://models.silero.ai/models/ua/ua_v3_jit.model" + jit_q: "https://models.silero.ai/models/ua/ua_v3_jit_q.model" + onnx: "https://models.silero.ai/models/ua/ua_v3.onnx" + v1: + meta: + name: "ua_v1" + sample: "https://models.silero.ai/examples/ua_sample.wav" + credits: + datasets: + speech-recognition-uk: https://github.com/egorsmkv/speech-recognition-uk + labels: "https://models.silero.ai/models/ua/ua_v1_labels.json" + jit: "https://models.silero.ai/models/ua/ua_v1_jit.model" + jit_q: "https://models.silero.ai/models/ua/ua_v1_jit_q.model" +tts_models: + ru: + ru_v3: + latest: + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + package: 'https://models.silero.ai/models/tts/ru/ru_v3.pt' + sample_rate: [8000, 24000, 48000] + aidar_v2: + latest: + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + package: 'https://models.silero.ai/models/tts/ru/v2_aidar.pt' + sample_rate: [8000, 16000] + aidar_8khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_aidar_8000.jit' + sample_rate: 8000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_aidar_8000.jit' + sample_rate: 8000 + aidar_16khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_aidar_16000.jit' + sample_rate: 16000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_aidar_16000.jit' + sample_rate: 16000 + baya_v2: + latest: + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + package: 'https://models.silero.ai/models/tts/ru/v2_baya.pt' + sample_rate: [8000, 16000] + baya_8khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_baya_8000.jit' + sample_rate: 8000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_baya_8000.jit' + sample_rate: 8000 + baya_16khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_baya_16000.jit' + sample_rate: 16000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_baya_16000.jit' + sample_rate: 16000 + irina_v2: + latest: + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + package: 'https://models.silero.ai/models/tts/ru/v2_irina.pt' + sample_rate: [8000, 16000] + irina_8khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_irina_8000.jit' + sample_rate: 8000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_irina_8000.jit' + sample_rate: 8000 + irina_16khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_irina_16000.jit' + sample_rate: 16000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_irina_16000.jit' + sample_rate: 16000 + kseniya_v2: + latest: + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + package: 'https://models.silero.ai/models/tts/ru/v2_kseniya.pt' + sample_rate: [8000, 16000] + kseniya_8khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_kseniya_8000.jit' + sample_rate: 8000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_kseniya_8000.jit' + sample_rate: 8000 + kseniya_16khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_kseniya_16000.jit' + sample_rate: 16000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_kseniya_16000.jit' + sample_rate: 16000 + natasha_v2: + latest: + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + package: 'https://models.silero.ai/models/tts/ru/v2_natasha.pt' + sample_rate: [8000, 16000] + natasha_8khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_natasha_8000.jit' + sample_rate: 8000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_natasha_8000.jit' + sample_rate: 8000 + natasha_16khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_natasha_16000.jit' + sample_rate: 16000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_natasha_16000.jit' + sample_rate: 16000 + ruslan_v2: + latest: + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + package: 'https://models.silero.ai/models/tts/ru/v2_ruslan.pt' + sample_rate: [8000, 16000] + ruslan_8khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_ruslan_8000.jit' + sample_rate: 8000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_ruslan_8000.jit' + sample_rate: 8000 + ruslan_16khz: + latest: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_ruslan_16000.jit' + sample_rate: 16000 + v1: + tokenset: '_~абвгдеёжзийклмнопрстуфхцчшщъыьэюя +.,!?…:;–' + example: 'В н+едрах т+ундры в+ыдры в г+етрах т+ырят в в+ёдра +ядра к+едров.' + jit: 'https://models.silero.ai/models/tts/ru/v1_ruslan_16000.jit' + sample_rate: 16000 + en: + lj_v2: + latest: + example: 'Can you can a canned can into an un-canned can like a canner can can a canned can into an un-canned can?' + package: 'https://models.silero.ai/models/tts/en/v2_lj.pt' + sample_rate: [8000, 16000] + lj_8khz: + latest: + tokenset: '_~abcdefghijklmnopqrstuvwxyz .,!?…:;–' + example: 'Can you can a canned can into an un-canned can like a canner can can a canned can into an un-canned can?' + jit: 'https://models.silero.ai/models/tts/en/v1_lj_8000.jit' + sample_rate: 8000 + v1: + tokenset: '_~abcdefghijklmnopqrstuvwxyz .,!?…:;–' + example: 'Can you can a canned can into an un-canned can like a canner can can a canned can into an un-canned can?' + jit: 'https://models.silero.ai/models/tts/en/v1_lj_8000.jit' + sample_rate: 8000 + lj_16khz: + latest: + tokenset: '_~abcdefghijklmnopqrstuvwxyz .,!?…:;–' + example: 'Can you can a canned can into an un-canned can like a canner can can a canned can into an un-canned can?' + jit: 'https://models.silero.ai/models/tts/en/v1_lj_16000.jit' + sample_rate: 16000 + v1: + tokenset: '_~abcdefghijklmnopqrstuvwxyz .,!?…:;–' + example: 'Can you can a canned can into an un-canned can like a canner can can a canned can into an un-canned can?' + jit: 'https://models.silero.ai/models/tts/en/v1_lj_16000.jit' + sample_rate: 16000 + de: + thorsten_v2: + latest: + example: 'Fischers Fritze fischt frische Fische, Frische Fische fischt Fischers Fritze.' + package: 'https://models.silero.ai/models/tts/de/v2_thorsten.pt' + sample_rate: [8000, 16000] + thorsten_8khz: + latest: + tokenset: '_~abcdefghijklmnopqrstuvwxyzäöüß .,!?…:;–' + example: 'Fischers Fritze fischt frische Fische, Frische Fische fischt Fischers Fritze.' + jit: 'https://models.silero.ai/models/tts/de/v1_thorsten_8000.jit' + sample_rate: 8000 + v1: + tokenset: '_~abcdefghijklmnopqrstuvwxyzäöüß .,!?…:;–' + example: 'Fischers Fritze fischt frische Fische, Frische Fische fischt Fischers Fritze.' + jit: 'https://models.silero.ai/models/tts/de/v1_thorsten_8000.jit' + sample_rate: 8000 + thorsten_16khz: + latest: + tokenset: '_~abcdefghijklmnopqrstuvwxyzäöüß .,!?…:;–' + example: 'Fischers Fritze fischt frische Fische, Frische Fische fischt Fischers Fritze.' + jit: 'https://models.silero.ai/models/tts/de/v1_thorsten_16000.jit' + sample_rate: 16000 + v1: + tokenset: '_~abcdefghijklmnopqrstuvwxyzäöüß .,!?…:;–' + example: 'Fischers Fritze fischt frische Fische, Frische Fische fischt Fischers Fritze.' + jit: 'https://models.silero.ai/models/tts/de/v1_thorsten_16000.jit' + sample_rate: 16000 + es: + tux_v2: + latest: + example: 'Hoy ya es ayer y ayer ya es hoy, ya llegó el día, y hoy es hoy.' + package: 'https://models.silero.ai/models/tts/es/v2_tux.pt' + sample_rate: [8000, 16000] + tux_8khz: + latest: + tokenset: '_~abcdefghijklmnopqrstuvwxyzáéíñóú .,!?…:;–¡¿' + example: 'Hoy ya es ayer y ayer ya es hoy, ya llegó el día, y hoy es hoy.' + jit: 'https://models.silero.ai/models/tts/es/v1_tux_8000.jit' + sample_rate: 8000 + v1: + tokenset: '_~abcdefghijklmnopqrstuvwxyzáéíñóú .,!?…:;–¡¿' + example: 'Hoy ya es ayer y ayer ya es hoy, ya llegó el día, y hoy es hoy.' + jit: 'https://models.silero.ai/models/tts/es/v1_tux_8000.jit' + sample_rate: 8000 + tux_16khz: + latest: + tokenset: '_~abcdefghijklmnopqrstuvwxyzáéíñóú .,!?…:;–¡¿' + example: 'Hoy ya es ayer y ayer ya es hoy, ya llegó el día, y hoy es hoy.' + jit: 'https://models.silero.ai/models/tts/es/v1_tux_16000.jit' + sample_rate: 16000 + v1: + tokenset: '_~abcdefghijklmnopqrstuvwxyzáéíñóú .,!?…:;–¡¿' + example: 'Hoy ya es ayer y ayer ya es hoy, ya llegó el día, y hoy es hoy.' + jit: 'https://models.silero.ai/models/tts/es/v1_tux_16000.jit' + sample_rate: 16000 + fr: + gilles_v2: + latest: + example: 'Je suis ce que je suis, et si je suis ce que je suis, qu’est ce que je suis.' + package: 'https://models.silero.ai/models/tts/fr/v2_gilles.pt' + sample_rate: [8000, 16000] + gilles_8khz: + latest: + tokenset: '_~abcdefghijklmnopqrstuvwxyzéàèùâêîôûç .,!?…:;–' + example: 'Je suis ce que je suis, et si je suis ce que je suis, qu’est ce que je suis.' + jit: 'https://models.silero.ai/models/tts/fr/v1_gilles_8000.jit' + sample_rate: 8000 + v1: + tokenset: '_~abcdefghijklmnopqrstuvwxyzéàèùâêîôûç .,!?…:;–' + example: 'Je suis ce que je suis, et si je suis ce que je suis, qu’est ce que je suis.' + jit: 'https://models.silero.ai/models/tts/fr/v1_gilles_8000.jit' + sample_rate: 8000 + gilles_16khz: + latest: + tokenset: '_~abcdefghijklmnopqrstuvwxyzéàèùâêîôûç .,!?…:;–' + example: 'Je suis ce que je suis, et si je suis ce que je suis, qu’est ce que je suis.' + jit: 'https://models.silero.ai/models/tts/fr/v1_gilles_16000.jit' + sample_rate: 16000 + v1: + tokenset: '_~abcdefghijklmnopqrstuvwxyzéàèùâêîôûç .,!?…:;–' + example: 'Je suis ce que je suis, et si je suis ce que je suis, qu’est ce que je suis.' + jit: 'https://models.silero.ai/models/tts/fr/v1_gilles_16000.jit' + sample_rate: 16000 + ba: + aigul_v2: + latest: + example: 'Салауат Юлаевтың тормошо һәм яҙмышы хаҡындағы документтарҙың һәм шиғри әҫәрҙәренең бик аҙ өлөшө генә һаҡланған.' + package: 'https://models.silero.ai/models/tts/ba/v2_aigul.pt' + sample_rate: [8000, 16000] + language_name: 'bashkir' + xal: + erdni_v2: + latest: + example: 'Һорвн, дөрвн күн ирәд, һазань чиңгнв. Байн Цецн хаана һорвн көвүн күүндҗәнә.' + package: 'https://models.silero.ai/models/tts/xal/v2_erdni.pt' + sample_rate: [8000, 16000] + language_name: 'kalmyk' + tt: + dilyara_v2: + latest: + example: 'Ис+әнмесез, с+аумысез, нишл+әп кәҗәгезн+е с+аумыйсыз, әтәчег+ез күк+әй салг+ан, нишл+әп чыг+ып +алмыйсыз.' + package: 'https://models.silero.ai/models/tts/tt/v2_dilyara.pt' + sample_rate: [8000, 16000] + language_name: 'tatar' + uz: + dilnavoz_v2: + latest: + example: 'Tanishganimdan xursandman.' + package: 'https://models.silero.ai/models/tts/uz/v2_dilnavoz.pt' + sample_rate: [8000, 16000] + language_name: 'uzbek' + ua: + mykyta_v2: + latest: + example: 'К+отики - пухн+асті жив+отики.' + package: 'https://models.silero.ai/models/tts/ua/v22_mykyta_48k.pt' + sample_rate: [8000, 24000, 48000] + language_name: 'ukrainian' + multi: + multi_v2: + latest: + package: 'https://models.silero.ai/models/tts/multi/v2_multi.pt' + sample_rate: [8000, 16000] + speakers: + aidar: + lang: 'ru' + example: 'Съ+ешьте ещ+ё +этих м+ягких франц+узских б+улочек, д+а в+ыпейте ч+аю.' + baya: + lang: 'ru' + example: 'Съ+ешьте ещ+ё +этих м+ягких франц+узских б+улочек, д+а в+ыпейте ч+аю.' + kseniya: + lang: 'ru' + example: 'Съ+ешьте ещ+ё +этих м+ягких франц+узских б+улочек, д+а в+ыпейте ч+аю.' + irina: + lang: 'ru' + example: 'Съ+ешьте ещ+ё +этих м+ягких франц+узских б+улочек, д+а в+ыпейте ч+аю.' + ruslan: + lang: 'ru' + example: 'Съ+ешьте ещ+ё +этих м+ягких франц+узских б+улочек, д+а в+ыпейте ч+аю.' + natasha: + lang: 'ru' + example: 'Съ+ешьте ещ+ё +этих м+ягких франц+узских б+улочек, д+а в+ыпейте ч+аю.' + thorsten: + lang: 'de' + example: 'Fischers Fritze fischt frische Fische, Frische Fische fischt Fischers Fritze.' + tux: + lang: 'es' + example: 'Hoy ya es ayer y ayer ya es hoy, ya llegó el día, y hoy es hoy.' + gilles: + lang: 'fr' + example: 'Je suis ce que je suis, et si je suis ce que je suis, qu’est ce que je suis.' + lj: + lang: 'en' + example: 'Can you can a canned can into an un-canned can like a canner can can a canned can into an un-canned can?' + dilyara: + lang: 'tt' + example: 'Пес+и пес+и песик+әй, борыннар+ы бәләк+әй.' +te_models: + latest: + package: "https://models.silero.ai/te_models/v2_4lang_q.pt" + languages: ['en', 'de', 'ru', 'es'] + punct: '.,-!?—' + v2: + package: "https://models.silero.ai/te_models/v2_4lang_q.pt" + languages: ['en', 'de', 'ru', 'es'] + punct: '.,-!?—' diff --git a/main.py b/main.py new file mode 100644 index 0000000..fb0ae65 --- /dev/null +++ b/main.py @@ -0,0 +1,81 @@ +# КЕША 2.0 + +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': + chrome_path = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s' + webbrowser.get(chrome_path).open("http://python.org") + + +# начать прослушивание команд +stt.va_listen(va_respond) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..6bf82590ea1cbd43ec040766a8780aa190c7234a GIT binary patch literal 2376 zcmZ9OOK;Oq5QS%r#D8FqLK-J+S|lVY5DNrSMa6W}0)aJ9cu7PpKTCOA$@=2)XI9GVwVwA^^%}o3dE5wJ z3bB#rm2ey7KX5cz_H=P4%0wCB9dzl4LU|Mof{dc3iR_7p)yJ|OH9qEwxm2W?Jav>C z89#VsrE(_1J_9}ZkJt<42X^G>tcDy1j+kogq(Q)E_#tvz!BpSD)QX)RPK1aUGkbO) z!ANB{JItvteUAc9FS@q&w0lZVJ=LFe&Sj;lN=#7|nBX%JrA=iWxuw7JUmmE3RS`Q^ z-OAUrVIRgLX7uN)SS{>Axn)MfrgLPnmS-45r==9r(Y^BLs>v_>Wu=u@PzXN|mm7Oy zAN9M@s0Sdi0`edE51|pSXsgGgTB(`rB-Ym*>yixiV8Plw_VB0!nni!S~2>v zoXNvPb&mCRqWjo}%3`3mfhwBm8tNPU26-%Pjde$>XX2~SGv7~y4n;;p<`QPmL!m1x zCD)lMV9J=;Ye!)ZB>Jn}dZ#;;rZz(Rp$rh{x}CIEHMQ0-!S{-@5_cd&6L3D%FD4ya zEoBiQdx(NVpS4zzE9&hyZ_LD<(4l5jgug=7N6s6M(^0HP#XQ_O!Y67uS3l6yqUkZS zOQzA;u6^>SpG`Mc>g&1qW)i7{KJVw(Z<=&>=w|8P; zt}LRCt*^>`qun9k9|Tq0co*4++dY)sBPWOM-^!MK+TUsDKzIU`h_=tkZ17673)PQ( zx~CP?l3Li>rSc);wSBg4jtYD3S47HFq9X)7iW7j@ihVmZ5Ot&qSob3S*zwQ=bHIGl z!Ajpz7-vnpI&{J5z-bdZF;)ChC%-q@u@8m?kH4h}w7Sn`;YtmjR*gnb{Q_f8MkH6G< zc9MzM`r&^U(h&P~GRb=4Fvl5VEvA`d*oX7jzhmmM#yEZOiwC+MIS0F~m9sbI?y$DR zF=1rGEM^~KH)tcF*3cI&~~%*LZ@?9Oel0)Kr)XZ4eOGU-!g8QdgqvHSf4TRmfh literal 0 HcmV?d00001 diff --git a/speech.wav b/speech.wav new file mode 100644 index 0000000000000000000000000000000000000000..1b5f781bfc9b73a6cbe225f98a7f599ef5d2987d GIT binary patch literal 116780 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

w4zg` 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 Hh`s+0xoGj< literal 0 HcmV?d00001 diff --git a/stt.py b/stt.py new file mode 100644 index 0000000..90631a0 --- /dev/null +++ b/stt.py @@ -0,0 +1,30 @@ +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()) \ No newline at end of file diff --git a/tts.py b/tts.py new file mode 100644 index 0000000..a48b47e --- /dev/null +++ b/tts.py @@ -0,0 +1,35 @@ +import torch +import sounddevice as sd +import time + +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() + +# sd.play(audio, sample_rate) +# time.sleep(len(audio) / sample_rate) +# sd.stop() \ No newline at end of file