Синтез речи в API v3
С помощью SpeechKit API v3 можно синтезировать речь из текста в TTS-разметке в файл формата WAV
В примере заданы следующие параметры синтеза:
- формат синтезированного аудиофайла — LPCM с частотой дискретизации 22 050 Гц, контейнер WAV
(значение по умолчанию); - нормализация громкости — LUFS (значение по умолчанию).
Преобразование и запись результата выполняются с помощью пакетов grpcio-tools
и pydub
и утилиты FFmpeg
Аутентификация происходит от имени сервисного аккаунта с помощью API-ключа или IAM-токена. Подробнее об аутентификации в API SpeechKit см. Аутентификация в API SpeechKit.
Чтобы реализовать пример:
-
Создайте сервисный аккаунт для работы с API SpeechKit.
-
Назначьте сервисному аккаунту роль
ai.speechkit-tts.user
или выше на каталог, в котором он был создан. -
Создайте клиентское приложение:
Python 3Java-
Склонируйте репозиторий Yandex Cloud API
:git clone https://github.com/yandex-cloud/cloudapi
-
Установите пакеты
grpcio-tools
иpydub
с помощью менеджера пакетов pip :pip install grpcio-tools && \ pip install pydub
Пакет
grpcio-tools
нужен для генерации кода интерфейса клиента API v3 синтеза. Пакетpydub
нужен для обработки полученных аудиофайлов. -
Скачайте
утилиту FFmpeg для корректной работы пакетаpydub
. Добавьте путь к папке, в которой находится исполняемый файл, в переменнуюPATH
. Для этого выполните команду:export PATH=$PATH:<путь_к_папке_с_исполняемым_файлом_FFmpeg>
-
Перейдите в папку со склонированным репозиторием 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
и файлы зависимостей. -
Создайте файл в корне папки
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')
-
Выполните созданный в предыдущем пункте файл:
export IAM_TOKEN=<IAM-токен_сервисного_аккаунта> export TEXT='Я Яндекс Спичк+ит. Я могу превратить любой текст в речь. Теперь и в+ы — можете!' python3 output/test.py \ --token ${IAM_TOKEN} \ --output speech.wav \ --text ${TEXT}
Где:
IAM_TOKEN
— IAM-токен сервисного аккаунта. Если для аутентификации от имени сервисного аккаунта вы используйте API-ключ, измените код Python-скрипта и вызов программы.TEXT
— текст в TTS-разметке, который нужно синтезировать.--output
— имя файла для записи аудио.
В результате в папке
cloudapi
будет создан файлspeech.wav
с синтезированной речью.
-
Установите зависимости:
sudo apt update && sudo apt install --yes default-jdk maven
-
Склонируйте репозиторий
с конфигурацией для приложения на Java:git clone https://github.com/yandex-cloud-examples/yc-speechkit-tts-java
-
Перейдите в папку репозитория:
cd yc-speechkit-tts-java
-
Скомпилируйте проект в этой папке:
mvn clean install
-
Перейдите в созданную папку
target
:cd target
-
Задайте API-ключ сервисного аккаунта и текст, который надо синтезировать:
export API_KEY=<API-ключ> && \ export TEXT='Я Яндекс Спичк+ит. Я могу превратить любой текст в речь. Теперь и в+ы — можете!'
-
Запустите Java-скрипт для синтеза речи:
java -cp speechkit_examples-1.0-SNAPSHOT.jar yandex.cloud.speechkit.examples.TtsV3Client ${TEXT}
В результате в папке
target
появится аудиофайлresult.wav
. В него записана речь из переменной окруженияTEXT
.
-