Использование 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 Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

Запустить Cloud Shell

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

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

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

3c1dabeca90e44e5.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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

После подключения к 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 и клиентскую библиотеку 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 License.