Использование API преобразования текста в речь с Python

1. Обзор

1215f38908082356.png

API преобразования текста в речь позволяет разработчикам генерировать речь, максимально приближенную к человеческой. API преобразует текст в аудиоформаты, такие как WAV, MP3 или Ogg Opus. Он также поддерживает ввод данных на языке разметки синтеза речи (SSML) для указания пауз, чисел, форматирования даты и времени, а также других инструкций по произношению.

В этом руководстве вы сосредоточитесь на использовании API преобразования текста в речь с помощью Python.

Что вы узнаете

  • Как настроить свою среду
  • Как перечислить поддерживаемые языки
  • Как составить список доступных голосов
  • Как синтезировать аудио из текста

Что вам понадобится

  • Проект Google Cloud
  • Браузер, например Chrome или Firefox.
  • Знание языка Python

Опрос

Как вы будете использовать этот учебный материал?

Прочитайте только от начала до конца. Прочитайте текст и выполните упражнения.

Как бы вы оценили свой опыт работы с Python?

Новичок Средний Профессионал

Как бы вы оценили свой опыт использования сервисов Google Cloud?

Новичок Средний Профессионал

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Cloud Shell — среду командной строки, работающую в облаке.

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . 853e55310c205094.png .

3c1dabeca90e44e5.png

Если вы запускаете Cloud Shell впервые, вам будет показан промежуточный экран с описанием его возможностей. Если вам был показан промежуточный экран, нажмите «Продолжить» .

9c92662c6a846a5c.png

Подготовка и подключение к Cloud Shell займут всего несколько минут.

9f0e51b578fecce5.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.

После подключения к Cloud Shell вы увидите, что прошли аутентификацию и что проект настроен на ваш идентификатор проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list

вывод команды

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project

вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью следующей команды:

gcloud config set project <PROJECT_ID>

вывод команды

Updated property [core/project].

3. Настройка среды

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

gcloud services enable texttospeech.googleapis.com

Вы должны увидеть что-то подобное:

Operation "operations/..." finished successfully.

Теперь вы можете использовать API преобразования текста в речь!

Перейдите в свою домашнюю директорию:

cd ~

Создайте виртуальное окружение Python для изоляции зависимостей:

virtualenv venv-texttospeech

Активируйте виртуальную среду:

source venv-texttospeech/bin/activate

Установите IPython и клиентскую библиотеку Text-to-Speech API:

pip install ipython google-cloud-texttospeech

Вы должны увидеть что-то подобное:

...
Installing collected packages: ..., ipython, google-cloud-texttospeech
Successfully installed ... google-cloud-texttospeech-2.16.3 ...

Теперь вы готовы использовать клиентскую библиотеку API преобразования текста в речь!

На следующих шагах вы будете использовать интерактивный интерпретатор Python под названием IPython , который вы установили на предыдущем шаге. Чтобы начать сессию, запустите ipython в Cloud Shell:

ipython

Вы должны увидеть что-то подобное:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.18.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

Вы готовы отправить свой первый запрос и перечислить поддерживаемые языки...

4. Перечислите поддерживаемые языки.

В этом разделе вы найдете список всех поддерживаемых языков.

Скопируйте следующий код в свою сессию IPython:

from typing import Sequence

import google.cloud.texttospeech as tts


def unique_languages_from_voices(voices: Sequence[tts.Voice]):
    language_set = set()
    for voice in voices:
        for language_code in voice.language_codes:
            language_set.add(language_code)
    return language_set


def list_languages():
    client = tts.TextToSpeechClient()
    response = client.list_voices()
    languages = unique_languages_from_voices(response.voices)

    print(f" Languages: {len(languages)} ".center(60, "-"))
    for i, language in enumerate(sorted(languages)):
        print(f"{language:>10}", end="\n" if i % 5 == 4 else "")
        

Уделите немного времени изучению кода и посмотрите, как он использует метод клиентской библиотеки list_voices для создания списка поддерживаемых языков.

Вызовите функцию:

list_languages()

В результате вы должны получить следующий (или более обширный) список:

