Insanely Fast Whisper: быстрая и эффективная транскрипция речи в текст с открытым исходным кодом

Общее введение

insanely-fast-whisper - это инструмент для транскрипции аудио, который сочетает модель Whisper от OpenAI с различными техниками оптимизации (например, Transformers, Optimum, Flash Attention) для создания интерфейса командной строки (CLI), предназначенного для быстрой и эффективной транскрипции больших объемов аудио. Он использует модель Whisper Large v3 и способен расшифровать 150 минут аудиоконтента менее чем за 98 секунд. Пользователи могут получить более подробную информацию, руководство по установке и помощь в использовании в репозитории GitHub.

 

распознавание нескольких дикторов

pyannote.audio - это инструментарий с открытым исходным кодом для ведения дневников дикторов, написанный на Python. Основанный на фреймворке машинного обучения PyTorch, он включает в себя современные предварительно обученные модели и конвейеры для дальнейшей тонкой настройки ваших собственных данных для повышения производительности.

faster-whisper + pyannote.audio реализует распознавание диктора, по сути, просто объединяя результаты двух

Официальный склад: https://github.com/pyannote/pyannote-audio

 

Список функций

Расшифровка аудиозаписей с помощью модели Whisper Large v3
Внедрение технологий Transformers, Optimum, Flash Attention и других
Предоставляет интерфейс CLI
Поддержка различных типов оптимизации и демонстрация эталонных показателей

 

Использование помощи

Установка: Установка и настройка с помощью pip
Использование: Передача параметров и запуск задач транскрипции непосредственно из командной строки
Получите помощь: посетите репозиторий GitHub, чтобы прочитать документацию и пообщаться с сообществом.

 

https://github.com/SYSTRAN/faster-whisper项目编写的код google colab

# Установка необходимых библиотек
get_ipython().system('pip install faster-whisper')
# Импорт необходимых библиотек
из faster_whisper import available_models
импортный резак
import ipywidgets as widgets
из IPython.display import display, clear_output
import os # Импорт библиотек операционной системы для работы с файлами
импорт gc # импорт библиотеки для сбора мусора
# Автоматически определяет тип устройства и выбирает GPU или CPU
устройство = "cuda" if torch.cuda.is_available() else "cpu"
model_size = "large-v2" # Выбор размера модели по умолчанию
compute_type = "float16", если устройство == "cuda", иначе "float32" # Переключение на float32, если используется CPU
# Получить список доступных моделей
список_моделей = доступные_модели()
# Список языков по умолчанию
supported_languages = ['en', 'fr', 'de', 'zh', '...']. # использует список языков по умолчанию
default_language = 'zh' if 'zh' in supported_languages else supported_languages[0] # Если 'zh' есть в списке, используйте его по умолчанию; в противном случае используйте первое значение в списке

 

# Создание графического интерфейса
model_label = widgets.Label('Выберите модель:')
model_dropdown = widgets.Dropdown(options=models_list, value=model_size)
language_label = widgets.Label('Language:')
language_dropdown = widgets.Dropdown(options=supported_languages, value=default_language)
beam_size_label = widgets.Label('Размер балки:')
beam_size_slider = widgets.IntSlider(value=5, min=1, max=10, step=1)
compute_type_label = widgets.Label('Тип вычислений:')
если устройство == "cuda".
    compute_type_options = ['float16', 'int8']
еще.
    compute_type_options = ['float32'] # Если процессор, блокировка на float32
compute_type_dropdown = widgets.Dropdown(options=compute_type_options, value=compute_type)
mode_label = widgets.Label('Format Mode:')
mode_dropdown = widgets.Dropdown(options=['normal', 'timeline', 'subtitle'], value='normal')
initial_prompt_label = widgets.Label('Initial Prompt:') # Добавлен новый ярлык начальной подсказки
initial_prompt_text = widgets.Text(value='') # Добавлено начальное поле ввода подсказки
file_name_text = widgets.Text(description='Имя файла:', value='/content/') # Разрешите пользователю ввести имя файла
transcribe_button = widgets.Button(description='Transcribe')
область_вывода = widgets.Output()

 

