Синтез речи в API v3
С помощью SpeechKit Hybrid можно синтезировать речь из текста.
-
Получите в Cloupard:- логин и пароль для доступа на стенд,- ссылку на метод распознавания аудио.
2. На основе логина и пароля сгенеририруйте токен доступа
(пример https://www.debugbear.com/basic-auth-header-generator).
(пример https://www.debugbear.com/basic-auth-header-generator).
3. Склонируйте репозиторий SpeechKit Hybrid:
git clone https://github.com/yandex-cloud/cloudapi
|
4. Установите пакеты grpcio-tools и pydub с помощью менеджера пакетов pip:
Пакет grpcio-tools нужен для генерации кода интерфейса клиента синтеза. Пакет pydub нужен для обработки полученных аудиофайлов.
5. Перейдите в папку со склонированным репозиторием SpeechKit Hybrid, создайте папку 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 и файлы зависимостей.
6. Создайте файл в корне папки output, например , скрипт speechkit_hybrid_tts.ру.
#pip install grpcio grpcio-tools для установки grpc
#pip install yandex-speechkit
#https://yandex.cloud/ru/docs/speechkit/tts/api/tts-examples-v3 установка описана здесь
import base64
import io
import grpc
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
TOKEN = '{{TOKEN}}'
TARGET = '{{TARGET}}'
TEXT_BASE64 = '{{TEXT}}'
RESULT_FILE_NAME= r'{{RESULT_FILE_NAME}}'
VOICE = '{{VOICE}}'
ROLE = '{{ROLE}}'
AUDIO_TYPE = '{{AUDIO_TYPE}}'
TEXT = base64.b64decode(TEXT_BASE64).decode('utf-8')
request = tts_pb2.UtteranceSynthesisRequest(
text=TEXT,
output_audio_spec=tts_pb2.AudioFormatOptions(
container_audio=tts_pb2.ContainerAudio(
container_audio_type=tts_pb2.ContainerAudio.OGG_OPUS if AUDIO_TYPE == 'OGG_OPUS' else tts_pb2.ContainerAudio.WAV if AUDIO_TYPE == 'WAV' else tts_pb2.ContainerAudio.MP3
)
),
# Параметры синтеза
hints=[
tts_pb2.Hints(voice= VOICE), # (Опционально) Задайте голос. Значение по умолчанию marina
tts_pb2.Hints(role = ROLE), # (Опционально) Укажите амплуа, только если голос их имеет
tts_pb2.Hints(speed=1.1), # (Опционально) Задайте скорость синтеза
],
loudness_normalization_type=tts_pb2.UtteranceSynthesisRequest.LUFS
)
# Установите соединение с сервером.
cred = grpc.ssl_channel_credentials()
channel = grpc.secure_channel(TARGET, cred)
stub = tts_service_pb2_grpc.SynthesizerStub(channel)
# Отправьте данные для синтеза.
it = stub.UtteranceSynthesis(request, metadata=[('authorization', f'Basic {TOKEN}')], timeout=100000)
# Соберите аудиозапись по порциям.
errorText = None
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:
errorText = f'Error code {err._state.code}, message: {err._state.details}'
if errorText is not None and errorText != "":
print(f"ERROR: {errorText}")
else:
with open(RESULT_FILE_NAME, 'wb') as fp:
fp.write(audio.getvalue())
print(f"RESULT: OK")
|
В этом скрипте:
-
параметр {{TOKEN}} - его нужно сгенерировать на основе полученного логина и пароля
-
параметр {{TARGET}} - имя метода TTS
-
параметр {{TEXT}} - текст для синтеза аудио в формате Base64 в кодировке UTF-8
-
параметр {{RESULT_FILE_NAME}} - это полное имя результирующего файла (в него будет помещен результат синтеза)
-
параметр {{VOICE}} - выбранный голос диктора (например alexander)
-
параметр {{ROLE}} - выбранная роль диктора (например good)
-
параметр {{AUDIO_TYPE}} - выбранный тип аудио файла (WAV, OGG_OPUS или MP3)
_____
7. Выполните созданный в предыдущем пункте файл.
python3 output/speechkit_hybrid_tts.ру
В случае успеха результат синтеза будет помещен в файл с именем {{RESULT_FILE_NAME}} и в консоли будет "RESULT: OK".
В случае ошибки - "ERROR: <текст ошибки>"