faster-whisper: как расшифровать запись через Python и сохранить текст
Установка faster-whisper, русская запись на CPU, генератор segments, сохранение TXT и JSON, проверка VAD и полноты результата.
Выберите библиотеку для своей задачи
faster-whisper — реализация распознавания Whisper на движке CTranslate2. Эта инструкция относится к Python-библиотеке: вы управляете чтением результата и его сохранением из кода. Приложения с похожим названием, готовые Windows-сборки и графические оболочки могут добавлять собственные команды и экспорт. Не переносите их параметры в Python без проверки.
Если нужен привычный вызов из терминала, начните с инструкции по команде openai-whisper. Библиотека удобна для повторяемой обработки файлов и включения распознавания в свой сценарий. Для разовой расшифровки установка окружения может оказаться избыточной: получите текст аудиофайла в Транскрибаторе, если подходит онлайн-обработка.
Перед работой определите результат: чистый текст для редактора или сегменты с временем для дальнейшей обработки. Ни один из вариантов не подтверждает личность говорящего. Для отдельных этапов выравнивания и диаризации предназначен процесс проверки WhisperX; это другая задача и отдельный проект.
Подготовьте короткую пробу на CPU
Официальная документация указывает установку пакета faster-whisper из PyPI. Создайте отдельное Python-окружение, активируйте его по правилам своей ОС и установите пакет именно туда. На дату проверки README требует Python 3.9 или новее. Сохраните версии Python, faster-whisper и ctranslate2: без них повторить ошибку будет труднее.
python -m venv .venv # активируйте окружение для своей ОС python -m pip install faster-whisper python -m pip show faster-whisper ctranslate2
В примере ниже используется многоязычная small, процессор и int8. Это отправная точка для короткого русского фрагмента, а не обещание скорости или лучшего качества. При первом обращении по имени модель может загружаться из сети. Для автономной работы подготовьте модель заранее и проверьте запуск с локальным каталогом.
Декодирование аудио в этой библиотеке выполняет PyAV с библиотеками FFmpeg в пакете. Отдельная системная команда ffmpeg не является обязательным условием этого базового примера. Для GPU зависимости другие: сначала сверьте совместимость CTranslate2, CUDA и cuDNN по документации выбранной версии. Рабочее окружение не следует менять методом случайного понижения пакетов.
Обойдите генератор и сохраните два результата
Сохраните следующий код в transcribe_sample.py рядом с sample.wav. Запускайте его из этой папки командой python transcribe_sample.py. На другом компьютере сначала замените путь и проверьте доступ к модели. Код — учебная заготовка; он не выполнялся на вашей записи и не содержит замера производительности.
from pathlib import Path
import json
from faster_whisper import WhisperModel
model = WhisperModel("small", device="cpu", compute_type="int8")
segments, info = model.transcribe(
"sample.wav", language="ru", task="transcribe",
beam_size=5, vad_filter=False
)
rows = []
for segment in segments:
rows.append({
"start": segment.start, "end": segment.end,
"text": segment.text.strip()
})
Path("sample.txt").write_text(
"\n".join(row["text"] for row in rows), encoding="utf-8"
)
Path("sample-segments.json").write_text(
json.dumps(rows, ensure_ascii=False, indent=2), encoding="utf-8"
)
print("Сохранено сегментов:", len(rows))Ключевой шаг — цикл for. Распознавание ленивое: наличие segments не означает, что весь файл уже обработан. Если только вызвать transcribe и выйти из программы, ожидаемого готового текста может не быть. Генератор также исчерпывается при чтении: второй цикл по нему не вернёт те же сегменты. В примере данные один раз собирают в rows и уже из этого списка создают оба файла.
TXT здесь содержит слова без временных меток. JSON сохраняет границы сегментов в секундах, но не является файлом SRT и не предназначен для прямого импорта как субтитры. Если нужен только текст, не добавляйте к нему случайные таймкоды. Для длинных записей учтите, что этот простой пример хранит все сегменты в памяти; производственный сценарий может сохранять их постепенно и отдельно отмечать успешное завершение.
Проверьте полноту до настройки ускорения
После сообщения о сохранении откройте именно созданные файлы. Прослушайте первую фразу, участок в середине, тихую реплику и последнее предложение. Сверьте имена, числа и отрицания. Убедитесь, что JSON не пуст и его последний сегмент относится к реальному концу речи. Конечное время сегмента не обязано совпадать с длительностью файла: после речи может быть тишина.
Для отдельной пробы можно включить vad_filter=True — фильтр участков без речи. Сравните с вариантом без фильтра на том же фрагменте, особенно возле пауз и тихих ответов. VAD отделяет речь от неречевых участков; он не исправляет слова и не назначает имена участников. Если часть реплики исчезла, зафиксируйте место, а не объявляйте результат автоматически очищенным.
При сравнении скорости записывайте модель, устройство, тип вычислений, beam_size и число потоков. Отделяйте время первой загрузки модели от обработки подготовленного файла. Быстро завершившийся запуск с пропущенной речью не равноценен полному результату. Числа из чужого теста нельзя считать прогнозом для вашего ноутбука.
Модель готова, а текст ещё не сохранён
Учебный пример: редактор написал вызов transcribe, увидел сообщение о загрузке модели и закрыл программу. Затем ожидал найти TXT рядом с аудио. Библиотека сама не выполняет показанный здесь пользовательский экспорт.
| Наблюдение | Возможная причина | Проверка |
|---|---|---|
| Модель загружена, TXT нет | Генератор не прочитан | Дойти до конца цикла и сохранения |
| Второй экспорт пуст | Повторное чтение генератора | Сохранять оба файла из rows |
| Нет тихого ответа | Настройки VAD или распознавания | Сравнить одинаковую пробу без VAD |
| Конец JSON раньше конца файла | После речи тишина либо пропуск | Прослушать последний речевой участок |
Редактор добавляет обход segments и явное сохранение, открывает оба результата и сверяет последнюю реплику. В журнале он различает «модель готова», «обработка закончилась» и «файлы проверены».
Карточка пробы faster-whisper
Исходник и длительность: Python / faster-whisper / CTranslate2: Модель / путь: Устройство / compute_type: Язык / задача / beam_size: VAD включён: Генератор прочитан полностью: Пути TXT и JSON: Число сегментов: Начало / тихая речь / конец проверены: Ошибка или предупреждение дословно: Исправленная версия текста:
Частые вопросы
Почему transcribe не создал TXT?
Метод возвращает сегменты и сведения о распознавании. В этой заготовке обход и запись файлов выполняет ваш код. Проверьте, дошла ли программа до цикла и сохранения.
Можно ли пройти segments дважды?
После полного чтения генератор исчерпан. Если нужны несколько представлений, сохраните сегменты в структуру данных или создавайте выходные файлы во время одного прохода.
Нужен ли интернет при каждом запуске?
Для загрузки отсутствующих моделей сеть может понадобиться. Автономность проверяют с подготовленной локальной моделью и доступными зависимостями, а не по названию библиотеки.
JSON из примера — это субтитры?
Нет. Это список сегментов с временем в секундах. SRT имеет другую структуру и требует собственного преобразования и проверки синхронизации.
VAD улучшает все записи?
Универсального обещания нет. Проверьте одинаковую пробу с фильтром и без него, в том числе тихие ответы и речь рядом с паузами.