Frage zu Windows API / win32com

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Hallo @all,

ich bin schon seit einiger Zeit dabei etwas mit den Windows-eigenen Spracherkennungsschnittstellen SAPI4 + SAPI5.1 zu experimentieren. Soweit läuft bisher auch alles gut, zumindest kommt ein halbwegs flüssiger Dialog zwischen Mensch und Maschine zustande. Um die Erkennung zu verbessern, möchte ich alle auf dem PC verfügbaren Engines parallel laufen lassen. Dazu ist es notwendig jeweils eine Engine auszuwählen und dann zu starten usw...

Problem ist, zumindest bei SAPI5.1, gerade dieses Engine auswählen. Um eine Engine zu wählen muss man laut dem Manual die Methode SetRecognizer aus der SAPI Klasse ISPRecognizer verwenden. Genau an diese Klasse komme ich einfach nicht heran.

Um etwas allgemeiner zu werden: Wenn man von Python aus auf eine API zum ersten Mal zugreift, wird im Verzeichnis C:\Programme\Python24\Lib\site-packages\win32com\gen_py eine Datei mit dem hexadezimalen Namen der Schnittstelle (in diesem Fall C866CA3A-32F7-11D2-9602-00C04F8EE628x0x5x0.py) erzeugt mit welcher man dann direkt arbeitet (per Dispatch). So greife ich zum Beispiel auf die Klasse SpSharedRecognizer zu, komme über diese an die Klasse ISpeechRecognizer und kann mittels Methode CreateRecoContext die Engine starten. Die Klasse SpSharedRecognizer ist in der oben genannten *.py in der CLSIDToClassMap aufgeführt:

Code: Alles auswählen

