Перевод статьи 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")