Описание голоса синтеза речи на языке текущего сеанса и параметрами синтеза.
Полное описание, параметры и ограничения
ОписаниеГолосаСинтезаРечи (TextToSpeechVoiceDescription)
ОписаниеГолосаСинтезаРечи (TextToSpeechVoiceDescription)
Доступен, начиная с версии 8.3.25.
Свойства:
Голос (Voice)
КодЯзыка (LanguageCode)
Описание (Description)
Параметры (Parameters)
Представление (Presentation)
Описание:
Описание голоса синтеза речи на языке текущего сеанса и параметрами синтеза.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Возможен обмен с сервером. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO:
Использование в версии:
Доступен, начиная с версии 8.3.25.
Методическая информация
Практические примеры
Получить каталог настоящих голосов и синтезировать короткий текст выбранным ключом
Сначала показываем голоса и метаданные их дополнительных параметров. Пользователь выбирает фактический ключ; перед синтезом он повторно проверяется в текущем каталоге. Результат остаётся двоичными данными в памяти, не фиктивным WAV-файлом.
Где и как запускать
Полный серверный общий модуль УчебнаяРечь85 в новой базе УчебныеКаталогиРечи85; два независимых ручных действия собственной управляемой формы ниже.
Подготовка
Создайте новую отдельную файловую учебную базу с именем конфигурации УчебныеКаталогиРечи85. Не переименовывайте рабочую УТ/КА/УНФ/БП ради обхода проверки и не подключайте рабочие обмены или задания.
Используйте платформу8.5.1.1343. Создайте общий модуль УчебнаяРечь85: Сервер=Да, Глобальный=Нет, Клиент=Нет. Каждый урок независим: вставляйте его полный основной код в пустой модуль, не объединяйте дублирующиеся процедуры двух уроков.
Администратор должен заранее настроить именно этот собственный стенд для реального сервиса речи по условиям вашего аккаунта и региона. Здесь нет автоматической регистрации, выдуманного URL, токена или пароля. Без доступного сервиса урок может завершиться ошибкой подключения.
Вызовы выполняются в серверном контексте. В файловой базе это серверная часть клиентского процесса; в клиент-серверной базе интернет, сертификаты, права и подключение нужны именно серверу, а не только браузеру пользователя.
В конфигураторе: Обработки → УчебнаяРечь85 → Формы → Пульт, тип Управляемая. Добавьте Согласие типа Булево, Итог типа Строка неограниченной длины; поле Итог сделайте многострочным и только для просмотра.
Вставьте полный модуль запуска из отдельного блока ниже. Назначьте обработчик ПриОткрытии событию формы. Создайте перечисленные команды формы и свяжите их с одноимёнными процедурами модуля; добавьте кнопки команд.
Нажмите F7 для проверки модулей и обновите только эту учебную базу. F7 не подтверждает доступность сервиса, корректность его ответа или звучание голоса.
Откройте собственную обработку и прочитайте условия тарифа, передачи данных и возможной оплаты. Согласие при каждом открытии сбрасывается в Ложь; установите его только перед осознанным ручным опытом.
Здесь код не запускался в1С и сеть не вызывалась: runtimeVerifiedScenarios=0. Выводимые модели и голоса зависят от настоящего каталога; заранее заданного числа или фиксированных ключей нет.
Добавьте реквизит формы КлючГолоса типа Строка неограниченной длины и обычное поле ввода. Создайте команды ПоказатьГолоса и СинтезироватьОбразец с одноимёнными обработчиками.
Первым ручным нажатием получите каталог, скопируйте значение после Ключ: в поле КлючГолоса. Представление и Описание — подписи, не ключи. Второй командой разрешается передача только фиксированной учебной фразы без персональных данных.
Функция КаталогГолосов(Согласие) Экспорт
ПроверитьСвойСтенд(Согласие);
Голоса = ПолучитьСвоиГолоса();
Итог = "Голосов: " + Строка(Голоса.Количество());
Для Каждого Голос Из Голоса Цикл
Итог = Итог + Символы.ПС + "Ключ: " + Голос.Голос
+ "; язык: " + Голос.КодЯзыка + "; название: " + Голос.Представление
+ "; описание: " + Голос.Описание;
Параметры = Голос.Параметры;
Если ТипЗнч(Параметры) <> Тип("ФиксированныйМассив") Тогда
ВызватьИсключение "В описании голоса нужен фиксированный массив параметров";
КонецЕсли;
Для Каждого Параметр Из Параметры Цикл
Если ТипЗнч(Параметр) <> Тип("ОписаниеПараметраГолосаСинтезаРечи") Тогда
ВызватьИсключение "Параметр голоса должен быть настоящим дескриптором сервиса";
КонецЕсли;
Допустимые = Параметр.ДопустимыеЗначения;
Если ТипЗнч(Допустимые) <> Тип("ФиксированныйМассив") Тогда
ВызватьИсключение "Нужен фиксированный массив доступных значений";
КонецЕсли;
Итог = Итог + Символы.ПС + " Параметр: " + Параметр.Параметр
+ "; название: " + Параметр.Представление + "; описание: " + Параметр.Описание
+ "; доступных значений: " + Строка(Допустимые.Количество());
КонецЦикла;
КонецЦикла;
Если Голоса.Количество() = 0 Тогда
Итог = Итог + Символы.ПС + "Нет доступных голосов; синтез невозможен до настройки подключения";
КонецЕсли;
Возврат Итог;
КонецФункции
Функция СинтезОбразца(Согласие, КлючГолоса) Экспорт
ПроверитьСвойСтенд(Согласие);
Если ТипЗнч(КлючГолоса) <> Тип("Строка") Или Не ЗначениеЗаполнено(КлючГолоса) Тогда
ВызватьИсключение "Сначала получите каталог и введите настоящий ключ голоса, не его название";
КонецЕсли;
Голоса = ПолучитьСвоиГолоса();
Найден = Неопределено;
Для Каждого Голос Из Голоса Цикл
Если Голос.Голос = КлючГолоса Тогда
Если Найден <> Неопределено Тогда
ВызватьИсключение "Сервис вернул неоднозначный ключ; не выбирайте произвольное совпадение";
КонецЕсли;
Найден = Голос;
КонецЕсли;
КонецЦикла;
Если Найден = Неопределено Тогда
ВызватьИсключение "Такого ключа уже нет в настоящем каталоге; синтез не выполнялся";
КонецЕсли;
Данные = РаботаСРечью.Синтезировать("Учебная проверка выбранного голоса.", Найден.Голос);
Если ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда
ВызватьИсключение "Синтез должен вернуть настоящие двоичные данные, а не текст или адрес файла";
КонецЕсли;
Если Данные.Размер() = 0 Или Данные.Размер() > 1048576 Тогда
ВызватьИсключение "Собственный короткий образец должен быть непустым и не более1МиБ";
КонецЕсли;
Возврат Данные;
КонецФункции
Функция ПолучитьСвоиГолоса()
Голоса = РаботаСРечью.ПолучитьДоступныеГолосаСинтеза();
Если ТипЗнч(Голоса) <> Тип("Массив") Тогда
ВызватьИсключение "Каталог должен быть массивом описаний голосов";
КонецЕсли;
Если Голоса.Количество() > 1000 Тогда
ВызватьИсключение "Для учебного каталога допустимы не более1000голосов";
КонецЕсли;
Для Каждого Голос Из Голоса Цикл
Если ТипЗнч(Голос) <> Тип("ОписаниеГолосаСинтезаРечи") Тогда
ВызватьИсключение "Получен не настоящий дескриптор голоса";
КонецЕсли;
КонецЦикла;
Возврат Голоса;
КонецФункции
Процедура ПроверитьСвойСтенд(Согласие)
Если ТипЗнч(Согласие) <> Тип("Булево") Или Не Согласие Тогда
ВызватьИсключение "Нужно явное согласие на обращение собственного стенда к сервису речи";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Не обращайтесь к сервису внутри транзакции";
КонецЕсли;
Если ТипЗнч(РаботаСРечью) <> Тип("МенеджерРаботыСРечью") Тогда
ВызватьИсключение "Нужен настоящий глобальный менеджер работы с речью";
КонецЕсли;
КонецПроцедурыУчебныеКаталогиРечи85.Пульт
УчебныеКаталогиРечи85 → Обработки → УчебнаяРечь85 → Формы → Пульт → Модуль
Полный модуль собственной управляемой формы; здесь не выполнялся.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Согласие = Ложь;
КлючГолоса = "";
Итог = "Сначала получите каталог, затем скопируйте настоящий ключ в поле КлючГолоса";
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьГолоса(Команда)
Если Не Согласие Тогда
ВызватьИсключение "Согласие не установлено";
КонецЕсли;
Итог = "Получение голосов; прошлый результат сброшен";
ПолучитьГолосаНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПолучитьГолосаНаСервере()
Итог = "Получение каталога; прошлый результат сброшен";
Попытка
Итог = УчебнаяРечь85.КаталогГолосов(Согласие);
Исключение
Итог = "Каталог не получен; синтез автоматически не выполняется";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура СинтезироватьОбразец(Команда)
Если Не Согласие Тогда
ВызватьИсключение "Согласие не установлено";
КонецЕсли;
Итог = "Синтез собственного образца; прошлый результат сброшен";
СинтезироватьНаСервере();
КонецПроцедуры
&НаСервере
Процедура СинтезироватьНаСервере()
Итог = "Синтез собственного короткого текста; прошлый результат сброшен";
Попытка
Данные = УчебнаяРечь85.СинтезОбразца(Согласие, КлючГолоса);
Итог = "Получены двоичные данные: " + Строка(Данные.Размер())
+ "байт. По контракту это OPUS в OGG, не WAV. Файл не записан; воспроизведения и проверки звучания не было";
Исключение
Итог = "Синтез не завершён; повторных запросов, записи файла и воспроизведения автоматически нет";
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыРазбор по шагам
ПолучитьДоступныеГолосаСинтеза вызывается на сервере и возвращает настоящий массив дескрипторов, а не придуманный список голосов или системных дикторов Windows.
Каждый голос проверяем по типу; показываем его фактический ключ, язык, представление и описание. Параметры — фиксированный массив описаний дополнительных настроек конкретного голоса.
Каждый параметр показывает свой ключ, подпись, объяснение и фактическое число ДопустимыеЗначения. В опубликованной справке элементы этого массива описаны неоднозначно; урок не выдаёт их за строки или числа.
В отдельной команде сначала проверяются согласие и непустой ключ. Получаем каталог заново: ранее показанный голос мог исчезнуть, а введённое название может вообще не быть ключом.
Ищем строгое совпадение ключа. Отсутствие или неоднозначность — ошибка до Синтезировать, а не выбор произвольного голоса или незаметный переход на голос по умолчанию.
Синтезировать вызывается с коротким фиксированным текстом и настоящим ключом. Дополнительные параметры намеренно не передаются: без подтверждённого контракта значений не выдумываем скорость, пол или громкость.
Проверяем фактический тип и размер возвращённых данных. Непустые данные до1МиБ остаются результатом функции; форма сообщает размер, но не записывает файл и не запускает динамики.
Как проверить результат
Без согласия оба действия должны отказаться. Пока ключ пуст, Синтезировать не вызывается даже при готовом сервисе.
После получения каталога проверьте различие Голос и Представление. Вводите именно настоящий ключ своего каталога, а не имя из чужого примера.
Введите заведомо отсутствующий ключ: должна возникнуть ошибка до синтеза. С пустым каталогом допустимого ключа также нет.
С существующим ключом и доступным сервисом ожидаются настоящие непустые ДвоичныеДанные. Размер определяется сервисом, не учебной константой. Это ещё не проверка звучания или декодирования.
У голоса без параметров дополнительный список пуст. Число допустимых значений может быть0; урок не назначает первый элемент произвольным параметром синтеза.
Поиск и синтез выполняются отдельными вызовами: сервис всё ещё может измениться или отказать после проверки ключа. Ошибка должна остаться ошибкой; повторная платная попытка автоматически не запускается.
Ожидаемый результат
Реальный каталог и, после отдельной осознанной команды, настоящие данные короткой фразы выбранным голосом. По контракту Синтезировать возвращает OPUS в OGG; сохранения, воспроизведения и аудиотеста здесь нет.
На что обратить внимание
Это сервисный менеджер речи, не СредстваМультимедиа.ВоспроизвестиТекст и не локальный системный диктор.
Нативный НачатьСинтез имеет другой результат в обработчике — WAV. Нельзя переносить этот формат на синхронный Синтезировать: здесь OPUS в OGG.
ДопустимыеЗначения в установленной справке объявлены фиксированным массивом, но описание типа его элементов неоднозначно. Каталог читается без догадок; настройка дополнительных параметров требует отдельного подтверждения реального контракта.
Дескрипторы и их свойства readonly. Код не конструирует голос или параметр, не переписывает каталог, не предполагает выдуманный XDTO-тип.
Предел1МиБ проверяется после получения данных; он не ограничивает серверную аллокацию или длительность сети. Короткий фиксированный текст уменьшает учебный объём, но не гарантирует конкретный размер.
Каталог не гарантирует бесплатность или постоянную доступность. Проверьте тариф и условия передачи текста до установки согласия; сертификаты или ошибки подключения не отключайте ради прохождения урока.
Форма намеренно не сохраняет аудио и не проверяет его на слух. Непустой двоичный результат — лишь структурная проверка; runtimeVerifiedScenarios=0, реальные сервисные вызовы здесь не выполнялись.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.