Описывает объект результатов отложенного распознавания речи.
Полное описание, параметры и ограничения
РезультатОтложенногоРаспознаванияРечи (DelayedSpeechToTextResult)
РезультатОтложенногоРаспознаванияРечи (DelayedSpeechToTextResult)
Доступен, начиная с версии 8.3.23.
Свойства:
Завершено (Completed)
Ключ (Key)
Ошибка (Error)
Результаты (Results)
Успешно (Success)
Описание:
Описывает объект результатов отложенного распознавания речи.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
SpeechToTextInformationDelayed.
Использование в версии:
Доступен, начиная с версии 8.3.23.
Методическая информация
Практические примеры
Получить свой WAV синтеза и разобрать настоящий результат отложенного распознавания
Полный клиентский модуль собственной управляемой формы: настоящий WAV поступает только из уведомления синтеза, отдельная команда отправляет его реальной внешней модели, а ручная проверка разбирает каналы, гипотезы и слова. Отмена и остановка используют только ключи этого окна.
Где и как запускать
Полный клиентский модуль управляемой формы собственного окна УчебныйWAVРечи85.Пульт; толстый клиент8.5.1.1343 в режиме управляемого приложения, отдельная учебная база, реальные заранее подготовленные голос и внешняя модель.
Подготовка
Создайте новую отдельную базу УчебныйWAVРечи85 на платформе8.5.1.1343. Не переименовывайте рабочую базу, не переносите рабочие задания и не запускайте код в production.
Используйте толстый клиент в режиме Управляемое приложение. В конфигураторе: Обработки → УчебныйWAVРечи85 → Формы → Пульт, тип Управляемая. Код ниже — весь модуль формы. Толстый клиент нужен для каталога голосов; управляемая форма нужна для допустимого модуля ОписаниеОповещения.
Администратор заранее настраивает подключение собственного стенда к настоящему сервису речи и доступ к синтезу и внешнему распознаванию. Нужны действительные условия тарифа, сертификаты, интернет и квота; здесь нет URL, паролей, токенов или автоматической регистрации.
В реальном каталоге должны быть доступные голос синтеза и внешняя модель распознавания с фактическим кодом языка, начинающимся на ru. Это узкое правило русского учебного опыта, не полный классификатор языков. Если подходящих объектов нет, код отказывается и не придумывает их.
Добавьте реквизиты формы Согласие типа Булево и Итог типа Строка неограниченной длины. Согласие выведите флажком, многострочный Итог сделайте только для просмотра. Билет и WAV не вводятся пользователем и не являются реквизитами формы.
Создайте шесть команд управляемой формы: СоздатьСвойWAV, ОстановитьСвойСинтез, РаспознатьСвойWAV, ПроверитьСвойРезультат, ОтменитьСвоеЗадание и ОчиститьПамятьОпыта. Назначьте каждой одноимённую процедуру с параметром Команда и выведите кнопки команд.
Вставьте полный код в пустой модуль управляемой формы. ПриОткрытии назначьте событию с параметром Отказ, ПередЗакрытием — событию с четырьмя параметрами. СвойWAVПолучен оставьте экспортной клиентской процедурой с двумя параметрами; уведомление получает ЭтотОбъект типа ФормаКлиентскогоПриложения, не обычную Форма.
Нажмите F7 и обновите только свой стенд. F7 не подтверждает доступность сервиса, корректность WAV или распознавание. Откройте отдельное собственное окно; не запускайте параллельно другое окно этого опыта.
Синтез направляет звук на аудиоустройство по умолчанию. До установки согласия проверьте безопасную громкость и условия передачи аудио в облако. Используется только фиксированная несекретная фраза Учебная книга лежит на столе.; микрофон не включается.
Порядок: установите согласие → СоздатьСвойWAV → дождитесь сообщения о настоящем WAV → ОстановитьСвойСинтез → РаспознатьСвойWAV → позднее по одному нажатию ПроверитьСвойРезультат. Нет таймера, бесконечного ожидания или автоматической повторной отправки.
Для отдельного опыта отмены после получения собственного билета нажмите ОтменитьСвоеЗадание. Быстрое задание могло уже завершиться: код сначала читает его состояние и не выдаёт готовый ответ за подтверждённую отмену.
После подтверждённого завершения и остановки ОчиститьПамятьОпыта очищает только локальный WAV и билет. Учебный код не записывает файлы, резервные копии или архивы и не обещает удаление результатов с сервиса.
Здесь синтез, воспроизведение, передача аудио, распознавание и отмена не выполнялись. runtimeVerifiedScenarios=0; все строки распознанных фраз и слов появляются только при будущем настоящем ответе сервиса.
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Перем СвояГотовность;
Перем СвойКлючСинтеза;
Перем СвойСинтезНеОстановлен;
Перем СвойWAV;
Перем СвойБилет;
Перем СвоеРаспознаваниеЗавершено;
Перем СвояОтмена;
Перем СвояОтправкаБезБилета;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СвояГотовность = Ложь;
Согласие = Ложь;
СвойКлючСинтеза = "";
СвойСинтезНеОстановлен = Ложь;
СвойWAV = Неопределено;
СвойБилет = Неопределено;
СвоеРаспознаваниеЗавершено = Ложь;
СвояОтмена = Ложь;
СвояОтправкаБезБилета = Ложь;
Итог = "Подготовьте собственный сервис; синтез включит аудиоустройство, распознавание передаст только учебную фразу";
Попытка
ПроверитьСвойСтенд();
СвояГотовность = Истина;
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвойСтенд()
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Не отправляйте аудио в сервис внутри транзакции";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвоеОкно()
ПроверитьСвойСтенд();
Если Не СвояГотовность Тогда
ВызватьИсключение "Нужно собственное открытое учебное окно";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвоеСогласие()
ПроверитьСвоеОкно();
Если Не Согласие Тогда
ВызватьИсключение "Нужно явное согласие на синтез, воспроизведение и передачу собственного аудио";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьСвойWAV(Команда)
ПроверитьСвоеСогласие();
Если СвойСинтезНеОстановлен Или СвойWAV <> Неопределено
Или СвойБилет <> Неопределено Или СвояОтправкаБезБилета Тогда
ВызватьИсключение "Сначала остановите и завершите только свой предыдущий опыт, затем очистите память окна";
КонецЕсли;
Итог = "Получение настоящего голоса; прошлый результат сброшен";
Голос = ПолучитьНастоящийРусскийГолос();
СвойКлючСинтеза = Строка(Новый УникальныйИдентификатор);
Оповещение = Новый ОписаниеОповещения("СвойWAVПолучен", ЭтотОбъект, СвойКлючСинтеза);
СвойСинтезНеОстановлен = Истина;
Итог = "Начат собственный синтез. Ожидайте WAV в уведомлении; звук может воспроизводиться";
Попытка
РаботаСРечью.НачатьСинтез("Учебная книга лежит на столе.", СвойКлючСинтеза, Голос, , Оповещение);
Исключение
Итог = "Начало синтеза не подтверждено. Ключ попытки сохранён; остановите только его кнопкой ОстановитьСвойСинтез";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура СвойWAVПолучен(РезультатГенерации, ДополнительныеПараметры) Экспорт
Если Не СвояГотовность Или Не СвойСинтезНеОстановлен
Или ДополнительныеПараметры <> СвойКлючСинтеза Тогда
Возврат;
КонецЕсли;
Если Не Согласие Тогда
Итог = "Согласие отозвано; WAV не принят. Остановите только свой синтез";
Возврат;
КонецЕсли;
Если СвойWAV <> Неопределено Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(РезультатГенерации) <> Тип("ДвоичныеДанные") Тогда
Итог = "В уведомлении нет двоичных данных WAV; остановите собственный синтез";
Возврат;
КонецЕсли;
Если РезультатГенерации.Размер() = 0 Или РезультатГенерации.Размер() > 16777216 Тогда
Итог = "Собственный WAV должен быть непустым и не более16МиБ; результат не принят";
Возврат;
КонецЕсли;
СвойWAV = РезультатГенерации;
Итог = "Получен настоящий WAV из своего уведомления: " + Строка(СвойWAV.Размер())
+ "байт. Сначала явно остановите только свой синтез; потом отправьте этот WAV на распознавание";
КонецПроцедуры
&НаКлиенте
Процедура ОстановитьСвойСинтез(Команда)
ПроверитьСвоеОкно();
Если Не СвойСинтезНеОстановлен Тогда
Итог = "Нет собственного неостановленного синтеза; общий стоп не вызывался";
Возврат;
КонецЕсли;
Если СвойКлючСинтеза = "" Тогда
ВызватьИсключение "Нельзя останавливать синтез без собственного ключа";
КонецЕсли;
Итог = "Остановка только своего синтеза; результат вызова ещё не подтверждён";
РаботаСРечью.ОстановитьСинтез(СвойКлючСинтеза);
СвойСинтезНеОстановлен = Ложь;
СвойКлючСинтеза = "";
Итог = "Вызов остановки только собственного синтеза завершился; принятый WAV остался в памяти, старые уведомления игнорируются";
КонецПроцедуры
&НаКлиенте
Процедура РаспознатьСвойWAV(Команда)
ПроверитьСвоеСогласие();
Если СвойСинтезНеОстановлен Тогда
ВызватьИсключение "Сначала явно остановите свой синтез";
КонецЕсли;
Если СвойБилет <> Неопределено Или СвояОтправкаБезБилета Тогда
ВызватьИсключение "Повторная отправка запрещена, пока исходный собственный опыт не завершён";
КонецЕсли;
Если ТипЗнч(СвойWAV) <> Тип("ДвоичныеДанные") Тогда
ВызватьИсключение "Сначала получите настоящий WAV из собственного уведомления, не создавайте фиктивные байты";
КонецЕсли;
Итог = "Подбор настоящей внешней модели; отправка WAV ещё не началась";
ПараметрыМодели = ПолучитьНастоящуюВнешнююРусскуюМодель();
Итог = "Отправка собственного WAV; это ещё не распознанный текст";
СвояОтправкаБезБилета = Истина;
Попытка
СвойБилет = РаботаСРечью.ВыполнитьОтложенноеРаспознавание(СвойWAV, ПараметрыМодели,
ВариантИспользованияРасположенияРаботыСРечью.ТолькоВнешнее);
Если ТипЗнч(СвойБилет) <> Тип("ИдентификаторОтложенногоРаспознаванияРечи") Тогда
СвойБилет = Неопределено;
ВызватьИсключение "Сервис не вернул типизированный билет собственного задания";
КонецЕсли;
СвояОтправкаБезБилета = Ложь;
СвоеРаспознаваниеЗавершено = Ложь;
СвояОтмена = Ложь;
ПроверитьСвойНастоящийБилет();
Итог = "Получен настоящий билет; результат ещё неизвестен. Позже вручную нажмите ПроверитьСвойРезультат";
Исключение
Итог = "Отправка или проверка билета не завершена. Автоматической повторной отправки нет; при отсутствии билета не придумывайте ключ для отмены";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвойНастоящийБилет()
ТекстБилета = Строка(СвойБилет);
ИзСтроки = Новый ИдентификаторОтложенногоРаспознаванияРечи(ТекстБилета);
НастоящийUUID = Новый УникальныйИдентификатор(ТекстБилета);
ИзUUID = Новый ИдентификаторОтложенногоРаспознаванияРечи(НастоящийUUID);
Если Строка(ИзСтроки) <> ТекстБилета Или Строка(ИзUUID) <> ТекстБилета Тогда
ВызватьИсключение "Типизированные копии не восстановили настоящий билет; исходный билет сохранён, секреты не выводятся";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьТолькоСвойРезультат()
Если ТипЗнч(СвойБилет) <> Тип("ИдентификаторОтложенногоРаспознаванияРечи") Тогда
ВызватьИсключение "Нужен исходный билет, полученный от собственного вызова распознавания";
КонецЕсли;
Ключи = Новый Массив;
Ключи.Добавить(СвойБилет);
Ответы = РаботаСРечью.ПолучитьРезультатыОтложенныхРаспознаваний(Ключи);
Если ТипЗнч(Ответы) <> Тип("Массив") Тогда
ВызватьИсключение "Нужен настоящий массив результатов, не заранее распознанная строка";
КонецЕсли;
Если Ответы.Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
Если Ответы.Количество() <> 1 Тогда
ВызватьИсключение "Запрошен только один собственный билет; неожиданный ответ не принимается";
КонецЕсли;
Ответ = Ответы[0];
Если ТипЗнч(Ответ) <> Тип("РезультатОтложенногоРаспознаванияРечи") Тогда
ВызватьИсключение "Сервис вернул не типизированный результат отложенного распознавания";
КонецЕсли;
Если ТипЗнч(Ответ.Ключ) <> Тип("ИдентификаторОтложенногоРаспознаванияРечи")
Или Строка(Ответ.Ключ) <> Строка(СвойБилет) Тогда
ВызватьИсключение "Результат относится не к собственному исходному билету";
КонецЕсли;
Возврат Ответ;
КонецФункции
&НаКлиенте
Процедура ПроверитьСвойРезультат(Команда)
ПроверитьСвоеОкно();
Итог = "Получение только своего результата; прошлый текст сброшен";
Ответ = ПолучитьТолькоСвойРезультат();
ПоказатьНастоящийОтвет(Ответ);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьСвоеЗадание(Команда)
ПроверитьСвоеОкно();
Итог = "Проверка собственного задания перед адресной отменой";
Ответ = ПолучитьТолькоСвойРезультат();
Если Ответ <> Неопределено Тогда
Если Ответ.Завершено Тогда
ПоказатьНастоящийОтвет(Ответ);
Возврат;
КонецЕсли;
КонецЕсли;
СвояОтмена = Истина;
РаботаСРечью.ОтменитьОтложенноеРаспознавание(СвойБилет);
ПоказатьНастоящийОтвет(ПолучитьТолькоСвойРезультат());
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьНастоящийОтвет(Ответ)
Если Ответ = Неопределено Тогда
Итог = "Ответ пока не получен; позднее выполните одну ручную проверку, не повторную отправку WAV";
Возврат;
КонецЕсли;
Если Не Ответ.Завершено Тогда
Итог = "Задание ещё не завершено. Успешно=Ложь на этой стадии не означает финальную ошибку";
Возврат;
КонецЕсли;
СвоеРаспознаваниеЗавершено = Истина;
Если Не Ответ.Успешно Тогда
Итог = "Собственное задание завершено неуспешно: " + Ответ.Ошибка;
Если СвояОтмена Тогда
Итог = Итог + Символы.ПС + "Отмена запрашивалась только для этого билета; фактическая причина показана выше";
КонецЕсли;
Возврат;
КонецЕсли;
Каналы = Ответ.Результаты;
Если ТипЗнч(Каналы) <> Тип("Массив") Тогда
ВызватьИсключение "Завершённое задание должно содержать настоящий массив аудиоканалов";
КонецЕсли;
Если Каналы.Количество() > 8 Тогда
ВызватьИсключение "Для собственного короткого опыта допускаем не более8каналов";
КонецЕсли;
ТекстРазбора = "Завершено успешно; каналов: " + Строка(Каналы.Количество());
Для НомерКанала = 0 По Каналы.Количество() - 1 Цикл
Канал = Каналы[НомерКанала];
Если ТипЗнч(Канал) <> Тип("РезультатРаспознаванияРечи") Тогда
ВызватьИсключение "В ответе нужен настоящий результат каждого канала";
КонецЕсли;
Если Не Канал.РаспознаваниеФразыЗавершено Тогда
ВызватьИсключение "Файловый результат по контракту должен содержать окончательную гипотезу фразы";
КонецЕсли;
Фразы = Канал.ДанныеФраз;
Если ТипЗнч(Фразы) <> Тип("Массив") Или Фразы.Количество() > 100 Тогда
ВызватьИсключение "Нужен ограниченный настоящий массив гипотез канала";
КонецЕсли;
ПредыдущаяУверенность = Неопределено;
Для Каждого Фраза Из Фразы Цикл
Если ТипЗнч(Фраза) <> Тип("ДанныеФразыРаспознаванияРечи") Тогда
ВызватьИсключение "Гипотеза должна быть настоящим объектом данных фразы";
КонецЕсли;
Если ПредыдущаяУверенность <> Неопределено Тогда
Если Фраза.Уверенность > ПредыдущаяУверенность Тогда
ВызватьИсключение "Гипотезы должны идти по невозрастанию фактической уверенности";
КонецЕсли;
КонецЕсли;
ПредыдущаяУверенность = Фраза.Уверенность;
ТекстРазбора = ТекстРазбора + Символы.ПС + "Канал " + Строка(НомерКанала + 1)
+ "; фраза: " + Фраза.Фраза + "; уверенность: " + Строка(Фраза.Уверенность)
+ "; начало, мс: " + Строка(Фраза.ВремяНачала)
+ "; окончание, мс: " + Строка(Фраза.ВремяОкончания);
Слова = Фраза.СловаФраз;
Если ТипЗнч(Слова) <> Тип("Массив") Или Слова.Количество() > 200 Тогда
ВызватьИсключение "Нужен ограниченный настоящий массив слов фразы";
КонецЕсли;
Для Каждого Слово Из Слова Цикл
Если ТипЗнч(Слово) <> Тип("СловоФразыРаспознаванияРечи") Тогда
ВызватьИсключение "Детали слова должны прийти от распознавателя, не из своей структуры";
КонецЕсли;
ТекстРазбора = ТекстРазбора + Символы.ПС + " Слово: " + Слово.Слово
+ "; уверенность: " + Строка(Слово.Уверенность)
+ "; начало, мс: " + Строка(Слово.ВремяНачала)
+ "; окончание, мс: " + Строка(Слово.ВремяОкончания);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Если СвояОтмена Тогда
ТекстРазбора = ТекстРазбора + Символы.ПС + "Запрос отмены был сделан, но фактический ответ успешный; отмену по этому ответу подтверждённой не считаем";
КонецЕсли;
Итог = ТекстРазбора;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьНастоящийРусскийГолос()
Голоса = РаботаСРечью.ПолучитьДоступныеГолосаСинтеза();
Если ТипЗнч(Голоса) <> Тип("Массив") Тогда
ВызватьИсключение "Нужен настоящий каталог голосов";
КонецЕсли;
Для Каждого Голос Из Голоса Цикл
Если ТипЗнч(Голос) <> Тип("ОписаниеГолосаСинтезаРечи") Тогда
ВызватьИсключение "В каталоге найден не дескриптор голоса";
КонецЕсли;
Если НРег(Лев(Голос.КодЯзыка, 2)) = "ru" И ЗначениеЗаполнено(Голос.Голос) Тогда
Возврат Голос.Голос;
КонецЕсли;
КонецЦикла;
ВызватьИсключение "В собственном каталоге нет голоса с кодом языка, начинающимся на ru";
КонецФункции
&НаКлиенте
Функция ПолучитьНастоящуюВнешнююРусскуюМодель()
Модели = РаботаСРечью.ПолучитьОписаниеМоделейРаспознавания();
Если ТипЗнч(Модели) <> Тип("Массив") Тогда
ВызватьИсключение "Нужен настоящий каталог моделей";
КонецЕсли;
Для Каждого Модель Из Модели Цикл
Если ТипЗнч(Модель) <> Тип("ОписаниеМоделиРаспознаванияРечи") Тогда
ВызватьИсключение "В каталоге найден не дескриптор модели";
КонецЕсли;
Если Модель.ДоступнаВоВнешнемВарианте Тогда
Параметры = Модель.ПолучитьПараметры();
Если ТипЗнч(Параметры) <> Тип("ПараметрыМоделиРаспознаванияРечи") Тогда
ВызватьИсключение "Нужны параметры настоящей модели";
КонецЕсли;
Если НРег(Лев(Параметры.КодЯзыка, 2)) = "ru" Тогда
Возврат Параметры;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ВызватьИсключение "Нет доступной внешней модели с фактическим кодом языка, начинающимся на ru";
КонецФункции
&НаКлиенте
Процедура ОчиститьПамятьОпыта(Команда)
ПроверитьСвоеОкно();
Если СвойСинтезНеОстановлен Или СвояОтправкаБезБилета
Или (СвойБилет <> Неопределено И Не СвоеРаспознаваниеЗавершено) Тогда
ВызватьИсключение "Сначала завершите только свои известные задания; неизвестную отправку не обнуляем ради нового запроса";
КонецЕсли;
СвойWAV = Неопределено;
СвойБилет = Неопределено;
СвоеРаспознаваниеЗавершено = Ложь;
СвояОтмена = Ложь;
Итог = "Локальная память своего завершённого опыта очищена. Удаление результатов на стороне сервиса не обещается";
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
СтандартнаяОбработка = Истина;
Если СвойСинтезНеОстановлен
Или (СвойБилет <> Неопределено И Не СвоеРаспознаваниеЗавершено)
Или СвояОтправкаБезБилета Тогда
Отказ = Истина;
ТекстПредупреждения = "Собственный опыт не завершён: остановите свой синтез, проверьте известный билет; неизвестную отправку должен проверить администратор своего аккаунта";
Если Не ЗавершениеРаботы Тогда
Сообщить(ТекстПредупреждения);
КонецЕсли;
Возврат;
КонецЕсли;
СвояГотовность = Ложь;
СвойWAV = Неопределено;
КонецПроцедуры
#Иначе
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Отказ = Истина;
ВызватьИсключение "Нужен толстый клиент в режиме управляемого приложения";
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
СтандартнаяОбработка = Истина;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьСвойWAV(Команда)
ВызватьИсключение "Этот урок не запускается в тонком, веб- или мобильном клиенте";
КонецПроцедуры
&НаКлиенте
Процедура ОстановитьСвойСинтез(Команда)
ВызватьИсключение "Этот урок не запускается в тонком, веб- или мобильном клиенте";
КонецПроцедуры
&НаКлиенте
Процедура РаспознатьСвойWAV(Команда)
ВызватьИсключение "Этот урок не запускается в тонком, веб- или мобильном клиенте";
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвойРезультат(Команда)
ВызватьИсключение "Этот урок не запускается в тонком, веб- или мобильном клиенте";
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьСвоеЗадание(Команда)
ВызватьИсключение "Этот урок не запускается в тонком, веб- или мобильном клиенте";
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьПамятьОпыта(Команда)
ВызватьИсключение "Этот урок не запускается в тонком, веб- или мобильном клиенте";
КонецПроцедуры
#КонецЕслиРазбор по шагам
Создание WAV выбирает настоящий доступный голос и новый уникальный строковый ключ. ОписаниеОповещения связывает будущий ответ с этим ключом и собственным окном; случайный или старый callback не принимается.
НачатьСинтез потоково отправляет звук на аудиоустройство. Его уведомление содержит ДвоичныеДанные WAV, в отличие от синхронного Синтезировать, который возвращает OPUS в OGG. Нельзя взять произвольные байты и переименовать их в WAV.
Принятый WAV остаётся в закрытой переменной модуля. Даже получение файла не используется как доказательство остановки аудиоустройства: явная кнопка вызывает ОстановитьСинтез только со своим ключом, а вызов без ключа никогда не делается.
Перед распознаванием выбираются параметры фактической доступной внешней русской модели. ТолькоВнешнее задаётся явно, поскольку обычный default этого метода — ТолькоЛокальное; модель или идентификатор не угадываются.
ВыполнитьОтложенноеРаспознавание передаёт настоящий WAV и возвращает типизированный билет, не распознанный текст. Флаг неизвестной отправки ставится перед вызовом и снимается только после получения правильного типа билета.
Два конструктора билета восстанавливают значение только из представления реально полученного билета и его реального UUID. Результаты сравниваются с исходным значением; для запросов и отмены используется именно исходный билет, а не новый случайный идентификатор.
Каждая ручная проверка передаёт массив с одним собственным билетом. Возвращаемый объект проверяется по типу и полю Ключ; чужой ответ или неожиданный размер массива не принимается.
Завершено и Успешно — разные признаки. Пока Завершено=Ложь, Успешно=Ложь не означает финальную ошибку. Только после завершения выводится фактическая Ошибка или разбирается массив результатов каналов.
Каждый канал содержит настоящий РезультатРаспознаванияРечи. В файловом режиме гипотеза окончательная; ДанныеФраз — альтернативы по невозрастанию Уверенность, а текст называется Фраза, не выдуманное Текст.
У каждой фактической фразы показываются текст, исходное числовое значение уверенности и время начала/окончания в миллисекундах. Из СловаФраз отдельно читаются настоящие слова, их уверенность и времена; порядок слов не пересортировывается.
Отмена адресуется только исходному билету текущего окна. После вызова заново читается реальный ответ; в нормальном ответе отмены ожидаются завершение, неуспех и причина Распознавание отменено. Успешный ответ после запроса не выдаётся за отмену.
Остановка синтеза и отмена задания разрешены и после снятия согласия: это адресное прекращение ранее разрешённого собственного действия. Новый синтез или новая отправка без согласия запрещены.
Как проверить результат
Снимите согласие: создание WAV и отправка должны отказаться до соответствующих операций. Адресные остановка и отмена собственных существующих действий остаются доступны.
Без настоящего callback WAV не должен появиться. Старый ключ, закрытое окно или неверный тип результата не создают фиктивный файл. После собственного стопа запоздалый callback игнорируется.
После отправки должен появиться настоящий ИдентификаторОтложенногоРаспознаванияРечи. Ни одна команда не создаёт случайный GUID вместо билета задания; повторная отправка с ещё известным билетом запрещена.
У незавершённого ответа нет обещания текста. После успешного завершения выводятся реальные каналы, альтернативы и слова; точное совпадение с учебной фразой, число слов и уверенность заранее не гарантируются.
У законченного неуспешного ответа показывается фактическая причина, например неподдерживаемый формат, срок хранения или ошибка сервиса. Такой ответ не заменяется заранее ожидаемой фразой.
Отменяйте отдельное собственное ещё незавершённое задание и проверяйте именно его состояние. Уже готовое задание не нужно отменять; успешный результат не является доказательством отмены.
Убедитесь, что времена подписаны мс, а уверенность не умножается на100 и не оформляется как гарантированный процент. Пустые массивы гипотез или слов допустимы и не дополняются искусственными значениями.
При потере ответа отправки без билета новый запрос и очистка этой неизвестной попытки блокируются. ПередЗакрытием сообщает о неизвестном собственном состоянии, но не придумывает ключ; администратору нужна проверка собственного аккаунта, не остановка всех чужих заданий.
Ожидаемый результат
В успешном собственном ручном опыте получен настоящий WAV и реальный результат своего отложенного задания с каналами, гипотезами и словами. Ошибки, ожидание и отмена отражают фактические ответы, а не подготовленную имитацию текста.
На что обратить внимание
Один вызов отправки не равен одному готовому результату. Нет фонового таймера и бесконечного цикла: пользователь проверяет по одному запросу, учитывая время сервиса и тариф.
Без ключа ОстановитьСинтез останавливает все сеансы. Этот вариант в уроке не используется; незнакомые билеты и чужие ключи также не принимаются из полей формы.
Настоящий WAV по контракту уведомления не гарантирует поддержку его формата, числа каналов или частоты конкретной моделью. Фактическая ошибка распознавания остаётся ошибкой; урок не обещает автоматическое перекодирование.
Уверенность — числовое значение платформы. В установленной справке нет универсального диапазона0..1 или гарантированной интерпретации в процентах; не подменяйте её искусственным порогом или показателем точности.
Порядок альтернатив фраз определён убыванием уверенности, но слова сохраняются в фактическом порядке массива. Описание уверенности слова в справке неоднозначно и не используется как основание пересортировать речь.
Пределы16МиБ,8каналов,100гипотез и200слов — ограничения учебного отображения, проверяемые после получения объектов. Они не ограничивают аллокации или сетевой объём до ответа.
В конструкторы билета передаётся только представление настоящего возвращённого ID. Это проверка типизированного восстановления значения в текущей версии, не разрешение создавать неизвестные задания случайными UUID.
Потерянный ответ отправки может оставить задание в сервисе без известного билета. Код сохраняет неопределённость, не повторяет автоматически оплату и не делает массовую отмену. Принудительное падение клиента может потерять память окна.
Локальная очистка не отзывает аккаунт и не удаляет сохранённые сервисом результаты; их срок и условия хранения определяет сервис. В поля формы не передаются пароли или токены, но реальная ошибка сервиса может требовать проверки перед внешней отправкой диагностики.
Управляемый ПередЗакрытием не гарантирует защиту от завершения ОС. Во время завершения приложения он не делает серверных вызовов и не открывает собственные окна. Callback обозначает окончание генерации WAV, а не доказанную остановку всего аудио; собственный ключ удерживается до явного адресного стопа.
Этот урок не использует микрофон, локальную модель или произвольный аудиофайл пользователя. Не запускайте его в рабочей базе: runtimeVerifiedScenarios=0, здесь сервис и аудиоустройство не вызывались.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.