DiarAI / app.py
PacoFYM's picture
Update app.py
2ca0afe verified
import os
import tempfile
import datetime
import gradio as gr
import torch
import whisperx
from whisperx.diarize import DiarizationPipeline
# Определяем устройство: CUDA если доступна, иначе CPU
device = "cuda" if torch.cuda.is_available() else "cpu"
# Загружаем модель WhisperX с compute_type="int8" для ускорения на CPU
asr_model = whisperx.load_model(
"small",
device=device,
compute_type="int8" # изменено на int8 для ускорения
)
# Загружаем модель выравнивания для русского
align_model, metadata = whisperx.load_align_model(
language_code="ru",
device=device
)
# Инициализируем пайплайн диаризации (Pyannote) с токеном HF
hf_token = os.getenv("HUGGINGFACEHUB_API_TOKEN", None)
diarization_pipeline = DiarizationPipeline(
use_auth_token=hf_token,
device=device
)
def transcribe_with_diarization(audio_path):
# 1) ASR без детекции языка (принудительно ru), с batch_size=16
result = asr_model.transcribe(audio_path, language="ru", batch_size=16)
# 2) Выравнивание субтитров по аудио
aligned = whisperx.align(
result["segments"],
align_model,
metadata,
audio_path,
device
)
# 3) Диаризация
diarization = diarization_pipeline(audio_path)
# 4) Объединяем текстовые сегменты и спикеров
merged = whisperx.assign_word_speakers(diarization, aligned)["segments"]
# 5) Формируем текст для вывода
lines = []
for seg in merged:
spk = seg.get("speaker", "Speaker")
txt = seg.get("text", "").strip()
lines.append(f"[{spk}] {txt}")
return "\n".join(lines)
def export_to_txt(text):
# Сохраняем результат во временный файл и возвращаем путь
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"transcript_{timestamp}.txt"
path = os.path.join(tempfile.gettempdir(), filename)
with open(path, "w", encoding="utf-8") as f:
f.write(text)
return path
# Собираем интерфейс Gradio
app = gr.Blocks(title="🎙️ DiarAI: Транскрибация и диаризация (RU)")
with app:
gr.Markdown("""
## Транскрибация и диаризация (русский язык)
- Фиксированный язык распознавания: **ru** для повышения скорости.
- Диаризация спикеров через Pyannote.
""")
audio_input = gr.Audio(type="filepath", label="Загрузите аудио (только RU)")
transcribe_btn = gr.Button("▶️ Транскрибировать")
output_txt = gr.Textbox(label="Результат транскрипции", lines=20)
save_btn = gr.Button("💾 Экспорт в .txt")
download_file = gr.File(label="Скачать результат")
transcribe_btn.click(
fn=transcribe_with_diarization,
inputs=audio_input,
outputs=output_txt
)
save_btn.click(
fn=export_to_txt,
inputs=output_txt,
outputs=download_file
)
if __name__ == "__main__":
app.launch()