데이터 분석가

PDF파일 음성 변환 Pdf2Voice (Udemy Project 9) 본문

유데미 부트캠프 프로젝트(Final)

PDF파일 음성 변환 Pdf2Voice (Udemy Project 9)

PlintAn 2023. 6. 29. 17:25

안녕하세요!

 

 

이번 시간에는 PDF 파일을 읽어 음성으로 변환시키는 PDF 리더기 파이썬 코드를 구축해보겠습니다 !

 

작동 원리는

 

Flask 웹 프레임워크를 사용하여 PDF 파일을 업로드하고

업로드한 파일에서 텍스트를 추출한 후 이를 음성으로 변환하여

다운로드할 수 있는 웹 애플리케이션입니다

 

 

구성

 

1.upload.html

2.play.html

3.PDF2Voice.py

 

으로 이루어져 있고 

 

 

1.upload.html

<!DOCTYPE html>
<html>
<head>
    <title>파일 업로드</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            overflow: hidden;
            background: url(C:\Users\hospc\Desktop\Final_Project\no.9 PDF\stars.mp4) no-repeat center center fixed;
            -webkit-background-size: cover;
            -moz-background-size: cover;
            -o-background-size: cover;
            background-size: cover;
        }

        #content {
            position: relative;
            z-index: 1;
            width: 100%;
            height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            font-family: Arial, sans-serif;
            color: #ffffff;
            text-align: center;
        }

        .container {
            width: 400px;
            padding: 20px;
            background-color: rgba(0, 0, 0, 0.7);
            border-radius: 10px;
        }

        .container h1 {
            margin-bottom: 20px;
        }

        .container ul.messages {
            list-style: none;
            padding: 0;
            margin-bottom: 20px;
        }

        .container ul.messages li {
            margin-bottom: 5px;
        }

        .container form {
            text-align: center;
        }

        .container input[type="file"] {
            margin-bottom: 10px;
        }

        .container input[type="submit"] {
            background-color: #4caf50;
            color: #ffffff;
            border: none;
            padding: 10px 20px;
            text-align: center;
            text-decoration: none;
            display: inline-block;
            font-size: 16px;
            border-radius: 5px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div id="content">
        <div class="container">
            <h1>파일 업로드</h1>
            {% with messages = get_flashed_messages() %}
                {% if messages %}
                    <ul class="messages">
                        {% for message in messages %}
                            <li>{{ message }}</li>
                        {% endfor %}
                    </ul>
                {% endif %}
            {% endwith %}
            <form method="post" enctype="multipart/form-data" action="{{ url_for('upload') }}">
                <input type="file" name="file" accept=".pdf">
                <input type="submit" value="업로드">
            </form>
        </div>
    </div>
</body>
</html>

우리가 사용할 웹 페이지 !

2.play.html

 

<!DOCTYPE html>
<html>
<head>
    <title>음성 재생</title>
</head>
<body>
    <h1>음성 재생</h1>
    <audio controls autoplay>
        <source src="{{ url_for('static', filename=filename) }}" type="audio/mpeg">
    </audio>
    <p><a href="{{ url_for('upload') }}">새로운 파일 업로드</a></p>
</body>
</html>

결과

재생합니다

3.PDF2Voice.py

 

from flask import Flask, render_template, request, flash, redirect, url_for, send_file
import os
import tempfile
import pyttsx3
from PyPDF2 import PdfReader

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_actual_secret_key_here'

ALLOWED_EXTENSIONS = {'pdf'}

def allowed_file(filename):
    # 파일 확장자가 허용된 확장자인지 확인합니다
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

def extract_text_from_pdf(file_path):
    # PDF 파일로부터 텍스트 내용을 추출합니다
    with open(file_path, 'rb') as file:
        pdf_reader = PdfReader(file)
        text = ''
        for page in pdf_reader.pages:
            text += page.extract_text()
        return text

def convert_text_to_speech(text):
    # pyttsx3 라이브러리를 사용하여 텍스트를 음성으로 변환합니다
    engine = pyttsx3.init()
    output_dir = 'C:\\Users\\hospc\\Desktop\\Final_Project\\no.9 PDF'
    os.makedirs(output_dir, exist_ok=True)  # 출력 디렉토리가 없으면 생성합니다
    save_path = os.path.join(output_dir, 'output.mp3')  # 출력 오디오 파일의 경로를 지정합니다
    engine.save_to_file(text, save_path)
    engine.runAndWait()
    return save_path

@app.route('/', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        if 'file' not in request.files:
            flash('파일이 없습니다.')
            return redirect(request.url)

        file = request.files['file']

        if file.filename == '':
            flash('파일이 선택되지 않았습니다.')
            return redirect(request.url)

        if not allowed_file(file.filename):
            flash('PDF 파일만 업로드할 수 있습니다.')
            return redirect(request.url)

        temp_dir = tempfile.mkdtemp(dir='C:\\Users\\hospc\\Desktop\\Final_Project')
        file_path = os.path.join(temp_dir, file.filename)
        file.save(file_path)

        text = extract_text_from_pdf(file_path)

        if text:
            save_path = convert_text_to_speech(text)
            flash('음성 변환이 완료되었습니다.')
            return redirect(url_for('download', filename=os.path.basename(save_path)))
        else:
            flash('PDF 파일에서 텍스트를 추출할 수 없습니다.')
            return redirect(request.url)

    return render_template('upload.html')

@app.route('/download/<filename>')
def download(filename):
    filepath = os.path.join('C:\\Users\\hospc\\Desktop\\Final_Project\\no.9 PDF', filename)
    if os.path.exists(filepath) and os.path.isfile(filepath):
        return send_file(filepath, as_attachment=True)
    else:
        flash('파일을 찾을 수 없습니다.')
        return redirect(url_for('upload'))

if __name__ == '__main__':
    app.run(debug=True)

저는 코드들의 작동 방식은

 

Flask 웹 프레임워크를 사용하여 PDF 파일을 업로드하고

업로드한 파일에서 텍스트를 추출한 후 이를 음성으로 변환하여

다운로드할 수 있는 웹 애플리케이션입니다

PDF to Voice

잘 됩니다 !!

 

 

 

Comments