2022-05-21 19:44:28 +00:00
|
|
|
|
from vosk import Model, KaldiRecognizer, SetLogLevel
|
2022-05-21 17:06:25 +00:00
|
|
|
|
import pyaudio
|
|
|
|
|
import os # Для проверки наличия папки языковой модели
|
|
|
|
|
import json
|
|
|
|
|
|
|
|
|
|
kaldi = None # Распознавание речи
|
|
|
|
|
audio_stream = None # Звуковой поток с микрофона
|
|
|
|
|
|
|
|
|
|
def init_listener():
|
|
|
|
|
"""Инициализация слушателя для распознования речи"""
|
|
|
|
|
|
|
|
|
|
global kaldi # Распознавание речи
|
|
|
|
|
global audio_stream # Звуковой поток с микрофона
|
|
|
|
|
|
|
|
|
|
model_dir = "model-ru" # Директория с языковой моделью
|
|
|
|
|
|
|
|
|
|
if not os.path.exists(model_dir):
|
|
|
|
|
print ("Модель можно скачать по адресу https://alphacephei.com/vosk/models")
|
|
|
|
|
exit(1) # Если модель не найдена - завершаем работу
|
|
|
|
|
|
2022-05-21 19:44:28 +00:00
|
|
|
|
SetLogLevel(-1) # Отключение отладки в консоль
|
|
|
|
|
|
2022-05-21 17:06:25 +00:00
|
|
|
|
model = Model(model_dir) # Загружаем языковую модель
|
|
|
|
|
kaldi = KaldiRecognizer(model, 16000) # Разпознование речи
|
|
|
|
|
|
|
|
|
|
# Звук с микрофона
|
|
|
|
|
p = pyaudio.PyAudio()
|
|
|
|
|
audio_stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=8000)
|
|
|
|
|
audio_stream.start_stream()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def recognize():
|
|
|
|
|
"""Слушает микрофон и распознает речь. Возвращает строку распознанных слов"""
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
# Запись фреймов(4000)
|
|
|
|
|
data = audio_stream.read(4000)
|
|
|
|
|
# Если ничего не считалось - завершаем цикл
|
|
|
|
|
if len(data) == 0:
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
# Распознание записанного звука
|
|
|
|
|
if kaldi.AcceptWaveform(data):
|
|
|
|
|
text = json.loads(kaldi.Result())["text"].lower()
|
|
|
|
|
# print(text) # Отладочная печать
|
|
|
|
|
if len(text) > 0:
|
|
|
|
|
return text
|
|
|
|
|
|
|
|
|
|
|