1
0
mirror of https://github.com/janvarev/Irene-Voice-Assistant.git synced 2025-11-26 22:50:58 +02:00
Files
Irene-Voice-Assistant/vosk_asr_server.py
janvarev aafd5e552f 6.7
- Jaa.py обновлен до 1.7.1
- плагин webapi.py для хранения настроек удален
- runva_webapi.py настройки теперь хранятся в runva_webapi.json и загружаются с помощью нового jaa.py
- старые настройки webapi будут автоматически скопированы (я надеюсь)
2022-06-19 15:59:09 +03:00

139 lines
4.5 KiB
Python

# implementation of VOSK server voice recognition
# origin: https://github.com/alphacep/vosk-server/blob/master/websocket/asr_server.py
# license: Apache 2.0
# Запускать после первого запуска WEBAPI!! - т.к. использует для настроек файл runva_webapi.json
# для размещения использует порт webapi+1 и тот же хост
import json
import os
import sys
import asyncio
import pathlib
import websockets
import concurrent.futures
import logging
from vosk import Model, SpkModel, KaldiRecognizer
version = "1.1"
# main options
with open('runva_webapi.json', 'r', encoding="utf-8") as f:
s = f.read(10000000)
f.close()
webapi_options = json.loads(s)
def process_chunk(rec, message):
# with open('temp/asr_server_test.wav', 'wb') as the_file:
# the_file.write(message)
if message == '{"eof" : 1}':
return rec.FinalResult(), True
elif rec.AcceptWaveform(message):
res = rec.Result()
#print("Result:",res)
return res, False
else:
res = rec.PartialResult()
#print("Part Result:",res)
return rec.PartialResult(), False
async def recognize(websocket, path):
global model
global spk_model
global args
global pool
loop = asyncio.get_running_loop()
rec = None
phrase_list = None
sample_rate = args.sample_rate
show_words = args.show_words
max_alternatives = args.max_alternatives
logging.info('Connection from %s', websocket.remote_address)
while True:
message = await websocket.recv()
# Load configuration if provided
if isinstance(message, str) and 'config' in message:
jobj = json.loads(message)['config']
logging.info("Config %s", jobj)
if 'phrase_list' in jobj:
phrase_list = jobj['phrase_list']
if 'sample_rate' in jobj:
sample_rate = float(jobj['sample_rate'])
if 'words' in jobj:
show_words = bool(jobj['words'])
if 'max_alternatives' in jobj:
max_alternatives = int(jobj['max_alternatives'])
continue
# Create the recognizer, word list is temporary disabled since not every model supports it
if not rec:
if phrase_list:
rec = KaldiRecognizer(model, sample_rate, json.dumps(phrase_list, ensure_ascii=False))
else:
rec = KaldiRecognizer(model, sample_rate)
rec.SetWords(show_words)
rec.SetMaxAlternatives(max_alternatives)
if spk_model:
rec.SetSpkModel(spk_model)
response, stop = await loop.run_in_executor(pool, process_chunk, rec, message)
await websocket.send(response)
if stop: break
async def start():
global model
global spk_model
global args
global pool
# Enable loging if needed
#
# logger = logging.getLogger('websockets')
# logger.setLevel(logging.INFO)
# logger.addHandler(logging.StreamHandler())
logging.basicConfig(level=logging.INFO)
args = type('', (), {})()
# для размещения использует порт webapi+1 и тот же хост
args.interface = os.environ.get('VOSK_SERVER_INTERFACE', webapi_options["host"])
args.port = int(os.environ.get('VOSK_SERVER_PORT', int(webapi_options["port"])+1))
args.model_path = os.environ.get('VOSK_MODEL_PATH', 'model')
args.spk_model_path = os.environ.get('VOSK_SPK_MODEL_PATH')
args.sample_rate = float(os.environ.get('VOSK_SAMPLE_RATE', 16000))
args.max_alternatives = int(os.environ.get('VOSK_ALTERNATIVES', 0))
args.show_words = bool(os.environ.get('VOSK_SHOW_WORDS', True))
if len(sys.argv) > 1:
args.model_path = sys.argv[1]
# Gpu part, uncomment if vosk-api has gpu support
#
# from vosk import GpuInit, GpuInstantiate
# GpuInit()
# def thread_init():
# GpuInstantiate()
# pool = concurrent.futures.ThreadPoolExecutor(initializer=thread_init)
model = Model(args.model_path)
spk_model = SpkModel(args.spk_model_path) if args.spk_model_path else None
pool = concurrent.futures.ThreadPoolExecutor((os.cpu_count() or 1))
print("VOSK Speech Recognition server v{0} started! host={1}, port={2}".format(version,args.interface,args.port))
async with websockets.serve(recognize, args.interface, args.port):
await asyncio.Future()
if __name__ == '__main__':
asyncio.run(start())