Синтез речи в API v3

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

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

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

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

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

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

  1. Создайте сервисный аккаунт для работы с API SpeechKit.

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

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

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

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

      git clone https://github.com/yandex-cloud/cloudapi
              
    2. Установите пакеты grpcio-tools и pydub с помощью менеджера пакетов pip:

      pip install grpcio-tools && \
              pip install pydub
              

      Пакет grpcio-tools нужен для генерации кода интерфейса клиента API v3 синтеза. Пакет pydub нужен для обработки полученных аудиофайлов.

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

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

      cd <путь_к_папке_cloudapi>
              mkdir output
              python3 -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/validation.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 и файлы зависимостей.

    5. Создайте файл в корне папки 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
              
              # Задайте настройки синтеза.
              # Вместо iam_token передавайте api_key при аутентификации с API-ключом
              #def synthesize(api_key, text) -> pydub.AudioSegment:
              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
                          )
                      ),
                      # Параметры синтеза
                      hints=[
                        tts_pb2.Hints(voice= 'alexander'), # (Опционально) Задайте голос. Значение по умолчанию marina
                        tts_pb2.Hints(role = 'good'), # (Опционально) Укажите амплуа, только если голос их имеет
                        tts_pb2.Hints(speed=1.1), # (Опционально) Задайте скорость синтеза
                      ],
              
                      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=(
              
                  # Параметры для аутентификации с IAM-токеном
                      ('authorization', f'Bearer {iam_token}'),
                  # Параметры для аутентификации с API-ключом от имени сервисного аккаунта
                  #   ('authorization', f'Api-Key {api_key}'),
                  ))
              
                  # Соберите аудиозапись по порциям.
                  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 or API key')
                  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')
              
    6. Выполните созданный в предыдущем пункте файл:

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

      Где:

      • IAM_TOKENIAM-токен сервисного аккаунта. Если для аутентификации от имени сервисного аккаунта вы используйте API-ключ, измените код Python-скрипта и вызов программы.
      • TEXT — текст в TTS-разметке, который нужно синтезировать.
      • --output — имя файла для записи аудио.

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

    1. Установите зависимости:

      sudo apt update && sudo apt install --yes default-jdk maven
              
    2. Склонируйте репозиторий с конфигурацией для приложения на Java:

      git clone https://github.com/yandex-cloud-examples/yc-speechkit-tts-java
              
    3. Перейдите в папку репозитория:

      cd yc-speechkit-tts-java
              
    4. Скомпилируйте проект в этой папке:

      mvn clean install
              
    5. Перейдите в созданную папку target:

      cd target
              
    6. Задайте API-ключ сервисного аккаунта и текст, который надо синтезировать:

      export API_KEY=<API-ключ> && \
              export TEXT='Я Яндекс Спичк+ит. Я могу превратить любой текст в речь. Теперь и в+ы — можете!'
              
    7. Запустите Java-скрипт для синтеза речи:

      java -cp speechkit_examples-1.0-SNAPSHOT.jar yandex.cloud.speechkit.examples.TtsV3Client ${TEXT}
              

      В результате в папке target появится аудиофайл result.wav. В него записана речь из переменной окружения TEXT.

См. также