DialogScribe
based on GigaAm App wrapper
Микробиблиотека для транскрипции аудио и видео файлов на базе GigaAM с опциональной диаризацией спикеров через pyannote.
- Транскрипция аудио и видео любой длительности
- Диаризация спикеров через pyannote или гибридный подход
- Множество форматов вывода: TXT, JSON, SRT, VTT
- Пакетная обработка нескольких файлов
- CLI интерфейс для командной строки
- Простой Python API для интеграции в приложения
- Python ≥ 3.10
- FFmpeg установлен и доступен в PATH
- CUDA (опционально, для ускорения на GPU)
# 1. Клонировать репозиторий
git clone https://github.com/yaruslove/DialogScribe.git
cd https://github.com/yaruslove/DialogScribe
# 2. Установить GigaAM
git clone https://github.com/salute-developers/GigaAM.git
pip install -e ./GigaAM
# 3. Установить зависимости
pip install -r requirements.txt
# 4. (Опционально) Установить зависимости для диаризации
pip install -r requirements-diarization.txt
# 5. Установить пакет
pip install -e .python -m venv venv source venv/bin/activate # Linux/Mac или venv\Scripts\activate # Windows
Для использования диаризации спикеров необходим HuggingFace токен и доступ к моделям:
-
Создайте токен на HuggingFace
- Нажмите "New token"
- Выберите права "Read"
- Скопируйте токен
-
Примите условия использования моделей:
- pyannote/segmentation-3.0 - нажмите "Agree and access repository"
- pyannote/speaker-diarization-3.1 - нажмите "Agree and access repository"
- pyannote/speaker-diarization - нажмите "Agree and access repository" (опционально, fallback)
- pyannote/speaker-diarization-community-1
-
Установите переменную окружения:
# Способ 1: экспорт в консоли
export HF_TOKEN=your_actual_token_here
# Способ 2: создать .env файл
cp .env.example .env
# Затем отредактировать .env и вставить ваш токен- Проверьте настройку:
python setup_diarization.pyЭтот скрипт проверит доступ к моделям и поможет настроить диаризацию.
from gigaam_transcriber import GigaAMTranscriber
# Создание транскрибера
transcriber = GigaAMTranscriber()
# Простая транскрипция
result = transcriber.transcribe("audio.wav")
print(result.text)
# С диаризацией спикеров
result = transcriber.transcribe(
"meeting.mp4",
diarization="pyannote",
num_speakers=3
)
# Вывод по сегментам
for seg in result.segments:
print(f"[{seg.start:.1f}-{seg.end:.1f}] {seg.speaker}: {seg.text}")
# Сохранение в файл
result.save("transcript.json", format="json")
result.save("subtitles.srt")# Простая транскрипция
gigaam-transcribe audio.wav
# С диаризацией
gigaam-transcribe meeting.mp4 -d pyannote --speakers 3 -o meeting.txt
# Вывод в JSON
gigaam-transcribe interview.mp3 -d pyannote -f json -o interview.json
# Субтитры SRT
gigaam-transcribe video.mp4 -f srt -o subtitles.srt
# Пакетная обработка
gigaam-batch *.mp3 -o transcripts/ -d pyannoteОсновной класс для транскрипции.
from gigaam_transcriber import GigaAMTranscriber
transcriber = GigaAMTranscriber(
model_name="v3_e2e_rnnt", # Модель GigaAM
device="auto", # "auto", "cuda", "cpu"
hf_token=None, # HuggingFace токен (или из HF_TOKEN)
verbose=False # Подробный вывод
)result = transcriber.transcribe(
input_path, # Путь к файлу
output_path=None, # Путь для сохранения
diarization="none", # "none", "pyannote", "hybrid"
num_speakers=None, # Количество спикеров
output_format="txt", # "txt", "json", "srt", "vtt"
merge_same_speaker=True, # Объединять сегменты одного спикера
min_segment_gap=0.5 # Gap для объединения (сек)
)# Транскрипция аудио
result = transcriber.audio2text("audio.wav", diarization="pyannote")
# Транскрипция видео
result = transcriber.video2text("video.mp4", diarization="pyannote")results = transcriber.transcribe_batch(
["file1.mp3", "file2.mp4"],
output_dir="transcripts/",
diarization="pyannote"
)Результат транскрипции.
result.text # Полный текст
result.segments # Список сегментов
result.duration # Длительность (сек)
result.language # Язык
result.model_name # Модель
# Форматирование
result.to_txt() # Текст с таймкодами
result.to_json() # JSON
result.to_srt() # Субтитры SRT
result.to_vtt() # Субтитры VTT
# Сохранение
result.save("output.txt")
result.save("output.json", format="json")
# Утилиты
result.get_speakers() # Список спикеров
result.filter_by_speaker("Спикер №1") # ФильтрацияСегмент транскрипции.
segment.text # Текст сегмента
segment.start # Начало (сек)
segment.end # Конец (сек)
segment.speaker # Спикер
segment.duration # Длительность| Модель | Описание | Рекомендация |
|---|---|---|
v3_e2e_rnnt |
С пунктуацией и нормализацией (RNNT) | Рекомендуется |
v3_e2e_ctc |
С пунктуацией и нормализацией (CTC) | Альтернатива |
v3_rnnt |
Без пунктуации (RNNT) | - |
v3_ctc |
Без пунктуации (CTC) | - |
[00:00:00 - 00:17:41] Спикер №1: текст...
[00:18:98 - 00:39:26] Спикер №2: текст...
{
"metadata": {
"source": "meeting.mp4",
"duration": 3600.5,
"speakers_count": 3
},
"segments": [...],
"full_text": "..."
}1
00:00:00,000 --> 00:00:17,410
[Спикер №1] текст...
WEBVTT
00:00:00.000 --> 00:00:17.410
[Спикер №1] текст...
- none — без диаризации, только транскрипция
- pyannote — полная диаризация через pyannote/speaker-diarization-3.1
- hybrid — гибридный подход: VAD + эмбеддинги + кластеризация (легче, но менее точно)
from gigaam_transcriber import GigaAMTranscriber
with GigaAMTranscriber() as transcriber:
result = transcriber.transcribe(
"meeting.mp4",
diarization="pyannote",
num_speakers=4,
output_format="json"
)
# Статистика по спикерам
for speaker in result.get_speakers():
filtered = result.filter_by_speaker(speaker)
duration = sum(s.duration for s in filtered.segments)
print(f"{speaker}: {duration:.0f} сек")
result.save("meeting_transcript.json")from gigaam_transcriber import GigaAMTranscriber
transcriber = GigaAMTranscriber()
result = transcriber.transcribe("video.mp4")
# SRT субтитры
result.save("subtitles.srt")
# WebVTT субтитры
result.save("subtitles.vtt")from gigaam_transcriber import GigaAMTranscriber
from pathlib import Path
transcriber = GigaAMTranscriber()
audio_files = list(Path("recordings").glob("*.mp3"))
def progress(current, total, filename):
print(f"Processing {current}/{total}: {filename}")
results = transcriber.transcribe_batch(
audio_files,
output_dir="transcripts",
diarization="pyannote",
progress_callback=progress
)
print(f"Processed {len(results)} files")gigaam_transcriber/
├── __init__.py # Публичный API
├── transcriber.py # Основной класс GigaAMTranscriber
├── audio_processor.py # Обработка аудио/видео
├── diarization.py # Диаризация спикеров
├── segment_merger.py # Сшивка сегментов
├── formatters.py # Форматирование вывода
├── data_models.py # Структуры данных
├── exceptions.py # Исключения
├── utils.py # Утилиты
└── cli.py # CLI интерфейс
# Запуск всех тестов
pytest tests/ -v
# Тесты без модели (быстрые)
pytest tests/ -v -m "not requires_model"
# Тесты с моделью (требуют GPU)
pytest tests/ -v -m requires_modelMIT License