You've already forked Irene-Voice-Assistant
mirror of
https://github.com/janvarev/Irene-Voice-Assistant.git
synced 2025-11-26 22:50:58 +02:00
- поддержки работы с контекстом (см. справку) - демо-игра работы с контекстом Больше-меньше и Больше-меньше альтернативная (два стиля) - базовые реализации используют работы с контекстом - runva_webapi.py - теперь вызовы core._update_timers делаются через периодичпеские вызовы HTTP, и через таймер. Webapi стало значительно устойчивей - справка содержит информацию о контексте
138 lines
4.0 KiB
Python
138 lines
4.0 KiB
Python
import argparse
|
|
import os
|
|
import queue
|
|
import sounddevice as sd
|
|
import vosk
|
|
import sys
|
|
import traceback
|
|
import json
|
|
|
|
from vacore import VACore
|
|
|
|
mic_blocked = False
|
|
|
|
def block_mic():
|
|
global mic_blocked
|
|
#print("Blocking microphone...")
|
|
mic_blocked = True
|
|
|
|
# ------------------- vosk ------------------
|
|
if __name__ == "__main__":
|
|
q = queue.Queue()
|
|
|
|
|
|
|
|
def int_or_str(text):
|
|
"""Helper function for argument parsing."""
|
|
try:
|
|
return int(text)
|
|
except ValueError:
|
|
return text
|
|
|
|
def callback(indata, frames, time, status):
|
|
"""This is called (from a separate thread) for each audio block."""
|
|
if status:
|
|
print(status, file=sys.stderr)
|
|
if not mic_blocked:
|
|
q.put(bytes(indata))
|
|
|
|
parser = argparse.ArgumentParser(add_help=False)
|
|
parser.add_argument(
|
|
'-l', '--list-devices', action='store_true',
|
|
help='show list of audio devices and exit')
|
|
args, remaining = parser.parse_known_args()
|
|
if args.list_devices:
|
|
print(sd.query_devices())
|
|
parser.exit(0)
|
|
parser = argparse.ArgumentParser(
|
|
description=__doc__,
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
parents=[parser])
|
|
parser.add_argument(
|
|
'-f', '--filename', type=str, metavar='FILENAME',
|
|
help='audio file to store recording to')
|
|
parser.add_argument(
|
|
'-m', '--model', type=str, metavar='MODEL_PATH',
|
|
help='Path to the model')
|
|
parser.add_argument(
|
|
'-d', '--device', type=int_or_str,
|
|
help='input device (numeric ID or substring)')
|
|
parser.add_argument(
|
|
'-r', '--samplerate', type=int, help='sampling rate')
|
|
args = parser.parse_args(remaining)
|
|
#args = {}
|
|
|
|
try:
|
|
if args.model is None:
|
|
args.model = "model"
|
|
if not os.path.exists(args.model):
|
|
print ("Please download a model for your language from https://alphacephei.com/vosk/models")
|
|
print ("and unpack as 'model' in the current folder.")
|
|
parser.exit(0)
|
|
if args.samplerate is None:
|
|
device_info = sd.query_devices(args.device, 'input')
|
|
# soundfile expects an int, sounddevice provides a float:
|
|
args.samplerate = int(device_info['default_samplerate'])
|
|
|
|
model = vosk.Model(args.model)
|
|
|
|
if args.filename:
|
|
dump_fn = open(args.filename, "wb")
|
|
else:
|
|
dump_fn = None
|
|
|
|
|
|
|
|
with sd.RawInputStream(samplerate=args.samplerate, blocksize = 8000, device=args.device, dtype='int16',
|
|
channels=1, callback=callback):
|
|
print('#' * 80)
|
|
print('Press Ctrl+C to stop the recording')
|
|
print('#' * 80)
|
|
|
|
rec = vosk.KaldiRecognizer(model, args.samplerate)
|
|
|
|
# initing core
|
|
core = VACore()
|
|
#core.init_plugin("core")
|
|
#core.init_plugins(["core"])
|
|
core.init_with_plugins()
|
|
|
|
#core.play_wav('timer/Sounds/Loud beep.wav')
|
|
|
|
while True:
|
|
data = q.get()
|
|
if rec.AcceptWaveform(data):
|
|
|
|
recognized_data = rec.Result()
|
|
|
|
#print("1",recognized_data)
|
|
|
|
#print(recognized_data)
|
|
recognized_data = json.loads(recognized_data)
|
|
#print(recognized_data)
|
|
voice_input_str = recognized_data["text"]
|
|
|
|
|
|
if voice_input_str != "":
|
|
core.run_input_str(voice_input_str,block_mic)
|
|
|
|
|
|
mic_blocked = False
|
|
#print("UNBlocking microphone...")
|
|
else:
|
|
#print("2",rec.PartialResult())
|
|
pass
|
|
core._update_timers()
|
|
|
|
|
|
if dump_fn is not None:
|
|
dump_fn.write(data)
|
|
|
|
except KeyboardInterrupt:
|
|
print('\nDone')
|
|
parser.exit(0)
|
|
except Exception as e:
|
|
parser.exit(type(e).__name__ + ': ' + str(e))
|
|
|
|
|