18.06.2008, 09:41 | #1 |
Developer
|
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); } У меня такое подозрение, что Axapta не "умеет" выполнять com-методы параллельно. У кого-нибудь есть мысли на этот счет? |
|
18.06.2008, 10:18 | #2 |
Участник
|
попробуйте выделить com-объект в отдельный thread.
см. tutorial-объекты по поводу нитей. см. также обсуждения нитей здесь |
|
18.06.2008, 10:29 | #3 |
Developer
|
Сергей, я уже пробовал выполнять код в нитке, но тоже - молчание
X++: Thread t = new Thread(); ; t.setInputParm(["Сумма накладной №00223: Один рубль 12 коп."]); t.run(classNum(SpeechEngine), identifierStr(speak)); |
|
18.06.2008, 12:37 | #4 |
Developer
|
Больше мыслей ни у кого нет?
Гуглил - не шибко помогло |
|
18.06.2008, 12:56 | #5 |
очами вижу
|
Очевидно, проблема не в том, что что-то не проигрывается. А в том, что COM объект удаляется сразу при выходе из процедуры. Чтобы этого не происходило, необходимо, чтобы переменная, содержащая ссылку на COM-объект не удалялась до тех пор, пока текст читается.
|
|
|
За это сообщение автора поблагодарили: Jox (1). |
18.06.2008, 13:09 | #6 |
Developer
|
Отличная идея! И главное, абсолютно верная, что-то не ожидал я такой топорной реализации от Axapta
|
|
18.06.2008, 13:31 | #7 |
очами вижу
|
На самом деле, предложение mazzy вполне работоспособно, если speak вызывать синхронно (с флагом 0).
|
|
18.06.2008, 13:33 | #8 |
Developer
|
|
|
18.06.2008, 13:35 | #9 |
Developer
|
Дык вот пока не удается синтезировать речь в отдельном потоке, вне потока работает нормально, только Axapta не отвечает (чего и следовало ожидать). Такой же эффект получается при синтезе с флагом 0.
|
|
18.06.2008, 13:37 | #10 |
очами вижу
|
Цитата:
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 |
Developer
|
|
|
18.06.2008, 14:25 | #12 |
Участник
|
А если попробовать просто winApi::shellExecute и запустить написанное на .NET приложение, выполняющее озвучку? И в shellExecute параметры указать так, чтобы АХ не дожидалась завершения выполнения приложения?
Код дальше в АХ при этом нормально выполняться должен |
|
18.06.2008, 14:49 | #13 |
Developer
|
Цитата:
1. Воспроизводимый текст ограничен по длине (это при определенном подходе не так страшно). 2. "Тормоза", пока приложение загрузится, потом еще com-объект синтезирует речь, и в общем получится весьма неприятная задержка. |
|
18.06.2008, 14:54 | #14 |
очами вижу
|
Если в Аксапте можно реализовывать синглтоны, то можно создавать единственный spVoice при первой необходимости. Везде пользоваться только им и удалять его при завершении работы клиента.
|
|
18.06.2008, 15:02 | #15 |
Боец
|
Быть может просто закэшировать объект ?
\Classes\Info\globalCache |
|
|
За это сообщение автора поблагодарили: Jox (1). |
18.06.2008, 16:24 | #16 |
Developer
|
Всем спасибо за мысли.
Решение найдено Код во вложении, кому интересно... Реализовал при помощи globalCache |
|
18.06.2008, 16:36 | #17 |
Участник
|
почему топорная? обычная java. освобождает память из-под объекта, если объект никем не используется
|
|
18.06.2008, 16:47 | #18 |
очами вижу
|
X++: SysGlobalCache globalCache = infolog.objectOnServer() ? appl.globalCache() : infolog.globalCache(); |
|
18.06.2008, 17:26 | #19 |
Участник
|
appl - на сервере infolog - на клиенте
|
|
Теги |
sound, звук, озвучка |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|