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,
}
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 , )),
]
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...