# Определение функции перевода
def transcribe_audio(b).
    с областью вывода.
        clear_output()
        print("Начинаем транскрипцию...")
        from faster_whisper import WhisperModel # Динамический импорт WhisperModel: импорт при необходимости для экономии оперативной памяти
        попробуйте.
            имя_файла = имя_файла_текст.значение # Использовать имя файла, введенное пользователем
            initial_prompt = initial_prompt_text.value # Начальная подсказка с использованием пользовательского ввода
            # Убедитесь в существовании документа
            if not os.path.exists(file_name):: if not os.path.exists(file_name).
                print(f "Файл {имя_файла} не существует, проверьте правильность имени файла и пути к нему.")
                возврат
            # Приобретение выбранных моделей
            selected_model = model_dropdown.value
            selected_compute_type = compute_type_dropdown.value
            selected_language = language_dropdown.value
            # Создайте новый экземпляр модели и выполните перевод
            модель = WhisperModel(selected_model, device=device, compute_type=selected_compute_type)
            попробуйте.
                # Перевод аудио
                segments, info = model.transcribe(имя_файла, beam_size=beam_size_slider.value, language=selected_language, initial_prompt=initial_prompt ) Параметры начальной подсказки добавлены в #
                Результаты печати #
                print("Обнаружен язык '%s' с вероятностью %f" % (info.language, info.language_probability))
                для сегмента в сегментах:
                    если mode_dropdown.value == 'normal'.
                        print("%s " % (segment.text))
                    elif mode_dropdown.value == 'timeline'.
                        print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
                    else: # subtitle
                        start_time = "{:02d}:{:02d}:{:02d},{:03d}".format(int(segment.start // 3600), int((segment.start % 3600) // 60), int(segment.start % 60), int((segment.start % 1) * 1000))
                        end_time = "{:02d}:{:02d}:{:02d},{:03d}".format(int(segment.end // 3600), int((segment.end % 3600) // 60), int(segment.end % 60), int((segment. segment.end % 1) * 1000))
                        print("%d\n%s --> %s\n%s\n" % (segment.id, start_time, end_time, segment.text))
            наконец-то.
                # Удаление экземпляра модели для освобождения оперативной памяти
                дель-модель
        except Exception as e.
            print("Во время транскрипции произошла ошибка:")
            print(str(e))
        наконец-то.
            # Вызываем сбор мусора
            gc.collect()
        print("Транскрипция завершена.")

 

Интерфейс графического интерфейса сборки #
display(model_label, model_dropdown, language_label, language_dropdown, beam_size_label, beam_size_slider, compute_type_label, compute_ type_dropdown, mode_label, mode_dropdown, initial_prompt_label, initial_prompt_text, file_name_text, transcribe_button, output_area)
transcribe_button.on_click(transcribe_audio)
Пример распознавания многоговорящего кода

из pyannote.core import Segment

def get_text_with_timestamp(transcribe_res).
timestamp_texts = []для item в transcribe_res.
начало = элемент.начало
end = item.end
text = item.text.strip()
timestamp_texts.append((Segment(start, end), text))
return timestamp_texts

def add_speaker_info_to_text(timestamp_texts, ann).
spk_text = []для seg, text в timestamp_texts:
spk = ann.crop(seg).argmax()
spk_text.append((seg, spk, text))
return spk_text

def merge_cache(text_cache).
предложение = ''.join([item[-1] for item in text_cache])
spk = text_cache[0][1]start = round(text_cache[0][0].start, 1)
end = round(text_cache[-1][0].end, 1)
return Segment(start, end), spk, sentence

PUNC_SENT_END = [',', '. , '? , '!' , ",", "." , "?" , "!"]

def merge_sentence(spk_text).
merged_spk_text = []pre_spk = None
text_cache = []для seg, spk, text в spk_text:
если spk ! = pre_spk и pre_spk не None и len(text_cache) > 0:.
merged_spk_text.append(merge_cache(text_cache))
text_cache = [(seg, spk, text)]pre_spk = spk

elif text и len(text) > 0 и text[-1] в PUNC_SENT_END:
text_cache.append((seg, spk, text))
merged_spk_text.append(merge_cache(text_cache))
text_cache = []pre_spk = spk
еще.
text_cache.append((seg, spk, text))
pre_spk = spk
если len(text_cache) > 0.
merged_spk_text.append(merge_cache(text_cache))
return merged_spk_text

def diarize_text(transcribe_res, diarisation_result).
timestamp_texts = get_text_with_timestamp(transcribe_res)
spk_text = add_speaker_info_to_text(timestamp_texts, diarisation_result)
res_processed = merge_sentence(spk_text)
return res_processed

def write_to_txt(spk_sent, file).
with open(file, 'w') as fp.
для seg, spk, sentence в spk_sent.
line = f'{seg.start:.2f} {seg.end:.2f} {spk} {sentence}\n'
fp.write(line)

 

импортный резак
импорт шепот
import numpy as np
из pydub import AudioSegment
из loguru import logger
из faster_whisper import WhisperModel
из pyannote.audio import Pipeline
из pyannote.audio import Audio

из common.error.import ErrorCode

model_path = config["asr"]["faster-whisper-large-v3"]

# Тестовое аудио: https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_speaker_demo.wav
audio = ". /test/asr/data/asr_speaker_demo.wav"
asr_model = WhisperModel(model_path, device="cuda", compute_type="float16").
spk_rec_pipeline = Pipeline.from_pretrained("pyannote/speaker-diarisation-3.1", use_auth_token="your huggingface жетон")
spk_rec_pipeline.to(torch.device("cuda"))

asr_result, info = asr_model.transcribe(audio, language="zh", beam_size=5)
результат диаризации = spk_rec_pipeline(audio)

final_result = diarize_text(asr_result, diarisation_result)
для сегмента, spk, sent в final_result:
print("[%.2fs -> %.2fs] %s %s" % (segment.start, segment.end, sent, spk))

 

Похожие ресурсы

Основной проект: https://github.com/SYSTRAN/faster-whisper

Короткий код: https://www.letswrite.tw/colab-faster-whisper/

Передача видео с субтитрами: https://github.com/lewangdev/faster-whisper-youtube

Расшифровка голоса в реальном времени Fast Whisper: https://www.kaggle.com/code/xiu0714/faster-whisper

 

Пакет для установки одним щелчком мыши

https://pan.quark.cn/s/1b74d4cec6d6

Код расшифровки 1434

© заявление об авторских правах

Похожие статьи

Нет комментариев

Вы должны войти в систему, чтобы участвовать в комментариях!
Войти сейчас
нет
Нет комментариев...