| | |
| | | import os |
| | | import logging |
| | | import torch |
| | | import torchaudio |
| | | import soundfile |
| | | |
| | | from modelscope.pipelines import pipeline |
| | | from modelscope.utils.constant import Tasks |
| | | from modelscope.utils.logger import get_logger |
| | | |
| | | logger = get_logger(log_level=logging.CRITICAL) |
| | | logger.setLevel(logging.CRITICAL) |
| | | |
| | | os.environ["MODELSCOPE_CACHE"] = "./" |
| | | inference_pipeline = pipeline( |
| | | task=Tasks.auto_speech_recognition, |
| | | model='damo/speech_paraformer_asr_nat-zh-cn-16k-common-vocab8404-online', |
| | | model_revision='v1.0.2') |
| | | |
| | | waveform, sample_rate = torchaudio.load("asr_example_zh.wav") |
| | | speech_length = waveform.shape[1] |
| | | speech = waveform[0] |
| | | model_dir = os.path.join(os.environ["MODELSCOPE_CACHE"], "damo/speech_paraformer_asr_nat-zh-cn-16k-common-vocab8404-online") |
| | | speech, sample_rate = soundfile.read(os.path.join(model_dir, "example/asr_example.wav")) |
| | | speech_length = speech.shape[0] |
| | | |
| | | cache_en = {"start_idx": 0, "pad_left": 0, "stride": 10, "pad_right": 5, "cif_hidden": None, "cif_alphas": None} |
| | | cache_de = {"decode_fsmn": None} |
| | | cache = {"encoder": cache_en, "decoder": cache_de} |
| | | param_dict = {} |
| | | param_dict["cache"] = cache |
| | | |
| | | first_chunk = True |
| | | speech_buffer = speech |
| | | speech_cache = [] |
| | | sample_offset = 0 |
| | | step = 4800 #300ms |
| | | param_dict = {"cache": dict(), "is_final": False} |
| | | final_result = "" |
| | | |
| | | while len(speech_buffer) > 0: |
| | | if first_chunk: |
| | | if len(speech_buffer) >= 14400: |
| | | rec_result = inference_pipeline(audio_in=speech_buffer[0:14400], param_dict=param_dict) |
| | | speech_buffer = speech_buffer[4800:] |
| | | else: |
| | | cache_en["stride"] = len(speech_buffer) // 960 |
| | | cache_en["pad_right"] = 0 |
| | | rec_result = inference_pipeline(audio_in=speech_buffer, param_dict=param_dict) |
| | | speech_buffer = [] |
| | | cache_en["start_idx"] = -5 |
| | | first_chunk = False |
| | | else: |
| | | cache_en["start_idx"] += 10 |
| | | if len(speech_buffer) >= 4800: |
| | | cache_en["pad_left"] = 5 |
| | | rec_result = inference_pipeline(audio_in=speech_buffer[:19200], param_dict=param_dict) |
| | | speech_buffer = speech_buffer[9600:] |
| | | else: |
| | | cache_en["stride"] = len(speech_buffer) // 960 |
| | | cache_en["pad_right"] = 0 |
| | | rec_result = inference_pipeline(audio_in=speech_buffer, param_dict=param_dict) |
| | | speech_buffer = [] |
| | | if rec_result['text'] != "sil": |
| | | for sample_offset in range(0, speech_length, min(step, speech_length - sample_offset)): |
| | | if sample_offset + step >= speech_length - 1: |
| | | step = speech_length - sample_offset |
| | | param_dict["is_final"] = True |
| | | rec_result = inference_pipeline(audio_in=speech[sample_offset: sample_offset + step], |
| | | param_dict=param_dict) |
| | | if len(rec_result) != 0 and rec_result['text'] != "sil" and rec_result['text'] != "waiting_for_more_voice": |
| | | final_result += rec_result['text'] |
| | | print(rec_result) |
| | | print(final_result) |