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