Есть пример с использованием MSAgent, т.е. текст читает мультяшный человечек. Кажется, этот пример и тут на васме лежит. Если нужен TTS без человечка, нужно копнуть глубже, но в msdn все эти API прекрасно описаны.
Посмотри этот архив, там есть библиотека, облегчающая работу с голосовыми движками. И пример программы на Ассемблере. В README есть описание функций этой библиотеки.
Black_wanderer Код (Text): call LoadLibraryA, offset szSAPI_DLL ; подгружаем библиотеку mov [hDll],eax ; *** call GetProcAddress,[hDll], offset szCreateSpeech ; получить адрес процедуры CreateSpeak из SAPI_DLL call eax ; вызвать CreateSpeak ; и т.д. Надо же проверять результаты на предмет ошибки Добавил. Более серьёзный баг: Код (Text): try OleCheck( CoCreateInstance(CLSID_TTSEnumerator, Nil, CLSCTX_ALL, IID_ITTSEnum, FITTSEnum) ); ; ... OleCheck в случае ошибки генерирует исключение, но это исключение почему-то не ловится. Вероятно, это связано с тем, что тестовое приложение не использует SEH. Поэтому, нужно либо отказаться от OleCheck и проверять ошибки обычным ифом или использовать обработчик исключений.
Не стал создавать новую тему. Пытаюсь разобраться в вопросе. WinXP, стандартный голос Sam + Алена. Из vbs - скрипта работает. Пытаюсь реализовать на асме - не работает. Код (Text): ;Кое-что опускаю в инклудах include \masm32\include\ole32.inc include \masm32\com\include\oaidl.inc includelib \masm32\lib\ole32.lib ;--------------------------------------------------------------------- ISpVoice STRUCT DWORD ; Censored , для экономии места. Структуру скопипастил отсюда: http://blog.sina.com.cn/s/ blog_3dc2673e01008h5l.html ; Болше нигде не смог найти способ вызвать метод Speak ISpVoice ENDS ;--------------------------------------------------------------------- .data pwsz dd ? psl dd ? hHeap dd ? szspeaktext dw 2000 dup(?) blah db 77,78,79,80,81,82,0 CLSID_SpVoice GUID {96749377h,3391h,11D2h,{9Eh,0E3h,00h,0C0h,4Fh,79h,73h,96h}} IID_ISpVoice GUID {6C44DF74h,72B9h,4992h,{0A1h,0ECh,0EFh,99h,6Eh,04h,22h,0D4h}} ;--------------------------------------------------------------------- .code start: invoke CoInitialize, NULL invoke GetProcessHeap mov hHeap, eax invoke HeapAlloc, hHeap, NULL, MAX_PATH * 2 mov pwsz, eax invoke CoCreateInstance, ADDR CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, ADDR IID_ISpVoice, ADDR psl test eax, eax mov eax,psl mov edx,[eax] .IF SUCCEEDED invoke MultiByteToWideChar,CP_ACP,MB_PRECOMPOSED, addr blah,-1,addr szspeaktext,3 invoke (ISpVoice PTR[edx]).Speak,psl,addr szspeaktext,1,NULL .ENDIF invoke HeapFree, hHeap, NULL, pwsz invoke CoUninitialize invoke ExitProcess, NULL end start Программа завершается без ошибки, но молчит, как партизан. Чего-то не хватает (в коде )?
Спасибо. А что там у меня с edx не так? Вот так работает: Код (Text): .code start: invoke CoInitialize, NULL invoke GetProcessHeap mov hHeap, eax invoke HeapAlloc, hHeap, NULL, MAX_PATH * 2 mov pwsz, eax invoke MultiByteToWideChar,CP_ACP,MB_PRECOMPOSED, addr blah,-1,addr szspeaktext, sizeof blah invoke CoCreateInstance, ADDR CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, ADDR IID_ISpVoice, ADDR psl mov eax,psl mov edx,[eax] invoke (ISpVoice PTR[edx]).Speak,psl,addr szspeaktext,1,NULL [b]invoke MessageBox,NULL,addr blah,addr blah,MB_OK[/b] invoke HeapFree, hHeap, NULL, pwsz invoke CoUninitialize invoke ExitProcess, NULL end start А если закомментировать выделенный мессаж, не работает. Хех... "Добро пожаловать в ассемблер, сынок!" )
Код (Text): invoke (ISpVoice PTR[edx]).Speak,psl,addr szspeaktext,[b]0[/b],NULL Не нашел, где определена константа SPF_ASYNC. Поставил 0 вместо 1, заработало. Иначе - синхронный режим, звук не успевал воспроизводиться, как приложение завершалось. А я уже думал про чудеса со стеком и порчей регистров.