---------------------- Languages: 58 -----------------------
     af-ZA     am-ET     ar-XA     bg-BG     bn-IN
     ca-ES    cmn-CN    cmn-TW     cs-CZ     da-DK
     de-DE     el-GR     en-AU     en-GB     en-IN
     en-US     es-ES     es-US     eu-ES     fi-FI
    fil-PH     fr-CA     fr-FR     gl-ES     gu-IN
     he-IL     hi-IN     hu-HU     id-ID     is-IS
     it-IT     ja-JP     kn-IN     ko-KR     lt-LT
     lv-LV     ml-IN     mr-IN     ms-MY     nb-NO
     nl-BE     nl-NL     pa-IN     pl-PL     pt-BR
     pt-PT     ro-RO     ru-RU     sk-SK     sr-RS
     sv-SE     ta-IN     te-IN     th-TH     tr-TR
     uk-UA     vi-VN    yue-HK

В списке представлены 58 языков и их варианты, такие как:

  • Китайский и тайваньский мандаринский диалект.
  • Австралийский, британский, индийский и американский английский.
  • Французы из Канады и Франции.
  • Португальцы из Бразилии и Португалии.

Этот список не является окончательным и пополняется по мере появления новых голосов.

Краткое содержание

Этот шаг позволил вам составить список поддерживаемых языков.

5. Перечислите доступные голоса.

В этом разделе вы найдете список голосов, доступных на разных языках.

Скопируйте следующий код в свою сессию IPython:

import google.cloud.texttospeech as tts


def list_voices(language_code=None):
    client = tts.TextToSpeechClient()
    response = client.list_voices(language_code=language_code)
    voices = sorted(response.voices, key=lambda voice: voice.name)

    print(f" Voices: {len(voices)} ".center(60, "-"))
    for voice in voices:
        languages = ", ".join(voice.language_codes)
        name = voice.name
        gender = tts.SsmlVoiceGender(voice.ssml_gender).name
        rate = voice.natural_sample_rate_hertz
        print(f"{languages:<8} | {name:<24} | {gender:<8} | {rate:,} Hz")
        

Уделите немного времени изучению кода и посмотрите, как он использует метод клиентской библиотеки list_voices(language_code) для вывода списка голосов, доступных для заданного языка.

Теперь получите список доступных немецких голосов:

list_voices("de")

Вы должны увидеть что-то подобное:

------------------------ Voices: 20 ------------------------
de-DE    | de-DE-Neural2-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Neural2-B          | MALE     | 24,000 Hz
...
de-DE    | de-DE-Standard-A         | FEMALE   | 24,000 Hz
de-DE    | de-DE-Standard-B         | MALE     | 24,000 Hz
...
de-DE    | de-DE-Studio-B           | MALE     | 24,000 Hz
de-DE    | de-DE-Studio-C           | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-A          | FEMALE   | 24,000 Hz
de-DE    | de-DE-Wavenet-B          | MALE     | 24,000 Hz
...

Доступны различные женские и мужские голоса, а также стандартные голоса, голоса WaveNet, Neural2 и Studio:

  • Стандартные голоса генерируются алгоритмами обработки сигналов.
  • Голоса WaveNet, Neural2 и Studio — это голоса более высокого качества, синтезированные с помощью моделей машинного обучения и звучащие более естественно.

Теперь получите список доступных англоязычных голосов:

list_voices("en")

В итоге у вас должно получиться что-то подобное:

------------------------ Voices: 90 ------------------------
en-AU    | en-AU-Neural2-A          | FEMALE   | 24,000 Hz
...
en-AU    | en-AU-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Neural2-A          | FEMALE   | 24,000 Hz
...
en-GB    | en-GB-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Standard-A         | FEMALE   | 24,000 Hz
...
en-IN    | en-IN-Wavenet-A          | FEMALE   | 24,000 Hz
...
en-US    | en-US-Neural2-A          | MALE     | 24,000 Hz
...
en-US    | en-US-News-K             | FEMALE   | 24,000 Hz
...
en-US    | en-US-Standard-A         | MALE     | 24,000 Hz
...
en-US    | en-US-Studio-M           | MALE     | 24,000 Hz
...
en-US    | en-US-Wavenet-A          | MALE     | 24,000 Hz
...

