50 lines
2.0 KiB
Python
50 lines
2.0 KiB
Python
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
|
||
|
||
|