AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.06.2008, 09:41   #1  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Lightbulb Speech API в Axapta
Интегрировал в Axapta Speech API. Осталась только небольшая проблемка...
X++:
static client void speak(str _text)
{
    com             spVoice;
    ;

    if (!SysUserInfo::find().enabledSpeechEngine)
        return;

    spVoice = new com("{96749377-3391-11D2-9EE3-00C04F797396}");

    if (!spVoice)
        return;

    spVoice.Rate(10);
    spVoice.speak(_text);
}
Заключается она в том, что com-метод spVoice.speak(_text) необходимо выполнять параллельно. Для этого указывается второй параметр spVoice.speak(_text, 1); (Default - 0). В Visual Studio - работает, в Delphi - работает, а вот, в Axapta молчание
У меня такое подозрение, что Axapta не "умеет" выполнять com-методы параллельно.

У кого-нибудь есть мысли на этот счет?
Старый 18.06.2008, 10:18   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
попробуйте выделить com-объект в отдельный thread.
см. tutorial-объекты по поводу нитей.
см. также обсуждения нитей здесь
__________________
полезное на axForum, github, vk, coub.
Старый 18.06.2008, 10:29   #3  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Сергей, я уже пробовал выполнять код в нитке, но тоже - молчание
X++:
    Thread  t = new Thread();
    ;

    t.setInputParm(["Сумма накладной №00223: Один рубль 12 коп."]);
    t.run(classNum(SpeechEngine), identifierStr(speak));
Старый 18.06.2008, 12:37   #4  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Больше мыслей ни у кого нет?
Гуглил - не шибко помогло
Старый 18.06.2008, 12:56   #5  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Очевидно, проблема не в том, что что-то не проигрывается. А в том, что COM объект удаляется сразу при выходе из процедуры. Чтобы этого не происходило, необходимо, чтобы переменная, содержащая ссылку на COM-объект не удалялась до тех пор, пока текст читается.
За это сообщение автора поблагодарили: Jox (1).
Старый 18.06.2008, 13:09   #6  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Очевидно, проблема не в том, что что-то не проигрывается. А в том, что COM объект удаляется сразу при выходе из процедуры. Чтобы этого не происходило, необходимо, чтобы переменная, содержащая ссылку на COM-объект не удалялась до тех пор, пока текст читается.
Отличная идея! И главное, абсолютно верная, что-то не ожидал я такой топорной реализации от Axapta
Старый 18.06.2008, 13:31   #7  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
На самом деле, предложение mazzy вполне работоспособно, если speak вызывать синхронно (с флагом 0).
Старый 18.06.2008, 13:33   #8  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
На самом деле, предложение mazzy вполне работоспособно, если speak вызывать синхронно (с флагом 0).
На самом деле я это и имел ввиду, но мне нужно вызывать с флагом Async, дабы функционал работал дальше, а параллельно происходил синтез речи.
Старый 18.06.2008, 13:35   #9  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Дык вот пока не удается синтезировать речь в отдельном потоке, вне потока работает нормально, только Axapta не отвечает (чего и следовало ожидать). Такой же эффект получается при синтезе с флагом 0.
Старый 18.06.2008, 13:37   #10  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от Jox Посмотреть сообщение
На самом деле я это и имел ввиду, но мне нужно вызывать с флагом Async, дабы функционал работал дальше, а параллельно происходил синтез речи.
X++:
Thread  t = new Thread();
;

t.setInputParm(["Сумма накладной №00223: Один рубль 12 коп."]);
t.run(classNum(SpeechEngine), identifierStr(speak)); // там флаг 0

// тут можно писать остальной функционал,
// который должен работать параллельно с озвучкой.
А, хотя Аксапта так же может убить поток, когда эта функция закончится. Надо проверять.

Последний раз редактировалось RumataEstor; 18.06.2008 в 13:40.
Старый 18.06.2008, 13:51   #11  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
X++:
// тут можно писать остальной функционал,
// который должен работать параллельно с озвучкой.
хехе, так не пойдет, метод теряет смысл
Нельзя длительность синтеза сравнивать с длительностью выполнения кода до конца метода.
Старый 18.06.2008, 14:25   #12  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А если попробовать просто winApi::shellExecute и запустить написанное на .NET приложение, выполняющее озвучку? И в shellExecute параметры указать так, чтобы АХ не дожидалась завершения выполнения приложения?
Код дальше в АХ при этом нормально выполняться должен
Старый 18.06.2008, 14:49   #13  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Цитата:
Сообщение от kashperuk Посмотреть сообщение
А если попробовать просто winApi::shellExecute и запустить написанное на .NET приложение, выполняющее озвучку? И в shellExecute параметры указать так, чтобы АХ не дожидалась завершения выполнения приложения?
Код дальше в АХ при этом нормально выполняться должен
тут сразу же напрашиваются две проблемы:
1. Воспроизводимый текст ограничен по длине (это при определенном подходе не так страшно).
2. "Тормоза", пока приложение загрузится, потом еще com-объект синтезирует речь, и в общем получится весьма неприятная задержка.
Старый 18.06.2008, 14:54   #14  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Если в Аксапте можно реализовывать синглтоны, то можно создавать единственный spVoice при первой необходимости. Везде пользоваться только им и удалять его при завершении работы клиента.
Старый 18.06.2008, 15:02   #15  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Быть может просто закэшировать объект ?
\Classes\Info\globalCache
За это сообщение автора поблагодарили: Jox (1).
Старый 18.06.2008, 16:24   #16  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Thumbs up
Всем спасибо за мысли.
Решение найдено
Код во вложении, кому интересно...
Реализовал при помощи globalCache
Вложения
Тип файла: xpo SpeechEngine.xpo (2.3 Кб, 300 просмотров)
Старый 18.06.2008, 16:36   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Jox Посмотреть сообщение
Отличная идея! И главное, абсолютно верная, что-то не ожидал я такой топорной реализации от Axapta
почему топорная? обычная java. освобождает память из-под объекта, если объект никем не используется
__________________
полезное на axForum, github, vk, coub.
Старый 18.06.2008, 16:47   #18  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
X++:
SysGlobalCache globalCache = infolog.objectOnServer() ?
        appl.globalCache() : infolog.globalCache();
А зачем пользоваться infolog.globalCache()? Я так понимаю, appl.globalCache() всегда на клиенте? Тогда почему бы всегда не пользоваться только им?
Старый 18.06.2008, 17:26   #19  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
appl - на сервере infolog - на клиенте
Теги
sound, звук, озвучка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 12.04.2007 16:10
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 22.11.2006 15:20
axaptabuilder: How to setup Axapta batch server running as user defined windows service Blog bot DAX Blogs 0 28.10.2006 16:47
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:26.