Создание аудиокниг с помощью Python

Перевод статьи How to Create Audiobooks Using Python.

Как вы, возможно, уже знаете, Python – замечательный язык программирования, потому что он позволяет нам делать практически все! Это также означает, что мы можем создавать собственное программное обеспечение. В этом уроке мы узнаем, как синтезировать речь, научим Python читать PDF-файлы и даже переведем и озвучим их!

Итак, Python должен прочитать нам PDF-файл и перевести его. Сначала мы попытаемся создать аудиокнигу на английском языке. Таким образом, первое, что мы должны сделать, – это извлечь текст из PDF. Для этого нам понадобится модуль tika. Как обычно, чтобы установить tika, нужно поколдовать с pip.

pip install tika

Tika — это модуль, используемый для обнаружения и извлечения контента. После установки нужно импортировать объект parser.

from tika import parser

Далее нам понадобится метод from_file(), принимающий два аргумента. Первый аргумент принимает имя PDF-файла, второй (дополнительный) – тип искомых данных. Если не указать второй аргумент, будет произведён поиск всех типов данных: от метаданных до самого контента. Здесь meta вернёт метаданные, text – текст, а параметр xmlContent – XML данные.

raw = parser.from_file('comment.pdf')

Теперь, получив все данные, мы должны извлечь текст. Это можно сделать, выбрав content в нашем raw:

raw_text = raw['content']

Проблема модуля Tika заключается в том, что при слишком большом количестве страниц всё может сломаться. Поэтому мы воспользуемся другим методом. Если PDF-файл довольно короткий, определённо стоит воспользоваться Tika. Однако, вы также можете использовать модуль PyPDF2.

pip install PyPDF2

Итак, приступим:

import PyPDF2

Первым делом откроем наш документ и прочитаем его, используя метод open() и класс PdfFileReader(). Метод open() принимает два аргумента: имя файла и режим чтения. Здесь rb означает “чтение бинарного файла” (“read binary”). Затем класс PdfFileReader принимает pdf_document.

pdf_document = open("welcome.pdf", "rb")
pdf_document_read = PyPDF2.PdfFileReader(pdf_document)

Далее мы определяем количество страниц методом numPages. Нам это понадобится для цикла for, который будет итерироваться от страницы 1 до последней.

number_of_pages = pdf_document_read.numPages

Затем мы начинаем цикл for для счета страниц.

for page in range(1, number_of_pages):

Теперь нам нужно получить одну страницу с помощью getPage() и извлечь из неё текст методом extractText().

one_page = pdf_document_read.getPage(page)
raw_text = one_page.extractText()
import pyttsx3

Вызовем init(), чтобы инициализировать модуль.

engine = pyttsx3.init()

Мы можем настроить голос, громкость и скорость при помощи engine.getProperty(). Метод setProperty() принимает два аргумента: свойство, которое необходимо изменить, и его новое значение. В нашем случае установлен женский голос (voices[1].id) с максимальной громкостью (1) и темпом 128.

oices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)

volume = engine.getProperty('volume')
engine.setProperty('volume', 1.0)

rate = engine.getProperty('rate')
engine.setProperty('rate', 128)

Чтобы синтезировать речь и прочитать текст вслух, воспользуемся методом engine.say().

engine.say(raw_text)
engine.runAndWait()

Весь код будет выглядеть как-то так:

import PyPDF2

pdf_document = open("welcome.pdf", "rb")
pdf_document_read = PyPDF2.PdfFileReader(pdf_document)
number_of_pages = pdf_document_read.numPages

for page in range(1, number_of_pages):
    one_page = pdf_document_read.getPage(page)
    raw_text = one_page.extractText()
    import pyttsx3
    engine = pyttsx3.init()
    voices = engine.getProperty('voices')
    engine.setProperty('voice', voices[1].id)
    volume = engine.getProperty('volume')
    engine.setProperty('volume', 1.0)
    rate = engine.getProperty('rate')
    engine.setProperty('rate', 128)
    engine.say(raw_text)

    engine.runAndWait()

В данном примере у нас был английский текст, озвученный на английском. Теперь же мы попробуем перевести текст на другой язык и прослушать перевод. В этом случае первая часть кода остаётся неизменной – это всё, что касается работы с pdf. Но в начале цикла for мы кое-что изменим: добавим перевод и произведём чтение на нужном нам языке.

Первым делом установим googletrans.

pip install googletrans

Теперь мы можем приступить к переводу текста.

from googletrans import Translator

Далее вызываем Translator().

translator = Translator()

Мы воспользуемся методом translate(). В его синтаксисе первый аргумент принимает текст на перевод, а второй – язык, на который мы хотим перевести. В данном случае текст переводится на французский ('fr').

translated = translator.translate(raw_text, dest='fr')

Переведя текст, мы должны извлечь из него текстовую часть.

translated_2 = translated.text

Таким образом мы переведем и сохраним результат в переменной translated_2. Теперь нам нужен модуль, который будет переводить и сохранять озвученный текст в mp3. Тут нам пригодятся gTTS и PlaySound:

pip install gTTS
pip install playsound

import gtts
from playsound import playsound

У класса gtts.gTTS() есть несколько аргументов. Однако мы будем использовать только два: первый аргумент – это текст, который нужно прочитать, а второй – язык, на котором будет прочитан текст. Мы будем читать текст на французском языке (fr).

Причина, по которой мы используем здесь gTTS вместо pyttsx3, заключается в более естественном звучании: когда текст читается на французском языке с помощью gTTS, это будет звучать так, как будто текст читает француз, а не носитель английского языка.

text = gtts.gTTS(translated_2, lang="fr")

Далее мы сохраним озвученный текст в формате mp3. Назовем его text.mp3:

text.save("text.mp3")

Чтобы проиграть сохранённый mp3, используем playsound():

playsound("text.mp3")

Получится примерно следующий код:

import PyPDF2

pdf_document = open("welcome.pdf", "rb")
pdf_document_read = PyPDF2.PdfFileReader(pdf_document)
number_of_pages = pdf_document_read.numPages

for page in range(1, number_of_pages):
    one_page = pdf_document_read.getPage(page)
    raw_text = one_page.extractText()

    from googletrans import Translator
   
    translator = Translator()
    translated = translator.translate(raw_text, dest='fr')
    translated_2 = translated.text

    import gtts
    from playsound import playsound

    tts = gtts.gTTS(translated_2, lang="fr")
    tts.save("text.mp3")
    playsound("text.mp3")