Синтез речи

Познакомимся, как использовать Python для преобразования текста в речь с использованием кроссплатформенной библиотеки pyttsx3. Этот пакет работает в Windows, Mac и Linux. Он использует родные драйверы речи, когда они доступны, и работает в оффлайн режиме.

Использует разные системы синтеза речи в зависимости от текущей ОС:

  • в Windows — SAPI5,
  • в Mac OS X — nsss,
  • в Linux и на других платформах — eSpeak.

Есть функции, которые здесь не рассматриваются, такие как система событий. Вы можете подключить движок к определенным событиям:

  • можно посчитать, сколько слов сказано, и обрезать его,
  • можно проверить каждое слово и отрезать его, если есть неуместные слова.

Всегда обращайтесь к официальной документации для получения наиболее точной, полной и актуальной информации https://pyttsx3.readthedocs.io/en/latest/open in new window

Установка пакетов в Windows

Используйте pip для установки пакета. В Windows, вам понадобится дополнительный пакет pypiwin32, который понадобится для доступа к собственному речевому API Windows.

pip install pyttsx3
pip install pypiwin32  # Только для Windows
1
2

Преобразование текста в речь

Для первой программой озвучивания текста используем код:

import pyttsx3

engine = pyttsx3.init()     # инициализация движка

# зададим свойства
engine.setProperty('rate', 150)     # скорость речи
engine.setProperty('volume', 0.9)   # громкость (0-1)

engine.say("I can speak!")      # запись фразы в очередь
engine.say("Я могу говорить!")  # запись фразы в очередь

# очистка очереди и воспроизведение текста
engine.runAndWait()

# выполнение кода останавливается, пока весь текст не сказан
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

В примере программы даны две фразы на английском и на русском языке. Существует голосовой набор по умолчанию, поэтому вам не нужно выбирать голос. В зависимости от версии windows будет озвучена соответствующая фраза. Например для английской версии windows услышим: "I can speak!"

Доступные синтезаторы по умолчанию

Доступные голоса будут зависеть от версии установленной систем. Вы можете получить список доступных голосов на вашем компьютере. Обратите внимание, что голоса, имеющиеся у вас на компьютере, могут отличаться от чьей-либо машины.

У каждого голоса есть несколько параметров, с которыми можно работать:

  • id (идентификатор в операционной системе),
  • name (имя),
  • languages (поддерживаемые языки),
  • gender (пол),
  • age (возраст).

У активного движка есть стандартный параметр ‘voices’, где содержится список всех доступных этому движку голосов. Получить список доступных голосов можно так:

import pyttsx3

engine = pyttsx3.init()    # Инициализировать голосовой движок.
voices = engine.getProperty('voices')

for voice in voices:    # голоса и параметры каждого
    print('------')
    print(f'Имя: {voice.name}')
    print(f'ID: {voice.id}')
    print(f'Язык(и): {voice.languages}')
    print(f'Пол: {voice.gender}')
    print(f'Возраст: {voice.age}')
1
2
3
4
5
6
7
8
9
10
11
12

Результат будет примерно таким:

Имя: Microsoft Hazel Desktop - English (Great Britain)
ID: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-GB_HAZEL_11.0
Язык(и): []
Пол: None
Возраст: None
------
Имя: Microsoft David Desktop - English (United States)
ID: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_DAVID_11.0
Язык(и): []
Пол: None
Возраст: None
------
Имя: Microsoft Zira Desktop - English (United States)
ID: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_ZIRA_11.0
Язык(и): []
Пол: None
Возраст: None
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Как видите, в Windows для большинства установленных голосов MS SAPI заполнены только «Имя» и ID.

Установка дополнительных голосов в Windows

При желании можно установить дополнительные языковые пакеты согласно инструкции https://support.microsoft.com/en-us/help/14236/language-packs#lptabs=win10open in new window

Для этого выполните указанные ниже действия.

  1. Нажмите кнопку Пуск , затем выберите Параметры > Время и язык > Язык.

  2. В разделе Предпочитаемые языки выберите Добавить язык.

    tts_language

  3. В разделе Выберите язык для установки выберите или введите название языка, который требуется загрузить и установить, а затем нажмите Далее.

  4. В разделе Установка языковых компонентов выберите компоненты, которые вы хотите использовать на языке.

    tts_language_install

  5. ВНИМАНИЕ: отключите первый пакет: "Install language pack and set as my Windows display language" - "Установите языковой пакет и установите мой язык отображения Windows"

    tts_language_install_uncheck

    Иначе переустановиться язык отображения операционной системы.

  6. Нажмите Установить.

После установки нового языкового пакета перезагрузка не требуется. Запустив код проверки установленных языков. Новый язык должен отобразиться в списке.

ПРИМЕЧАНИЕ

Не все языковые пакеты поддерживают синтез речи. Для этого опция Speech должны быть в описании установки.

Выбор голоса

Установить голос можно методом setProperty(). Например, используя голосовые идентификаторы, найденные ранее, вы можете настроить голос. В примере показано, как настроить один голос, чтобы сказать что-то, а затем использовать другой голос из другого языка, чтобы сказать что-то другое.

