File size: 3,963 Bytes
2ffbc3f
045765c
adc6df0
 
2ffbc3f
adc6df0
 
 
 
 
045765c
adc6df0
 
045765c
 
 
adc6df0
2ffbc3f
 
 
 
 
 
 
adc6df0
045765c
2ffbc3f
045765c
 
 
 
 
 
 
 
adc6df0
 
2ffbc3f
045765c
 
 
 
 
adc6df0
2ffbc3f
 
 
 
 
 
 
045765c
2ffbc3f
 
adc6df0
2ffbc3f
 
 
 
 
adc6df0
2ffbc3f
adc6df0
2ffbc3f
045765c
 
 
 
 
 
 
 
 
2ffbc3f
 
045765c
 
adc6df0
 
 
2ffbc3f
045765c
adc6df0
045765c
2ffbc3f
045765c
2ffbc3f
 
adc6df0
045765c
adc6df0
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from PyPDF2 import PdfReader
from transformers import pipeline, MarianMTModel, MarianTokenizer
import torch
import gradio as gr
from gtts import gTTS

# Проверка доступности GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# Инициализация модели для суммаризации
summarizer = pipeline("summarization", model="philschmid/bart-large-cnn-samsum", device=0 if device.type == "cuda" else -1)

# Инициализация модели для перевода
translation_model_name = "Helsinki-NLP/opus-mt-en-ru"
translation_tokenizer = MarianTokenizer.from_pretrained(translation_model_name)
translation_model = MarianMTModel.from_pretrained(translation_model_name).to(device)

def parse_pdf(pdf_file):
    """Функция для извлечения текста из PDF файла."""
    reader = PdfReader(pdf_file)
    extracted_text = ""
    for page in reader.pages:
        extracted_text += page.extract_text() or ""
    return extracted_text

def summarize(text, max_length=130, min_length=30):
    """Функция для суммаризации текста."""
    # Разделяем текст на части, если он слишком большой
    max_chunk_size = 1024
    chunks = [text[i:i + max_chunk_size] for i in range(0, len(text), max_chunk_size)]
    summaries = []
    for chunk in chunks:
        result = summarizer(chunk, max_length=max_length, min_length=min_length, do_sample=False)
        summaries.append(result[0]['summary_text'])
    return " ".join(summaries)

def translate(text):
    """Функция для перевода текста на русский."""
    # Токенизация и перевод
    inputs = translation_tokenizer(text, return_tensors="pt", truncation=True, padding=True).to(device)
    translated_tokens = translation_model.generate(**inputs)
    translated_text = translation_tokenizer.decode(translated_tokens[0], skip_special_tokens=True)
    return translated_text

def text_to_speech(text, language='ru'):
    """Функция для преобразования текста в аудиофайл."""
    tts = gTTS(text=text, lang=language)
    audio_file = "output.mp3"
    tts.save(audio_file)
    return audio_file

def process_pdf(pdf_file, language):
    """Основная функция обработки PDF файла."""
    if not pdf_file:
        return "No input provided."

    # Извлечение текста из PDF
    extracted_text = parse_pdf(pdf_file)
    print(f"Extracted Text: {extracted_text}")

    # Суммаризация текста
    summary = summarize(extracted_text)
    print(f"Summary: {summary}")

    # Если выбран русский язык, переводим текст
    if language == "rus":
        translated_text = translate(summary)
        print(f"Translated Text: {translated_text}")
        final_text = translated_text
        audio_language = 'ru'
    else:
        final_text = summary
        audio_language = 'en'

    # Преобразование текста в аудио
    audio_file = text_to_speech(final_text, language=audio_language)
    return final_text, audio_file

# Создание Gradio интерфейса
with gr.Blocks() as demo:
    gr.Markdown("# PDF Summarizer, Translator, and Text-to-Speech")
    gr.Markdown("Upload a PDF file to summarize, translate (if needed), and convert to audio.")

    language = gr.Radio(choices=["eng", "rus"], label="Output Language", value="rus")
    pdf_input = gr.File(label="Upload PDF File", type="filepath")
    text_output = gr.Textbox(label="Processed Text", lines=10)
    audio_output = gr.Audio(label="Generated Audio", type="filepath")
    process_button = gr.Button("Process PDF")

    process_button.click(process_pdf, inputs=[pdf_input, language], outputs=[text_output, audio_output])

# Запуск приложения
demo.launch(debug=True)