Синтез речи в 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.
-