В этой статье вы узнаете, как создавать программы преобразования текста в речь на Python. Вы создадите программу Python, которая преобразует любой предоставленный вами текст в речь.
Это интересный эксперимент, позволяющий узнать, что можно создать с помощью Python, и продемонстрировать вам мощь Python и его модулей.
Как заставить Python говорить?
Python предоставляет сотни тысяч пакетов, которые позволяют разработчикам писать практически любые типы программ. Два кроссплатформенных пакета, которые вы можете использовать для преобразования текста в речь с помощью Python, — это PyTTSx3 и gTTS.
Вместе мы создадим простую программу для преобразования текста в речь. Эта программа покажет вам, насколько мощным является Python как язык. Он позволяет нам делать даже сложные вещи с помощью всего нескольких строк кода.
Библиотеки, которые заставят Python заговорить
В этом руководстве мы попробуем две разные библиотеки преобразования текста в речь:
- PyTTSx3
- gTTS (API Google для преобразования текста в речь)
Они обе доступны в Python Package Index (PyPI), официальном репозитории стороннего программного обеспечения Python. Ниже вы можете увидеть страницу на PyPI для двух библиотек:
Существуют разные способы создания программы на Python, преобразующей текст в речь, и некоторые из них специфичны для операционной системы.
Причина, по которой мы будем использовать PyTTSx3 и gTTS, заключается в том, что мы хотим создать программу, которая может работать одинаково на Windows, Mac и Linux (кроссплатформенная).
Давайте сначала посмотрим, как работает PyTTSx3…
Преобразование текста в речь с помощью модуля PyTTSx3
Перед использованием этого модуля не забудьте установить его с помощью pip:
pip install pyttsx3
Если вы используете Windows и видите одно из следующих сообщений об ошибке, вам также придется установить модуль pypiwin32:
No module named win32com.client
No module named win32
No module named win32api
Для этого модуля вы также можете использовать pip:
pip install pypiwin32
Если модуль pyttsx3 не установлен, при выполнении программы Python вы увидите следующую ошибку:
ModuleNotFoundError: No module named 'pyttsx3'
Существует также модуль PyTTSx (без цифры 3 на конце), но он несовместим ни с Python 2, ни с Python 3.
Мы используем PyTTSx3, поскольку он совместим с обеими версиями Python.
Замечательно, что для того, чтобы заставить ваш компьютер говорить на Python, вам нужно всего лишь несколько строк кода:
# import the module
import pyttsx3
# initialise the pyttsx3 engine
engine = pyttsx3.init()
# convert text to speech
engine.say("I love Python for text to speech, and you?")
engine.runAndWait()
Запустите программу, и вы услышите сообщение, исходящее от вашего компьютера.
Всего четыре строки кода! (без комментариев)
Также обратите внимание на разницу, которую запятые вносят в вашу фразу. Попробуйте убрать запятую перед «and you?» и снова запустить программу.
Вы видите (слышите) разницу?
Кроме того, вы можете использовать несколько вызовов функции say(), например:
engine.say("I love Python for text to speech, and you?")
можно также записать как:
engine.say("I love Python for text to speech")
engine.say("And you?")
Все сообщения, переданные в функцию say(), не будут произнесены, если интерпретатор Python не увидит вызов runAndWait(). Вы можете подтвердить это, закомментировав последнюю строку программы.
Изменить голос с помощью PyTTSx3
Что еще мы можем сделать с помощью PyTTSx?
Давайте посмотрим, сможем ли мы изменить голос, начиная с предыдущей программы.
Для начала давайте посмотрим на доступные голоса. Для этого мы можем использовать следующую программу:
import pyttsx3
engine = pyttsx3.init()
voices = engine.getProperty('voices')
for voice in voices:
print(voice)
Вы увидите вывод, аналогичный показанному ниже:
<Voice id=com.apple.speech.synthesis.voice.Alex
name=Alex
languages=['en_US']
gender=VoiceGenderMale
age=35>
<Voice id=com.apple.speech.synthesis.voice.alice
name=Alice
languages=['it_IT']
gender=VoiceGenderFemale
age=35>
<Voice id=com.apple.speech.synthesis.voice.alva
name=Alva
languages=['sv_SE']
gender=VoiceGenderFemale
age=35>
<Voice id=com.apple.speech.synthesis.voice.amelie
name=Amelie
languages=['fr_CA']
gender=VoiceGenderFemale
age=35>
<Voice id=com.apple.speech.synthesis.voice.anna
name=Anna
languages=['de_DE']
gender=VoiceGenderFemale
age=35>
<Voice id=com.apple.speech.synthesis.voice.carmit
name=Carmit
languages=['he_IL']
gender=VoiceGenderFemale
age=35>
<Voice id=com.apple.speech.synthesis.voice.damayanti
name=Damayanti
languages=['id_ID']
gender=VoiceGenderFemale
age=35>
......
....
...
etc...
Доступные голоса зависят от вашей системы и могут отличаться от голосов на другом компьютере.
Учитывая, что наше сообщение на английском языке, мы хотим найти все голоса, которые поддерживают английский язык. Для этого мы можем добавить оператор if внутри предыдущего цикла for.
Также, чтобы сделать вывод короче, мы просто выводим поле идентификатора для каждого объекта Voice в списке голосов (скоро вы поймете, почему):
import pyttsx3
engine = pyttsx3.init()
voices = engine.getProperty('voices')
for voice in voices:
if 'en_US' in voice.languages or 'en_GB' in voice.languages:
print(voice.id)
Вот идентификаторы голоса, напечатанные программой:
com.apple.speech.synthesis.voice.Alex
com.apple.speech.synthesis.voice.daniel.premium
com.apple.speech.synthesis.voice.Fred
com.apple.speech.synthesis.voice.samantha
com.apple.speech.synthesis.voice.Victoria
Давайте выберем женский голос, для этого воспользуемся следующим:
engine.setProperty('voice', voice.id)
Я выбираю идентификатор com.apple.speech.synthesis.voice.samantha, поэтому наша программа становится такой:
import pyttsx3
engine = pyttsx3.init()
engine.setProperty('voice', 'com.apple.speech.synthesis.voice.samantha')
engine.say("I love Python for text to speech, and you?")
engine.runAndWait()
Как вам это? 🙂
Вы также можете изменить стандартную скорость и громкость голоса, установив значение следующих свойств для движка перед вызовами функции say().
Ниже вы можете увидеть несколько примеров того, как это сделать:
Ставка
rate = engine.getProperty('rate')
engine.setProperty('rate', rate+50)
Объем
volume = engine.getProperty('volume')
engine.setProperty('volume', volume-0.25)
Поэкспериментируйте с голосовым идентификатором, скоростью и громкостью, чтобы найти настройки, которые вам больше всего нравятся!
Преобразование текста в речь с помощью gTTS
Теперь давайте создадим программу, используя модуль gTTS.
Мне интересно узнать, какой из них проще в использовании и есть ли преимущества у gTTS по сравнению с PyTTSx или наоборот.
Как обычно, устанавливаем gTTS с помощью pip:
pip install gtts
Одним из различий между gTTS и PyTTSx является то, что gTTS также предоставляет инструмент командной строки gtts-cli.
Давайте сначала познакомимся с gtts-cli, прежде чем писать программу на Python.
Чтобы увидеть все доступные языки, вы можете использовать:
gtts-cli --all
Впечатляющий список!
Первое, что вы можете сделать с помощью CLI, — это преобразовать текст в файл mp3, который затем можно воспроизвести с помощью любого подходящего приложения в вашей системе.
Мы преобразуем то же сообщение, что и в предыдущем разделе: «Мне нравится Python для преобразования текста в речь, а вам?»
gtts-cli 'I love Python for text to speech, and you?' --output message.mp3
У меня Mac, и я буду использовать afplay для воспроизведения файла MP3.
afplay message.mp3
Сразу видно, что запятая и вопросительный знак не имеют большого значения. Один балл PyTTSx, который справляется с этим лучше.
Я могу использовать флаг –lang, чтобы указать другой язык, вы можете увидеть пример на итальянском языке…
gtts-cli 'Mi piace programmare in Python, e a te?' --lang it --output message.mp3
…в сообщении говорится: «Мне нравится программировать на Python, а вам?»
Теперь мы напишем программу на Python, которая будет делать то же самое.
# Import the gTTS module
from gtts import gTTS
# This the os module so we can play the MP3 file generated
import os
# Generate the audio using the gTTS engine. We are passing the message and the language
audio = gTTS(text='I love Python for text to speech, and you?', lang='en')
# Save the audio in MP3 format
audio.save("message.mp3")
# Play the MP3 file
os.system("afplay message.mp3")
Если вы запустите программу, вы услышите сообщение.
Помните, что я использую afplay, потому что у меня Mac. Вы можете просто заменить его на любую утилиту, которая может воспроизводить звуки в вашей системе.
Просматривая документацию gTTS, я также могу читать текст медленнее, передавая параметр slow функции gTTS().
audio = gTTS(text='I love Python for text to speech, and you?', lang='en', slow=True)
Попробуйте!
Изменить голос с помощью gTTS
Насколько легко изменить голос с помощью gTTS?
Возможно ли вообще настроить голос?
Найти ответ на этот вопрос было непросто. Я немного поигрался с параметрами, передаваемыми в функцию gTTS(), и заметил, что английский голос меняется, если значение параметра lang равно «en-US» вместо «en».
Параметр языка использует языковые теги IETF.
audio = gTTS(text='I love Python for text to speech, and you?', lang='en-US')
Кажется, голос теперь лучше учитывает запятую и вопросительный знак, чем раньше.
Также из другого теста следует, что «en» (язык по умолчанию) совпадает с «en-GB».
Мне кажется, что в PyTTSx3 доступно больше разнообразия голосов по сравнению с gTTS.
Прежде чем закончить этот раздел, я также хочу показать вам способ создания одного MP3-файла, содержащего несколько сообщений, в данном случае на разных языках:
from gtts import gTTS
import os
audio_en = gTTS('hello', lang='en')
audio_it = gTTS('ciao', lang='it')
with open('hello_ciao.mp3', 'wb') as f:
audio_en.write_to_fp(f)
audio_it.write_to_fp(f)
os.system("afplay hello_ciao.mp3")
Функция write_to_fp () записывает байты в файлоподобный объект, который мы сохраняем как hello_ciao.mp3.
Имеет ли это смысл?
Работа с преобразованием текста в речь в автономном режиме
Последний вопрос о преобразовании текста в речь в Python.
Можно ли это сделать офлайн или необходимо подключение к Интернету?
Давайте запустим первую из созданных нами программ с помощью PyTTSx3.
По моим тестам, все работает хорошо, поэтому я могу преобразовывать текст в аудио, даже если я не в сети.
Это может быть очень удобно при создании любого голосового программного обеспечения.
Давайте попробуем gTTS сейчас…
Если я запускаю программу с использованием gTTS после отключения соединения, я вижу следующую ошибку:
gtts.tts.gTTSError: Connection error during token calculation: HTTPSConnectionPool(host='translate.google.com', port=443): Max retries exceeded with url:/(Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x11096cca0>: Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'))
Итак, gTTS не работает без подключения, поскольку ему требуется доступ к translate.google.com.
Если вы хотите, чтобы Python говорил офлайн, используйте PyTTSx3.
Заключение
Мы многое обсудили!
Вы увидели, как использовать два кроссплатформенных модуля Python, PyTTSx3 и gTTS, для преобразования текста в речь и заставить ваш компьютер говорить!
Мы также рассмотрели настройку голоса, скорости, громкости и языка, которые, насколько я могу судить по программам, созданным нами здесь, стали более гибкими с модулем PyTTSx3.
Планируете ли вы использовать это для конкретного проекта?
Дайте мне знать в комментариях ниже 🙂