Каталог решений - Синтез речи из текста с помощью Яндекс SpeechKit

Синтез речи из текста с помощью Яндекс SpeechKit

Синтез речи из текста с помощью Яндекс SpeechKit

В наличии

В статье описан процесс подключения Яндекс SpeechKit API и программная реализация синтеза речи из текста с помощью этого API. Тестировалось на релизе платформы 8.3.16.1224. Может использоваться в любой конфигурации. Синтез речи может использоваться для самых разных целей, в моём случае потребовалось перевести лекции из текстовых файлов в звук

Категория:

Описание

Disclaimer: на Инфостарте есть статья описывающая распознавание речи в текст:

infostart.ru/public/1113219/

Сервис Яндекс 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);
	
КонецФункции

 

Всё. Спасибо за внимание 🙂

has been added to your cart:
Оформление заказа