Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex SpeechKit
  • Обзор технологий SpeechKit
  • Начало работы
  • Распознавание речи
  • Синтез речи
  • SpeechKit Hybrid
  • Справочники API
  • Практические руководства
    • Потоковое распознавание API v3
    • Автоматическое определение языка — API v3
    • Потоковое распознавание API v2
    • Синхронное распознавание API v2
    • Асинхронное распознавание формата LPCM — API v2
    • Асинхронное распознавание формата OggOpus — API v2
    • Синтез API v3
    • Синтез по шаблонам
    • Синтез речи в формате WAV — API v1
    • Синтез речи в формате OggOpus — API v1
    • Синтез из текста SSML — API v1
  • Поддерживаемые форматы аудио
  • Интеграция телефонии
  • Квоты и лимиты
  • Управление доступом
  • Правила тарификации
  • История изменений
  • Решение проблем
  1. Практические руководства
  2. Синтез API v3

Пример использования API v3 синтеза

Статья создана
Yandex Cloud
,
улучшена

Пример показывает, как с помощью SpeechKit API v3 синтезировать речь из текста в TTS-разметке в файл формата WAV.

В примере заданы следующие параметры синтеза:

  • формат синтезированного аудиофайла — LPCM с частотой дискретизации 22 050 Гц, контейнер WAV (значение по умолчанию);
  • нормализация громкости — LUFS (значение по умолчанию).

Преобразование и запись результата выполняются с помощью пакетов grpcio-tools и pydub и утилиты FFmpeg.

Аутентификация происходит от имени сервисного аккаунта с помощью IAM-токена. Подробнее об аутентификации в API SpeechKit см. Аутентификация в API SpeechKit.

Чтобы реализовать пример:

  1. Склонируйте репозиторий Yandex Cloud API:

    git clone https://github.com/yandex-cloud/cloudapi
    
  2. Создайте сервисный аккаунт для работы с API SpeechKit.

  3. Назначьте сервисному аккаунту роль ai.speechkit-tts.user или выше на каталог, в котором он был создан.

  4. Получите IAM-токен для сервисного аккаунта.

  5. Создайте клиентское приложение:

    Python 3
    1. Установите пакеты grpcio-tools и pydub с помощью менеджера пакетов pip:

      pip install grpcio-tools
      pip install pydub
      

      Пакет grpcio-tools нужен для генерации кода интерфейса клиента API v3 синтеза.

      Пакет pydub нужен для обработки полученных аудиофайлов.

    2. Скачайте утилиту FFmpeg для корректной работы пакета pydub. Добавьте путь к директории, в которой находится исполняемый файл, в переменную PATH. Для этого выполните команду:

      export PATH=$PATH:<путь_к_папке_с_исполняемым_файлом_FFmpeg>
      
    3. Перейдите в директорию со склонированным репозиторием Yandex Cloud API, создайте директорию output и сгенерируйте в ней код интерфейса клиента:

      cd <путь_к_директории_cloudapi>
      mkdir output
      python -m grpc_tools.protoc -I . -I third_party/googleapis \
        --python_out=output \
        --grpc_python_out=output \
        google/api/http.proto \
        google/api/annotations.proto \
        yandex/cloud/api/operation.proto \
        google/rpc/status.proto \
        yandex/cloud/operation/operation.proto \
        yandex/cloud/ai/tts/v3/tts_service.proto \
        yandex/cloud/ai/tts/v3/tts.proto
      

      В результате в директории output будут созданы файлы с интерфейсом клиента: tts_pb2.py, tts_pb2_grpc.py, tts_service_pb2.py, tts_service_pb2_grpc.py и файлы зависимостей.

    4. Создайте файл в корне директории output, например test.py, и добавьте в него следующий код:

      import io
      import grpc
      import pydub
      import argparse
      
      import yandex.cloud.ai.tts.v3.tts_pb2 as tts_pb2
      import yandex.cloud.ai.tts.v3.tts_service_pb2_grpc as tts_service_pb2_grpc
      
      # Определить параметры запроса. 
      def synthesize(iam_token, text) -> pydub.AudioSegment:
          request = tts_pb2.UtteranceSynthesisRequest(
              text=text,
              output_audio_spec=tts_pb2.AudioFormatOptions(
                  container_audio=tts_pb2.ContainerAudio(
                      container_audio_type=tts_pb2.ContainerAudio.WAV
                  )
              ),
              loudness_normalization_type=tts_pb2.UtteranceSynthesisRequest.LUFS
          )
      
          # Установить соединение с сервером.
          cred = grpc.ssl_channel_credentials()
          channel = grpc.secure_channel('tts.api.cloud.yandex.net:443', cred)
          stub = tts_service_pb2_grpc.SynthesizerStub(channel)
      
          # Отправить данные для синтеза.
          it = stub.UtteranceSynthesis(request, metadata=(
              ('authorization', f'Bearer {iam_token}'),
          ))
      
          # Собрать аудиозапись по чанкам.
          try:
              audio = io.BytesIO()
              for response in it:
                  audio.write(response.audio_chunk.data)
              audio.seek(0)
              return pydub.AudioSegment.from_wav(audio)
          except grpc._channel._Rendezvous as err:
              print(f'Error code {err._state.code}, message: {err._state.details}')
              raise err
      
      
      if __name__ == '__main__':
          parser = argparse.ArgumentParser()
          parser.add_argument('--token', required=True, help='IAM token')
          parser.add_argument('--text', required=True, help='Text for synthesis')
          parser.add_argument('--output', required=True, help='Output file')
          args = parser.parse_args()
      
          audio = synthesize(args.token, args.text)
          with open(args.output, 'wb') as fp:
              audio.export(fp, format='wav')
      
    5. Выполните созданный в предыдущем пункте файл:

      export IAM_TOKEN=<IAM-токен_сервисного_аккаунта>
      export TEXT='Я Яндекс Спичк+ит. Я могу превратить любой текст в речь. Теперь и в+ы — можете!'
      python output/test.py \
        --token ${IAM_TOKEN} \
        --output speech.wav \
        --text ${TEXT}
      

      Где:

      • IAM_TOKEN — IAM-токен сервисного аккаунта.
      • TEXT — текст в TTS-разметке, который нужно синтезировать.
      • --output — имя файла для записи аудио.

      В результате в директории cloudapi будет создан файл speech.wav с синтезированной речью.

См. также

  • Подробнее про API v3
  • Аутентификация в API SpeechKit

Была ли статья полезна?

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»