alphacep/asr
5
1import logging2import sys3import gradio as gr4import vosk5import json6import subprocess7 8logging.basicConfig(9 format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",10 datefmt="%m/%d/%Y %H:%M:%S",11 handlers=[logging.StreamHandler(sys.stdout)],12)13logger = logging.getLogger(__name__)14logger.setLevel(logging.DEBUG)15 16LARGE_MODEL_BY_LANGUAGE = {17 "Russian": {"model_id": "vosk-model-ru-0.42"},18 "Chinese": {"model_id": "vosk-model-cn-0.22"},19 "English": {"model_id": "vosk-model-en-us-0.22"},20 "French": {"model_id": "vosk-model-fr-0.22"},21 "German": {"model_id": "vosk-model-de-0.22"},22 "Italian": {"model_id": "vosk-model-it-0.22"},23 "Japanese": {"model_id": "vosk-model-ja-0.22"},24 "Hindi": {"model_id": "vosk-model-hi-0.22"},25 "Persian": {"model_id": "vosk-model-fa-0.5"},26 "Uzbek": {"model_id": "vosk-model-small-uz-0.22"},27}28 29LANGUAGES = sorted(LARGE_MODEL_BY_LANGUAGE.keys())30CACHED_MODELS_BY_ID = {}31 32def asr(model, input_file):33 34 rec = vosk.KaldiRecognizer(model, 16000.0)35 results = []36 37 process = subprocess.Popen(f'ffmpeg -loglevel quiet -i {input_file} -ar 16000 -ac 1 -f s16le -'.split(),38 stdout=subprocess.PIPE)39 40 while True:41 data = process.stdout.read(4000)42 if len(data) == 0:43 break44 if rec.AcceptWaveform(data):45 jres = json.loads(rec.Result())46 results.append(jres['text'])47 48 jres = json.loads(rec.FinalResult())49 results.append(jres['text'])50 51 return " ".join(results)52 53 54def run(input_file, language, history):55 56 logger.info(f"Running ASR for {language} for {input_file}")57 58 history = history or []59 60 model = LARGE_MODEL_BY_LANGUAGE.get(language, None)61 62 if model is None:63 history.append({64 "error_message": f"Failed to find a model for {language} language :("65 })66 elif input_file is None:67 history.append({68 "error_message": f"Record input audio first"69 })70 else:71 model_instance = CACHED_MODELS_BY_ID.get(model["model_id"], None)72 if model_instance is None:73 model_instance = vosk.Model(model_name=model["model_id"])74 CACHED_MODELS_BY_ID[model["model_id"]] = model_instance75 76 transcription = asr(model_instance, input_file)77 78 logger.info(f"Transcription for {input_file}: {transcription}")79 80 history.append({81 "model_id": model["model_id"],82 "language": language,83 "transcription": transcription,84 "error_message": None85 })86 87 html_output = "<div class='result'>"88 for item in history:89 if item["error_message"] is not None:90 html_output += f"<div class='result_item result_item_error'>{item['error_message']}</div>"91 else:92 html_output += "<div class='result_item result_item_success'>"93 html_output += f'{item["transcription"]}<br/>'94 html_output += "</div>"95 html_output += "</div>"96 97 return html_output, history98 99 100gr.Interface(101 run,102 inputs=[103 gr.inputs.Audio(source="microphone", type="filepath", label="Record something..."),104 gr.inputs.Radio(label="Language", choices=LANGUAGES),105 "state"106 ],107 outputs=[108 gr.outputs.HTML(label="Outputs"),109 "state"110 ],111 title="Automatic Speech Recognition",112 description="",113 css="""114 .result {display:flex;flex-direction:column}115 .result_item {padding:15px;margin-bottom:8px;border-radius:15px;width:100%}116 .result_item_success {background-color:mediumaquamarine;color:white;align-self:start}117 .result_item_error {background-color:#ff7070;color:white;align-self:start}118 """,119 allow_flagging="never",120 theme="default"121).launch(enable_queue=True)122 