Speech API

Тема в разделе "WASM.BEGINNERS", создана пользователем koderr, 22 окт 2006.

  1. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Ни у кого нет примеров на *ASM испольования этой штуки? А конкретно TTS (Text-To-Speech).
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Есть пример с использованием MSAgent, т.е. текст читает мультяшный человечек. Кажется, этот пример и тут на васме лежит. Если нужен TTS без человечка, нужно копнуть глубже, но в msdn все эти API прекрасно описаны.
     
  3. Black_wanderer

    Black_wanderer New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2004
    Сообщения:
    7
    Посмотри этот архив, там есть библиотека, облегчающая работу с голосовыми движками.
    И пример программы на Ассемблере. В README есть описание функций этой библиотеки.
     
  4. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Black_wanderer
    Мегаспасибо!
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Black_wanderer
    Код (Text):
    1. call LoadLibraryA, offset szSAPI_DLL ; подгружаем библиотеку
    2. mov [hDll],eax
    3. ; ***
    4. call GetProcAddress,[hDll], offset szCreateSpeech ; получить адрес процедуры CreateSpeak из SAPI_DLL
    5. call eax  ; вызвать CreateSpeak
    6. ; и т.д.
    Надо же проверять результаты на предмет ошибки ;)

    Добавил. Более серьёзный баг:
    Код (Text):
    1. try
    2.    OleCheck( CoCreateInstance(CLSID_TTSEnumerator, Nil, CLSCTX_ALL, IID_ITTSEnum, FITTSEnum) );
    3. ; ...
    OleCheck в случае ошибки генерирует исключение, но это исключение почему-то не ловится. Вероятно, это связано с тем, что тестовое приложение не использует SEH. Поэтому, нужно либо отказаться от OleCheck и проверять ошибки обычным ифом или использовать обработчик исключений.
     
  6. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Не стал создавать новую тему. Пытаюсь разобраться в вопросе.
    WinXP, стандартный голос Sam + Алена. Из vbs - скрипта работает. Пытаюсь реализовать на асме - не работает.
    Код (Text):
    1. ;Кое-что опускаю в инклудах
    2. include \masm32\include\ole32.inc
    3. include \masm32\com\include\oaidl.inc
    4. includelib \masm32\lib\ole32.lib
    5. ;---------------------------------------------------------------------
    6. ISpVoice STRUCT DWORD
    7.    ; Censored , для экономии места. Структуру скопипастил отсюда: http://blog.sina.com.cn/s/  blog_3dc2673e01008h5l.html
    8.    ; Болше нигде не смог найти способ вызвать метод Speak
    9. ISpVoice ENDS
    10.  
    11. ;---------------------------------------------------------------------
    12. .data
    13.   pwsz    dd ?      
    14.   psl     dd ?        
    15.   hHeap   dd ?
    16.   szspeaktext dw 2000 dup(?)
    17.   blah db 77,78,79,80,81,82,0
    18.   CLSID_SpVoice       GUID  {96749377h,3391h,11D2h,{9Eh,0E3h,00h,0C0h,4Fh,79h,73h,96h}}
    19.   IID_ISpVoice      GUID    {6C44DF74h,72B9h,4992h,{0A1h,0ECh,0EFh,99h,6Eh,04h,22h,0D4h}}
    20. ;---------------------------------------------------------------------
    21. .code
    22. start:
    23.     invoke CoInitialize, NULL
    24.     invoke GetProcessHeap
    25.     mov hHeap, eax
    26.     invoke HeapAlloc, hHeap, NULL, MAX_PATH * 2
    27.     mov pwsz, eax
    28.     invoke CoCreateInstance, ADDR CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, ADDR IID_ISpVoice, ADDR psl
    29.     test eax, eax
    30.     mov eax,psl
    31.     mov edx,[eax]
    32.     .IF SUCCEEDED
    33.         invoke MultiByteToWideChar,CP_ACP,MB_PRECOMPOSED, addr blah,-1,addr szspeaktext,3
    34.         invoke (ISpVoice PTR[edx]).Speak,psl,addr szspeaktext,1,NULL
    35.     .ENDIF
    36.     invoke HeapFree, hHeap, NULL, pwsz
    37.     invoke CoUninitialize
    38.     invoke ExitProcess, NULL
    39. end start
    Программа завершается без ошибки, но молчит, как партизан. Чего-то не хватает (в коде :) )?
     
  7. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    и
    а также

    и
     
  8. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Спасибо. :) А что там у меня с edx не так? Вот так работает:
    Код (Text):
    1. .code
    2. start:
    3.     invoke CoInitialize, NULL
    4.     invoke GetProcessHeap
    5.     mov hHeap, eax
    6.     invoke HeapAlloc, hHeap, NULL, MAX_PATH * 2
    7.     mov pwsz, eax
    8.     invoke MultiByteToWideChar,CP_ACP,MB_PRECOMPOSED, addr blah,-1,addr szspeaktext, sizeof blah
    9.     invoke CoCreateInstance, ADDR CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, ADDR IID_ISpVoice, ADDR psl
    10.     mov eax,psl
    11.     mov edx,[eax]
    12.     invoke (ISpVoice PTR[edx]).Speak,psl,addr szspeaktext,1,NULL
    13.     [b]invoke MessageBox,NULL,addr blah,addr blah,MB_OK[/b]
    14.     invoke HeapFree, hHeap, NULL, pwsz
    15.     invoke CoUninitialize
    16.     invoke ExitProcess, NULL
    17.  
    18. end start
    А если закомментировать выделенный мессаж, не работает. Хех... "Добро пожаловать в ассемблер, сынок!" :))
     
  9. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Код (Text):
    1. invoke (ISpVoice PTR[edx]).Speak,psl,addr szspeaktext,[b]0[/b],NULL
    Не нашел, где определена константа SPF_ASYNC. Поставил 0 вместо 1, заработало.
    Иначе - синхронный режим, звук не успевал воспроизводиться, как приложение завершалось.
    А я уже думал про чудеса со стеком и порчей регистров.