У сучасному швидкоплинному світі часто важко знайти час на перегляд довгих відео. Будь то освітній контент, зустрічі чи вебінари, інколи просто потрібно швидко переглянути основні моменти без перегляду всього відео. Тут у пригоді стане VideoToText. Цей проєкт автоматизує процес вилучення тексту з відеофайлів, дозволяючи швидко ознайомитися зі змістом.
Проблема
Багато хто з нас стикається з ситуаціями, коли у нас є відео, яке ми не маємо часу переглянути, але потрібно знати його зміст. Ручна транскрипція відеоконтенту займає багато часу і є непрактичною. Автоматизоване рішення може зекономити значну кількість часу та зусиль, швидко і точно перетворюючи відео в текст.
Технологічний стек
Щоб досягти цього, ми вибрали надійний технологічний стек:
- yt-dlp: Інструмент командного рядка для завантаження відео з YouTube та інших сайтів.
- FFmpeg: Багатофункціональний інструмент для обробки аудіо та відеофайлів, використовується тут для вилучення аудіо з відео.
- OpenAI Whisper: Сучасна модель розпізнавання мови від OpenAI, використовується для транскрипції аудіо в текст.
- Docker: Забезпечує легке налаштування та запуск проєкту в стабільному середовищі.
Пояснення Dockerfile
Dockerfile
створено для того, щоб забезпечити стабільне середовище для проєкту, гарантувати, що всі залежності будуть правильно встановлені, і що модель Whisper буде попередньо завантажена для ефективності. Ось пояснення Dockerfile
:
# Використовуйте офіційний образ Python 3.12 на базі Slim
FROM python:3.12-slim
# Встановіть змінні середовища для режиму non-interactive для apt
ENV DEBIAN_FRONTEND=noninteractive
# Оновіть ключі GPG та встановіть залежності
RUN apt clean && apt update && apt install -y ffmpeg git
# Встановіть бібліотеки Python
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r /app/requirements.txt
RUN pip install --upgrade --no-deps --force-reinstall git+https://github.com/openai/whisper.git
# Визначте аргументи збірки для моделі
ARG WHISPER_MODEL=small
# Встановіть змінні середовища
ENV WHISPER_MODEL=$WHISPER_MODEL
# Завантажте модель Whisper та кешуйте її
RUN python -c "import whisper; whisper.load_model('$WHISPER_MODEL')"
# Скопіюйте файли застосунку
COPY ./ /app
# Встановіть робочий каталог
WORKDIR /app
CMD ["python", "main.py"]
Пояснення:
FROM python:3.12-slim
: Використовує полегшену версію Python 3.12 як базовий образ.WORKDIR /app
: Встановлює робочий каталог у контейнері на/app
.COPY . /app
: Копіює вміст поточного каталогу в контейнер.RUN pip install --no-cache-dir ...
: Встановлює необхідні Python-пакети без кешування, щоб зменшити розмір образу.ARG WHISPER_MODEL=small
: Визначає змінну часу збірки для моделі Whisper.ENV WHISPER_MODEL=$WHISPER_MODEL
: Встановлює змінну середовища для моделі Whisper.RUN python -c "import whisper; whisper.load_model('$WHISPER_MODEL')"
: Попередньо завантажує вказану модель Whisper, щоб забезпечити її наявність у контейнері.EXPOSE 80
: Відкриває порт 80.CMD ["python", "main.py"]
: Запускає основний скрипт Python під час запуску контейнера.
Початок роботи
Щоб почати роботу з VideoToText, виконайте наступні кроки:
Клонуйте репозиторій
git clone https://github.com/vshloda/VideoToText.git
cd VideoToText
Створіть Docker-образ
docker compose build
<п>Запустіть Docker-контейнер <п>Для обробки відео з YouTube:
docker compose run --rm app python main.py --url "https://www.youtube.com/watch?v=example"
<п>Для обробки локальних відеофайлів:
docker compose run --rm app python main.py --file "files/video.mp4"
Сегментована обробка аудіо
Процес транскрипції включає поділ аудіо на менші, зручні сегменти. Такий підхід має кілька переваг:
- Ефективність: Менші сегменти легше і швидше обробляти.
- Точність: Модель може зосередитися на коротших відрізках аудіо, що зменшує ймовірність помилок.
Ось мінімальний кодовий фрагмент, що демонструє, як реалізується поділ аудіо:
def split_audio(audio, segment_length=10, sample_rate=16000):
segments = []
audio_length = len(audio) // sample_rate
for start in range(0, audio_length, segment_length):
end = min(start + segment_length, audio_length)
segment = audio[start * sample_rate:end * sample_rate]
segments.append((segment, start, end))
return segments
def convert_audio_to_text_whisper(model, audio_path):
audio = whisper.load_audio(audio_path)
segments = split_audio(audio, segment_length=10)
result_list = []
for segment, start, end in segments:
mel = whisper.log_mel_spectrogram(segment).to(model.device)
result = whisper.decode(model, mel)
result_list.append({
"start": start,
"end": end,
"text": result.text.strip()
})
return result_list
Модель Whisper
Модель Whisper від OpenAI є універсальною і потужною системою розпізнавання мови. Whisper пропонує різні розміри моделей, кожна з яких збалансовує продуктивність і використання ресурсів:
- tiny: Швидка і легка, підходить для швидкої транскрипції з обмеженими ресурсами.
- base: Хороший баланс між швидкістю і точністю.
- small: Забезпечує вищу точність при збереженні відносно високої швидкості.
- medium: Дуже точна транскрипція з помірними вимогами до ресурсів.
- large: Найточніша модель, але вимагає значних обчислювальних ресурсів.
Вибір правильної моделі залежить від ваших конкретних потреб і доступних ресурсів. У VideoToText ви можете легко змінювати моделі, встановлюючи змінну середовища WHISPER_MODEL
.
# Завантажте модель Whisper один раз і використовуйте її повторно
model = whisper.load_model(os.getenv('WHISPER_MODEL', 'small'))
Висновок
VideoToText - це інструмент для автоматизації транскрипції відеоконтенту, що дозволяє швидко зрозуміти основні моменти без перегляду всього відео. Хоча поточне налаштування проєкту забезпечує точну транскрипцію, майбутні вдосконалення можуть включати функцію узагальнення для виділення лише основної інформації з тексту.
Перегляньте проєкт VideoToText на GitHub, щоб розпочати.