from vosk import Model, KaldiRecognizer, SetLogLevel
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) # Если модель не найдена - завершаем работу

    SetLogLevel(-1) # Отключение отладки в консоль

    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