Помимо выбора нескольких голосов разного пола и качества, доступны различные акценты: австралийский, британский, индийский и американский английский.

Уделите немного времени, чтобы перечислить доступные голоса для предпочитаемых вами языков и вариантов (или даже для всех):

list_voices("fr")
list_voices("pt")
list_voices()

Краткое содержание

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

6. Синтез аудио из текста.

Вы можете использовать API преобразования текста в речь для преобразования строки в аудиоданные. Вы можете настроить выходные данные синтеза речи различными способами, включая выбор уникального голоса или модуляцию выходного сигнала по высоте тона, громкости, скорости речи и частоте дискретизации .

Скопируйте следующий код в свою сессию IPython:

import google.cloud.texttospeech as tts


def text_to_wav(voice_name: str, text: str):
    language_code = "-".join(voice_name.split("-")[:2])
    text_input = tts.SynthesisInput(text=text)
    voice_params = tts.VoiceSelectionParams(
        language_code=language_code, name=voice_name
    )
    audio_config = tts.AudioConfig(audio_encoding=tts.AudioEncoding.LINEAR16)

    client = tts.TextToSpeechClient()
    response = client.synthesize_speech(
        input=text_input,
        voice=voice_params,
        audio_config=audio_config,
    )

    filename = f"{voice_name}.wav"
    with open(filename, "wb") as out:
        out.write(response.audio_content)
        print(f'Generated speech saved to "{filename}"')
        

Уделите немного времени изучению кода и посмотрите, как он использует метод клиентской библиотеки synthesize_speech для генерации аудиоданных и сохранения их в виде файла wav .

Теперь составьте предложения с несколькими разными акцентами:

text_to_wav("en-AU-Neural2-A", "What is the temperature in Sydney?")
text_to_wav("en-GB-Neural2-B", "What is the temperature in London?")
text_to_wav("en-IN-Wavenet-C", "What is the temperature in Delhi?")
text_to_wav("en-US-Studio-O", "What is the temperature in New York?")
text_to_wav("fr-FR-Neural2-A", "Quelle est la température à Paris ?")
text_to_wav("fr-CA-Neural2-B", "Quelle est la température à Montréal ?")

Вы должны увидеть что-то подобное:

Generated speech saved to "en-AU-Neural2-A.wav"
Generated speech saved to "en-GB-Neural2-B.wav"
Generated speech saved to "en-IN-Wavenet-C.wav"
Generated speech saved to "en-US-Studio-O.wav"
Generated speech saved to "fr-FR-Neural2-A.wav"
Generated speech saved to "fr-CA-Neural2-B.wav"

Чтобы загрузить все сгенерированные файлы одновременно, вы можете использовать следующую команду Cloud Shell из вашей среды Python:

!cloudshell download *.wav

Подтвердите действие, и ваш браузер загрузит файлы:

44382e3b7a3314b0.png4dbccf007cd73b91.png

Откройте каждый файл и послушайте результат.

Краткое содержание

На этом этапе вы смогли использовать API преобразования текста в речь для конвертации предложений в аудиофайлы формата wav . Подробнее о создании голосовых аудиофайлов читайте здесь.

7. Поздравляем!

1215f38908082356.png

Вы научились использовать API преобразования текста в речь на языке Python для генерации речи, максимально приближенной к человеческой!

Уборка

Для очистки среды разработки используйте Cloud Shell:

  • Если вы всё ещё находитесь в сессии IPython, вернитесь в командную оболочку: exit
  • Прекратите использование виртуальной среды Python: deactivate
  • Удалите папку виртуального окружения: cd ~ ; rm -rf ./venv-texttospeech

Чтобы удалить свой проект Google Cloud, используйте Cloud Shell:

  • Получите текущий идентификатор проекта: PROJECT_ID=$(gcloud config get-value core/project)
  • Убедитесь, что это именно тот проект, который вы хотите удалить: echo $PROJECT_ID
  • Удалите проект: gcloud projects delete $PROJECT_ID

Узнать больше

Лицензия

Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.