В Windows идентификатором служит адрес записи в системном реестре:

import pyttsx3
engine = pyttsx3.init()

en_voice_id = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_ZIRA_11.0"
ru_voice_id = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_RU-RU_IRINA_11.0"

# Use female English voice
engine.setProperty('voice', en_voice_id)
engine.say('Hello with my new voice.')

# Use female Russian voice
engine.setProperty('voice', ru_voice_id)
engine.say('Привет. Я знаю несколько языков.')

engine.runAndWait()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Как озвучить системное время в Windows

Пример консольного приложения которое будет называть неточное время может быть реализованно следующим кодом:

from datetime import datetime, date, time
import pyttsx3
import time

ru_voice_id = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_RU-RU_IRINA_11.0"

engine = pyttsx3.init()
engine.setProperty('voice', ru_voice_id)

def say_time(msg):
    engine.say(msg)
    engine.runAndWait()

time_checker = datetime.now()
say_time(f'Не точное Мурманское время: {time_checker.hour} часа {time_checker.minute} плюс минус 7 минут')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Привер риложения которое каждую минуту проговаривает текущее время по системным часам. Точнее, оно сообщает время при каждой смене минуты. Например, если вы запустите скрипт в 14:59:59, программа заговорит через секунду.

Программа будет отслеживать и называть время, пока вы не остановите ее сочетанием клавиш Ctrl+C в Windows.

from datetime import datetime, date, time
import pyttsx3
import time

ru_voice_id = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_RU-RU_IRINA_11.0"

engine = pyttsx3.init()
engine.setProperty('voice', ru_voice_id)

def say_time(msg):
    engine.say(msg)
    engine.runAndWait()

while True:
    time_checker = datetime.now()
    if time_checker.second == 0:
        say_time(f'Мурманское время: {time_checker.hour} часа {time_checker.minute} минут')
        time.sleep(55)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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

Для дальнейшего изучения библиотеки pyttsx3 вы можете заглянуть в англоязычную документацию, в том числе справку по классу и примеры.

Упражнения tkinter

  1. Напишите программу часы, которая показывает текущее время и имеет кнорку, при нажатии на которую можно ушлышать текуще время.
  2. Внесите измеения с программу что бы при произненсении времени программа корректно склоняла слова: "часы" и "минуты".
  3. Добавьте с помощью радиокнопки выбор языка озвучки часов.

Озвучиваем текст из файла

Не будем довольствоваться текстами в коде программы — пора научиться брать их извне. Тем более, это очень просто. В папке, где хранится только что рассмотренный нами скрипт, создайте файл test.txt с текстом на русском языке и в кодировке UTF-8. Теперь добавьте в конец кода такой блок:

text_file = open("test.txt", "r")
data = text_file.read()
engine.say(data, sync=True)
text_file.close()
1
2
3
4

Открываем файл на чтение, передаем содержимое в переменную data, затем воспроизводим голосом все, что в ней оказалось, и закрываем файл.

Упражнения tkinter

  1. Напишите программу текстовым полем и кнопкой которая будет озвучивать написанное.
  2. Добавьте меню выбора голоса с возможностью управлять такими параметрами, как высота голоса, громкость и скорость речи.

Модуль Google TTS — голоса из интернета

Google предлагает онлайн-озвучку текста с записью результата в mp3-файл. Это не для каждой задачи:

  • постоянно нужен быстрый интернет;
  • нельзя воспроизвести аудио средствами самого gtts;
  • скорость обработки текста ниже, чем у офлайн-синтезаторов.

Что касается голосов, английский и французский звучат очень реалистично. Русский голос Гугла — девушка, которая немного картавит и вдобавок произносит «ц» как «ч». По этой причине ей лучше не доверять чтение аудиокниг, имен и топонимов.

Еще один нюанс. Когда будете экспериментировать с кодом, не называйте файл «gtts.py» — он не будет работать! Выберите любое другое имя, например use_gtts.py.

Для работы необходимо установить пакет:

pip install gtts
1

Простейший код, который сохраняет текст на русском в аудиофайл:

from gtts import gTTS

tts = gTTS('И это тоже интересно!', lang='ru')
tts.save('sound_ru.mp3')
tts = gTTS("It's amazing!", lang='en')
tts.save('sound_en.mp3')
1
2
3
4
5
6

После запуска этого кода в директории, где лежит скрипт, появится запись. Для воспроизведения в питоне придется использовать pygame или pyglet.

Упражнения tkinter

  1. Напишите программу состояющую из текстового поля, кнопки выбора языка, кнопки "получить аудио". Программа должна преобразовывать текст набранный в текстовом поле в аудио файл, который будет сохраняться в папке с программой.
  2. Добавьте текстовое поле, куда можно ввести имя для получаемого файла. И сохранять полученный файл с заданным иметем. Реализуйте проверку полей и выводом диалогового окна с сообщением о соотвествующей ошибке.
  3. Добавьте в программу кнопку выбора каталога для сохранения файла.