def recognize(temp, wav): wav_scp = str(Path(temp) / 'wav.scp') make_wav_scp(wav, wav_scp) segm = segmenter.Segmenter(wav_scp, '../model/final.raw', '../model/conf/post_output.vec', '../model/conf/mfcc_hires.conf', temp) segments = segm.segment() wav_segments_scp, utt2spk, spk2utt = segm.extract_segments(segments) rec = recognizer.Recognizer(wav_segments_scp, '../model/final.mdl', '../model/HCLG.fst', '../model/words.txt', '../model/conf/mfcc.conf', '../model/conf/ivector_extractor.conf', spk2utt, temp) transcriptions = rec.recognize(Path(wav).stem) ass = str(Path(temp) / 'wav.ass') make_ass(Path(wav).name, segments, transcriptions, utt2spk, ass) pars = transcriptions_parser.TranscriptionsParser('', '', '', 0, 0, 'wav.csv') transcriptions_df = pars.process_file(ass) return transcriptions_df
def start_pipeline(wav): """ Запуск пайплайна распознавания речи Аргументы: wav: путь к .WAV файлу аудио """ wav_name = Path(wav).name wav_stem = Path(wav).stem temp = str(Path(TEMP_DIR) / wav_stem) os.makedirs(temp, exist_ok=True) wav_scp = str(Path(temp) / 'wav.scp') make_wav_scp(wav, wav_scp) def terminate_pipeline(is_error, message): if is_error: LOGGER.error(message) os.rename(wav, str(ERROR_DIR / wav_name)) try: delete_folder(temp) except: LOGGER.error("Не удалось удалить временные файлы для '{}'".format(wav_name)) try: LOGGER.info("Запуск сегментации файла'{}'".format(wav_name)) segm = segmenter.Segmenter(wav_scp, SEGM_MODEL, SEGM_POST, SEGM_CONF, temp) segments = segm.segment() LOGGER.info("Завершение сегментации файла'{}'".format(wav_name)) except: terminate_pipeline(True, "Не удалось выполнить сегментацию файла '{}'".format(wav_name)) return if os.stat(segments).st_size == 0: terminate_pipeline(True, "В файле '{}' отсутствуют сегменты".format(wav_name)) return try: LOGGER.info("Запуск извлечения сегментов из файла'{}'".format(wav_name)) wav_segments_scp, utt2spk, spk2utt = segm.extract_segments(segments) LOGGER.info("Завершение извлечения сегментов из файла'{}'".format(wav_name)) except: terminate_pipeline(True, "Не удалось извлечь сегменты из файла '{}'".format(wav_name)) return try: LOGGER.info("Запуск распознавания файла'{}'".format(wav_name)) rec = recognizer.Recognizer(wav_segments_scp, REC_MODEL, REC_GRAPH, REC_WORDS, REC_CONF, REC_ICONF, spk2utt, temp) transcriptions = rec.recognize(wav_stem) LOGGER.info("Завершение распознавания файла'{}'".format(wav_name)) except: terminate_pipeline(True, "Не удалось выполнить распознавание файла '{}'".format(wav_name)) return try: LOGGER.info("Запуск формирования субтитров для файла'{}'".format(wav_name)) ass = str(OUTPUT_DIR / str('ass/' + wav_stem + '.ass')) make_ass(wav_name, segments, transcriptions, utt2spk, ass) LOGGER.info("Завершение формирования субтитров для файла'{}'".format(wav_name)) except: terminate_pipeline(True, "Не удалось сформировать субтитры для файла '{}'".format(wav_name)) return try: LOGGER.info("Запуск парсинга транскрибации для файла'{}'".format(wav_name)) pars = transcriptions_parser.TranscriptionsParser(str(OUTPUT_DIR / 'ass'), OUTPUT_DIR, LOGGER if IS_LOG else '', 1, 1, CSV) pars.process_batch_files([ass]) LOGGER.info("Завершение парсинга транскрибации для файла'{}'".format(wav_name)) except: terminate_pipeline(True, "Не удалось распарсить транскрибацию файла '{}'".format(wav_name)) return if IS_DELETE_WAV or SLEEP_TIME: LOGGER.info("Запуск удаления файла '{}'".format(wav_name)) try: os.remove(wav) except: LOGGER.error("Не удалось удалить файл '{}'".format(wav_name)) LOGGER.info("Завершение удаления файла '{}'".format(wav_name)) terminate_pipeline(False, None)