Синтез речи из текста с помощью Яндекс SpeechKit
В статье описан процесс подключения Яндекс SpeechKit API и программная реализация синтеза речи из текста с помощью этого API. Тестировалось на релизе платформы 8.3.16.1224. Может использоваться в любой конфигурации. Синтез речи может использоваться для самых разных целей, в моём случае потребовалось перевести лекции из текстовых файлов в звук
- Описание
- Подробнее
Описание
Disclaimer: на Инфостарте есть статья описывающая распознавание речи в текст:
Сервис Яндекс SpeechKit (cloud.yandex.ru/services/speechkit) позволяет перевести текст в звук и сохранить в файле формата .ogg.
Такую операцию можно совершить online на странице сервиса, но при этом есть определённые ограничения.
Во-первых, объём текста не может превышать 5000 символов, во-вторых иногда операция синтезирования речи зависает без видимых причин и приходится дробить текст на ещё более мелкие части.
В результате перевод более-менее объёмного текста в голос может превратиться в весьма нудную работу.
Слава Яндексу, у сервиса есть свой API и можно автоматизировать эту рутину.
Для того, чтобы воспользоваться API, необходимо:
1) иметь логин Яндекс
2) получить OAuth Токен, см. пункт 1 по ссылке: cloud.yandex.ru/docs/cli/quickstart#install
3) имея OAuth Токен, необходимо получить iamToken, этот токен имеет время жизни не более 12 часов, код для получения:
ЗащищенноеСоединениеOpenSSL = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС);
HTTPСоединениеЯндекс = Новый HTTPСоединение("iam.api.cloud.yandex.net", 443, , , , 20, ЗащищенноеСоединениеOpenSSL, Неопределено);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
Запрос = Новый HTTPЗапрос("/iam/v1/tokens", Заголовки);
СтрокаТела = "{""yandexPassportOauthToken"": """ + OAuth_Токен + """}";
Запрос.УстановитьТелоИзСтроки(СтрокаТела, КодировкаТекста.UTF8);
Ответ = HTTPСоединениеЯндекс.ОтправитьДляОбработки(Запрос);
СтрокаОтвет = Ответ.ПолучитьТелоКакСтроку();
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаОтвет);
СтруктураОтвета = ПрочитатьJSON(Чтение);
iamToken = СтруктураОтвета.iamToken;
4) получить folderId, как это сделать описано тут:
cloud.yandex.ru/docs/resource-manager/operations/folder/get-id
5) пройти на страницу биллинга https://console.cloud.yandex.ru/billing и пройти регистрацию, для этого потребуется указать реквизиты банковской карты, для проверки карты будет списано 2руб.(и сразу же возвращены).
Всё. После выполнение всех регистраций можно синтезировать речь.
Пример кода:
Процедура СинтезироватьИЗаписатьФайл(ИсходныйТекст, ИмяФайла, Голос, ПрерыватьПриОшибке)
ЗащищенноеСоединениеOpenSSL = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС);
HTTPСоединение = Новый HTTPСоединение("tts.api.cloud.yandex.net",443,,,,,ЗащищенноеСоединениеOpenSSL,Ложь);
СтрокаЗапроса = "speech/v1/tts:synthesize";
HTTPЗапрос = Новый HTTPЗапрос(СтрокаЗапроса);
HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + iamToken);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded;");
ТекстЗапроса =
"text=" + Экран(ИсходныйТекст) +
"&lang=ru-RU" +
"&speed=1" +
"&voice=" + Голос +
"&emotion=good" +
"&folderId=" + folderId
;
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
БинарныеДанные = HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();
БинарныеДанные.Записать(ИмяФайла);
Иначе
ТекстОшибки = "Что-то пошло не так! Код состояния = " + СокрЛП(HTTPОтвет.КодСостояния) + "! " + HTTPОтвет.ПолучитьТелоКакСтроку();
Если ПрерыватьПриОшибке Тогда
Сообщить(ТекстОшибки);
Сообщить(ИсходныйТекст);
Сообщить("===");
Сообщить(Экран(ИсходныйТекст));
ВызватьИсключение ТекстОшибки;
Иначе
Сообщить(ТекстОшибки);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция Экран(ИсходныйТекст)
Возврат КодироватьСтроку(ИсходныйТекст, СпособКодированияСтроки.КодировкаURL);
КонецФункции
Всё. Спасибо за внимание 🙂