나는 개발자다/실전 파이썬

유튜브 자동화 #2. PDF 텍스트 추출, 음성 변환, MP3 파일로 저장

강기원 2021. 11. 3. 21:58

이번 강의는 PDF 파일의 각 페이지에서 텍스트를 추출하고, 음성으로 변환 후 MP3 파일로 저장하는 파이썬 프로그램을 만들어 본다. 최종 목적은 PDF 파일을 동영상 파일로 변환해서 유튜브에 업로드하는 과정을 자동화하는 것이다.

 

프로그램의 전체 기능은 아래와 같다.

Step #1. make jpeg image from pdf file
PDF의 각 페이지를 JPEG 이미지 파일로 저장

Step #2. make mp3 file form pdf file
PDF의 각 페이지에서 텍스트를 추출하고 음성으로 변환 후(Text to speech) MP3 파일로 저장

Step #3. make mp4 by combining jpeg image and mp3 audio one by one
각 페이지별 이미지와 MP3 파일을 결합하여 MP4 파일을 생성

Step #4. make final mp4 by combining all mp4 files
각 페이지에 해당하는 MP4 파일을 순서대로 결합하여 최종 MP4 파일 생성

 

최종 프로그램이 성공한다면 모든 진행 내용을 PDF로 정리한 후 동영상으로 변환해서 유튜브에 올릴 생각이다.

 

오늘의 과제는 'PDF 파일의 모든 페이지에서 텍스트 추출, 음성 변환 후 MP3 파일로 저장하는 파이썬 프로그램'을 만드는 것이다.

 

PDF의 각 페이지를 이미지 파일로 추출하는 기능은 아래 페이지에 있다.

2021.11.01 - [나는 개발자다/실전 파이썬] - [파이썬] PDF 파일의 모든 페이지를 이미지 파일로 저장하기

 

 

필요한 라이브러리를 설치한다.

 

오늘 프로그램에 필요한 모듈은 아래와 같다.

  • pyttsx3: 텍스트를 음성으로 변환하는 기능이 있다. (Text To Speech)
  • pdfplumber: 텍스트를 스트링으로 추출하는 기능을 사용할 것이다.
  • PyPDF2: PDF 파일이 전체 몇 페이지인지 확인하는 기능을 사용한다.

pip install을 이용하여 설치한다.

 

 

파이썬 코드는 아래와 같다.

 

    def readPageText(self, data_dir, pdf_file_name):

        pdf_file_path = data_dir + pdf_file_name
        pdfFile = open(pdf_file_path, 'rb')

        pdfReader = PyPDF2.PdfFileReader(pdfFile)

        pages = pdfReader.numPages
        print('page number = ' + str(pages))

        audio_file_list = []

        with pdfplumber.open(pdf_file_path) as pdf:
            for i in range(pages):
                page = pdf.pages[i]
                text = page.extract_text()
                print(text)
                speaker = pyttsx3.init()
                speaker.say(text)
                speaker.runAndWait()

                audio_prefix = Path(pdf_file_path).stem
                print(audio_prefix)
                image_name = audio_prefix + '-page-' + str(i).zfill(3) + self.MP3_EXT
                image_file_path = data_dir + image_name
                speaker.save_to_file(text, image_file_path)
                speaker.runAndWait()
                audio_file_list.append(image_file_path)

        return audio_file_list

 

readPageText(self, data_dir, pdf_file_name)

 

Input

data_dir: pdf 파일이 위치하는 전체 경로를 입력한다.

pdf_file_name: pdf 파일 이름을 입력한다.

 

Output

audio_file_list: 저장된 mp3 파일의 전체 경로를 리턴한다.

 

 

실행 결과를 로그로 찍었다.

page number = 3
안녕하세요.
걍교쥬입니다.
오늘 강의는 파이썬으로 오디오북 만들기입니다.
audiobook_test
여기는 테스트 페이지 두 번째입니다.
audiobook_test
이것으로 강의를 마칩니다.
감사합니다.
audiobook_test
['E:\\workspace\\python\\pdf_to_mp4_converter/data/audiobook_test-page-000.mp3', 'E:\\workspace\\python\\pdf_to_mp4_converter/data/audiobook_test-page-001.mp3', 'E:\\workspace\\python\\pdf_to_mp4_converter/data/audiobook_test-page-002.mp3']

 

테스트용 PDF는 3페이지로 되어 있고, 각 페이지별 mp3 파일이 정상적으로 저장되었다.

파이썬-실행-경과-오디오-파일-생성

 

PDF의 첫 번째 페이지에서 최종 추출된 MP3 파일이다. 

audiobook_test-page-000.mp3
0.26MB

 

다음 과제는 각각의 jpg 파일과 mp3 파일을 결합하여 mp4 파일을 3개 생성하는 파이썬 프로그램을 만들 것이다.