CLSIDToClassMap = {
	'{CFF8E175-019E-11D3-A08E-00C04F8EF9B5}' : ISpeechAudio,
	'{7013943A-E2EC-11D2-A086-00C04F8EF9B5}' : SpStreamFormatConverter,
	'{3BEE4890-4FE9-4A37-8C1E-5E7E12791C1F}' : SpSharedRecognizer,
	'{9185F743-1143-4C28-86B5-BFF14F20E5C8}' : SpPhoneConverter,
	'{7A1EF0D5-1581-4741-88E4-209A49F11A10}' : ISpeechWaveFormatEx,
	'{947812B3-2AE1-4644-BA86-9E90DED7EC91}' : SpFileStream,
	'{0F92030A-CBFD-4AB8-A164-FF5985547FF6}' : SpTextSelectionInformation,
	'{EABCE657-75BC-44A2-AA7F-C56476742963}' : ISpeechGrammarRuleStateTransitions,
	'{CAFD1DB1-41D1-4A06-9863-E2E81DA17A9A}' : ISpeechGrammarRuleStateTransition,
	'{1A9E9F4F-104F-4DB8-A115-EFD7FD0C97AE}' : ISpeechCustomStream,
	'{41B89B6B-9399-11D2-9623-00C04F8EE628}' : SpInprocRecognizer,
	'{7B8FCB42-0E9D-4F00-A048-7B04D6179D3D}' : _ISpeechRecoContextEvents,
	'{9EF96870-E160-4792-820D-48CF0649E4EC}' : SpAudioFormat,
	'{9047D593-01DD-4B72-81A3-E4A0CA69F407}' : ISpeechPhraseRules,
	'{AF67F125-AB39-4E93-B4A2-CC2E66E182A7}' : ISpeechFileStream,
	'{0626B328-3478-467D-A0B3-D0853B93DDA3}' : ISpeechPhraseElements,
	'{27864A2A-2B9F-4CB8-92D3-0D2722FD1E73}' : ISpeechPhraseAlternate,
	'{715D9C59-4442-11D2-9605-00C04F8EE628}' : SpStream,
	'{269316D8-57BD-11D2-9EEE-00C04F797396}' : ISpeechVoice,
	'{6450336F-7D49-4CED-8097-49D6DEE37294}' : ISpeechBaseStream,
	'{3C76AF6D-1FD7-4831-81D1-3B71D5A13C44}' : ISpeechMMSysAudio,
	'{4E5B933C-C9BE-48ED-8842-1EE51BB1D4FF}' : ISpeechLexiconWord,
	'{08166B47-102E-4B23-A599-BDB98DBFD1F4}' : ISpeechPhraseProperties,
	'{47206204-5ECA-11D2-960F-00C04F8EE628}' : SpSharedRecoContext,
	'{62B3B8FB-F6E7-41BE-BDCB-056B1C29EFC0}' : ISpeechRecoResultTimes,
	'{E6E9C590-3E18-40E3-8299-061F98BDE7C7}' : ISpeechAudioFormat,
	'{AFE719CF-5DD1-44F2-999C-7A399F1CFCCC}' : ISpeechGrammarRule,
	'{D4286F2C-EE67-45AE-B928-28D695362EDA}' : ISpeechGrammarRuleState,
	'{E6176F96-E373-4801-B223-3B62C068C0B4}' : ISpeechPhraseElement,
	'{2890A410-53A7-4FB5-94EC-06D4998E3D02}' : ISpeechPhraseReplacement,
	'{8BE47B07-57F6-11D2-9EEE-00C04F797396}' : ISpeechVoiceStatus,
	'{38BC662F-2257-4525-959E-2069D2596C05}' : ISpeechPhraseReplacements,
	'{EF411752-3736-4CB4-9C8C-8EF4CCB58EFE}' : SpObjectToken,
	'{580AA49D-7E1E-4809-B8E2-57DA806104B8}' : ISpeechRecoContext,
	'{8DBEF13F-1948-4AA8-8CF0-048EEBED95D8}' : SpCustomStream,
	'{3DA7627A-C7AE-4B23-8708-638C50362C25}' : ISpeechLexicon,
	'{72829128-5682-4704-A0D4-3E2BB6F2EAD3}' : ISpeechLexiconPronunciations,
	'{A8C680EB-3D32-11D2-9EE7-00C04F797396}' : SpMMAudioOut,
	'{FEE225FC-7AFD-45E9-95D0-5A318079D911}' : SpRecPlayAudio,
	'{C79A574C-63BE-44B9-801F-283F87F898BE}' : SpWaveFormatEx,
	'{2D5F1C0C-BD75-4B08-9478-3B11FEA2586C}' : ISpeechRecognizer,
	'{6FFA3B44-FC2D-40D1-8AFC-32911C7F1AD1}' : ISpeechGrammarRules,
	'{C9E37C15-DF92-4727-85D6-72E5EEB6995A}' : SpUnCompressedLexicon,
	'{C74A3ADC-B727-4500-A84A-B526721C8B8C}' : ISpeechObjectToken,
	'{CF3D2E50-53F2-11D2-960C-00C04F8EE628}' : SpMMAudioIn,
	'{ED2879CF-CED9-4EE6-A534-DE0191D5468D}' : ISpeechRecoResult,
	'{A910187F-0C7A-45AC-92CC-59EDAFB77B53}' : SpObjectTokenCategory,
	'{EEB14B68-808B-4ABE-A5EA-B51DA7588008}' : ISpeechMemoryStream,
	'{90903716-2F42-11D3-9C26-00C04F8EF87C}' : SpCompressedLexicon,
	'{CE563D48-961E-4732-A2E1-378A42B430BE}' : ISpeechPhraseProperty,
	'{73AD6842-ACE0-45E8-A4DD-8795881A2C2A}' : SpInProcRecoContext,
	'{9285B776-2E7B-4BC0-B53E-580EB6FA967F}' : ISpeechObjectTokens,
	'{3B9C7E7A-6EEE-4DED-9092-11657279ADBE}' : ISpeechTextSelectionInformation,
	'{B238B6D5-F276-4C3D-A6C1-2974801C3CC2}' : ISpeechPhraseAlternates,
	'{8D199862-415E-47D5-AC4F-FAA608B424E6}' : ISpeechLexiconWords,
	'{B6D6F79F-2158-4E50-B5BC-9A9CCD852A09}' : ISpeechRecoGrammar,
	'{A372ACD1-3BEF-4BBD-8FFB-CB3E2B416AF8}' : _ISpeechVoiceEvents,
	'{BFF9E781-53EC-484E-BB8A-0E1B5551E35C}' : ISpeechRecognizerStatus,
	'{C62D9C91-7458-47F6-862D-1EF86FB0B278}' : ISpeechAudioStatus,
	'{CE17C09B-4EFA-44D5-A4C9-59D9585AB0CD}' : ISpeechDataKey,
	'{E2AE5372-5D40-11D2-960E-00C04F8EE628}' : SpNotifyTranslator,
	'{455F24E9-7396-4A16-9715-7C0FDBE3EFE3}' : SpNullPhoneConverter,
	'{95252C5D-9E43-4F4A-9899-48EE73352F9F}' : ISpeechLexiconPronunciation,
	'{CA7EAC50-2D01-4145-86D4-5AE7D70F4469}' : ISpeechObjectTokenCategory,
	'{C23FC28D-C55F-4720-8B32-91F73C2BD5D1}' : SpPhraseInfoBuilder,
	'{3B151836-DF3A-4E0A-846C-D2ADC9334333}' : ISpeechPhraseInfoBuilder,
	'{C3E4F353-433F-43D6-89A1-6A62A7054C3D}' : ISpeechPhoneConverter,
	'{AB1890A0-E91F-11D2-BB91-00C04F8EE6C0}' : SpMMAudioEnum,
	'{961559CF-4E67-4662-8BF0-D93F1FCD61B3}' : ISpeechPhraseInfo,
	'{0655E396-25D0-11D3-9C26-00C04F8EF87C}' : SpLexicon,
	'{A7BFE112-A4A0-48D9-B602-C313843F6964}' : ISpeechPhraseRule,
	'{96749373-3391-11D2-9EE3-00C04F797396}' : SpResourceManager,
	'{11B103D8-1142-4EDF-A093-82FB3915F8CC}' : ISpeechAudioBufferInfo,
	'{96749377-3391-11D2-9EE3-00C04F797396}' : SpVoice,
	'{5FB7EF7D-DFF4-468A-B6B7-2FCBD188F994}' : SpMemoryStream,
}
Ich muss an die Klasse ISpRecognizer ran und die sind in der Datei nur als vtable abgelegt:

Code: Alles auswählen

ISpRecognizer_vtables_dispatch_ = 0
ISpRecognizer_vtables_ = [
	(( 'SetRecognizer' , 'pRecognizer' , ), 1610743808, (1610743808, (), [ (13, 1, None, "IID('{14056589-E16C-11D2-BB90-00C04F8EE6C0}')") , ], 1 , 1 , 4 , 0 , 28 , (3, 0, None, None) , 0 , )),
	(( 'GetRecognizer' , 'ppRecognizer' , ), 1610743809, (1610743809, (), [ (16397, 2, None, "IID('{14056589-E16C-11D2-BB90-00C04F8EE6C0}')") , ], 1 , 1 , 4 , 0 , 32 , (3, 0, None, None) , 0 , )),
	(( 'SetInput' , 'pUnkInput' , 'fAllowFormatChanges' , ), 1610743810, (1610743810, (), [ (13, 1, None, None) , 
			(3, 1, None, None) , ], 1 , 1 , 4 , 0 , 36 , (3, 0, None, None) , 0 , )),
	(( 'GetInputObjectToken' , 'ppToken' , ), 1610743811, (1610743811, (), [ (16397, 2, None, "IID('{14056589-E16C-11D2-BB90-00C04F8EE6C0}')") , ], 1 , 1 , 4 , 0 , 40 , (3, 0, None, None) , 0 , )),
	(( 'GetInputStream' , 'ppStream' , ), 1610743812, (1610743812, (), [ (16397, 2, None, "IID('{BED530BE-2606-4F4D-A1C0-54C5CDA5566F}')") , ], 1 , 1 , 4 , 0 , 44 , (3, 0, None, None) , 0 , )),
	(( 'CreateRecoContext' , 'ppNewCtxt' , ), 1610743813, (1610743813, (), [ (16397, 2, None, "IID('{F740A62F-7C15-489E-8234-940A33D9272D}')") , ], 1 , 1 , 4 , 0 , 48 , (3, 0, None, None) , 0 , )),
	(( 'GetRecoProfile' , 'ppToken' , ), 1610743814, (1610743814, (), [ (16397, 2, None, "IID('{14056589-E16C-11D2-BB90-00C04F8EE6C0}')") , ], 1 , 1 , 4 , 0 , 52 , (3, 0, None, None) , 0 , )),
	(( 'SetRecoProfile' , 'pToken' , ), 1610743815, (1610743815, (), [ (13, 1, None, "IID('{14056589-E16C-11D2-BB90-00C04F8EE6C0}')") , ], 1 , 1 , 4 , 0 , 56 , (3, 0, None, None) , 0 , )),
	(( 'IsSharedInstance' , ), 1610743816, (1610743816, (), [ ], 1 , 1 , 4 , 0 , 60 , (3, 0, None, None) , 0 , )),
	(( 'GetRecoState' , 'pState' , ), 1610743817, (1610743817, (), [ (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 64 , (3, 0, None, None) , 0 , )),
	(( 'SetRecoState' , 'NewState' , ), 1610743818, (1610743818, (), [ (3, 1, None, None) , ], 1 , 1 , 4 , 0 , 68 , (3, 0, None, None) , 0 , )),
	(( 'GetStatus' , 'pStatus' , ), 1610743819, (1610743819, (), [ (36, 2, None, None) , ], 1 , 1 , 4 , 0 , 72 , (3, 0, None, None) , 0 , )),
	(( 'GetFormat' , 'WaveFormatType' , 'pFormatId' , 'ppCoMemWFEX' , ), 1610743820, (1610743820, (), [ 
			(3, 1, None, None) , (36, 2, None, None) , (16420, 2, None, None) , ], 1 , 1 , 4 , 0 , 76 , (3, 0, None, None) , 0 , )),
	(( 'IsUISupported' , 'pszTypeOfUI' , 'pvExtraData' , 'cbExtraData' , 'pfSupported' , 
			), 1610743821, (1610743821, (), [ (16402, 1, None, None) , (16408, 1, None, None) , (19, 1, None, None) , (16387, 2, None, None) , ], 1 , 1 , 4 , 0 , 80 , (3, 0, None, None) , 0 , )),
	(( 'DisplayUI' , 'hWndParent' , 'pszTitle' , 'pszTypeOfUI' , 'pvExtraData' , 
			'cbExtraData' , ), 1610743822, (1610743822, (), [ (36, 1, None, None) , (16402, 1, None, None) , (16402, 1, None, None) , 
			(16408, 1, None, None) , (19, 1, None, None) , ], 1 , 1 , 4 , 0 , 84 , (3, 0, None, None) , 0 , )),
	(( 'EmulateRecognition' , 'pPhrase' , ), 1610743823, (1610743823, (), [ (13, 1, None, "IID('{1A5C0354-B621-4B5A-8791-D306ED379E53}')") , ], 1 , 1 , 4 , 0 , 88 , (3, 0, None, None) , 0 , )),
]
Wie kann ich ein solches vtable benutzen? Muss ja bei anderen Schnittstellen ähnliche Probleme geben. Laut MS sind alle Klassen die mit ISpeech... anfangen für Scriptsprachen wie Python und ISp... für C++, aber es muss ja irgend einen Grund geben, warum die von mir benötigte Klasse abgebildet ist, dann muss man sie doch auch irgendwie nutzbar machen können.

Wäre sehr dankbar über jegliche Hilfe, auch Ideen und Denkanstöße helfen ja manchmal weiter.

Danke!

PS: habe die *.py Datei mal hier abgelegt, wer sich die vielleicht mal komplett ansehen möchte.

PSPS: um noch etwas anzuhängen: die Funktionsweise von ISpeechRecognizer und ISpRecognizer sind eigentlich gleich, nur gibt es einige Methoden in ISpeechRecognizer, wie zB SetRecognizer(), nicht. Aus C++ heraus nutzt man immer ISpRecognizer aus Scriptsprachen ISpeechRecognizer...
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Hallo,

konnte mein Problem leider immernoch nicht lösen und schiebe den Beitrag mal nach oben ;)
Antworten