SAPI5.1: Grammar aus Datei laden

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,

mal wieder ine Problem: Weiß jemand zufällig wie ich in SAPI5.1 ein Grammar aus einer xml Datei laden kann? Bei mir sieht das bis jetzt in etwa so aus: (für das laden ist die Funktion loadGrammarFile zuständig, file wird aus aufrufender Klasse übergeben)

Code: Alles auswählen

from win32com.client import constants
from thread import *
import win32com.client
import pythoncom
import thread
import time

connect = win32com.client.Dispatch("Python.GetSRServer")

class pySapiIn:
    """ Initialize the speech recognition with the passed in list of words """
    def __init__(self):

        # controls the thread (while 1 => running)
        self.wordsToAdd = [ "One", "Two", "Three", "Four", "Reduce", "Stop" ]
        self.running = 1
        self.active = 1
        self.file = "tv.txt"

        # For speech recognition - first create a listener
        self.listener = win32com.client.Dispatch("SAPI.SpSharedRecognizer")
        
        # Then a recognition context
        self.context = self.listener.CreateRecoContext()
        
        # which has an associated grammar
        self.grammar = self.context.CreateGrammar()
        
        
        # set Dictation State
                        # at first use
                        # Do not allow free word recognition - only command and control
			# recognizing the words in the grammar only
        self.DictationState(0)

        # Load Grammar
        self.LoadGrammar(self.wordsToAdd)
   
        
        # And add an event handler that's called back when recognition occurs
        # start this event handler in new thread
        start_new_thread(self.ConnectEvent,())
        # wait_for_events = self.ConnectEvent()


    def ConnectEvent(self):
        self.eventHandler = ContextEvents(self.context)
        while self.running == 1:
            time.sleep(1)
            while self.active == 1:
                pythoncom.PumpWaitingMessages()

    def LoadGrammar(self, wordsToAdd):
        # Create a new rule for the grammar, that is top level (so it begins
			# a recognition) and dynamic (ie we can change it at runtime)
        self.wordsRule = self.grammar.Rules.Add("wordsRule",
                        constants.SRATopLevel + constants.SRADynamic, 0)
        
        # Clear the rule (not necessary first time, but if we're changing it
			# dynamically then it's useful)
        self.wordsRule.Clear()

        # And go through the list of words, adding each to the rule
        [ self.wordsRule.InitialState.AddWordTransition(None, word) for word in self.wordsToAdd ]

        # Set the wordsRule to be active
        self.grammar.Rules.Commit()
        self.grammar.CmdSetRuleState("wordsRule", 1)
        
        # Commit the changes to the grammar
        self.grammar.Rules.Commit()

    def DictationState(self,state):
        self.grammar.DictationSetState(state)

    def ShutItAllDown(self):
        self.active = 0
        self.running = 0
        del self.listener

    def deactivate(self):
        self.active = 0

    def activate(self):
        self.active = 1
        start_new_thread(self.ConnectEvent,())

    def StartServerConnection(self):
        self.listener = win32com.client.Dispatch("SAPI.SpSharedRecognizer")
        return None

    def shutdown(self):
        self.active = 0
        self.running = 0
        return None

    def restart(self):
        self.active = 1
        self.running = 1
        start_new_thread(self.ConnectEvent,())
        return None

    def loadGrammarFile(self, file):
        self.file = file
        self.grammar = self.context.CreateGrammar()
        self.grammar.CmdLoadFromFile(file, constants.SLODynamic)
        self.grammar.CmdSetRuleIdState(0, constants.SGDSActive)
        self.grammar.CmdSetRuleState("fileRule", 1)
        self.DictationState(0)
        print "Grammar Loaded"
        return None

    
        


"""The callback class that handles the events raised by the speech object.
    See "Automation | SpSharedRecoContext (Events)" in the MS Speech SDK
    online help for documentation of the other events supported. """
class ContextEvents(win32com.client.getevents("SAPI.SpSharedRecoContext")):
    """Called when a word/phrase is successfully recognized  -
        ie it is found in a currently open grammar with a sufficiently high
	confidence"""
    def OnRecognition(self, StreamNumber, StreamPosition, RecognitionType, Result):
        newResult = win32com.client.Dispatch(Result)
        erg = connect.OnWordRecognition(newResult.PhraseInfo.GetText())
gibt bei Ausführung keine Fehlermeldung, aber funktionieren tut es nicht. Der Rest funktioniert einwandfrei nur halt das Laden aus einer Datei heraus nicht.
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Keiner ne Idee? hat doch bestimmt schon mal jedemand gemacht!

Also bin Momentan so weit gekommen, dass der Fehler von :

self.grammar.CmdLoadFromFile(file, constants.SLODynamic)

in der Methode loadGrammarFile() ausgelöst wird, aber ich bin mair auch zu 99% sicher, dass zumindest alles was vor der Klammer steht richtig ist, da die Funktion CmdLoadFromFile() ausgeführt wird und erst bei deren Ausführung ein Fehler entsteht:

Fehlermeldung:

self.grammar.CmdLoadFromFile(file, 0)
File "C:\Programme\Python24\lib\site-packages\win32com\gen_py\C866CA3A-32F7-11D2-9602-00C04F8EE628x0x5x0.py", line 2315, in CmdLoadFromFile
, LoadOption)
pywintypes.com_error: (-2147352567, 'Ausnahmefehler aufgetreten.', (0, None, 'Mitglied nicht gefunden.', None, 0, -2147200942), None)

An der Fehlermeldung sieht man ja dass die Funktion gefunden wurde aber was es mit dem daraus resultierenden pywintypes.com_error auf sich hat, habe ich keine Ahnung!?

Ratlosigkeit...
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

.... tage später das problem bleibt gleich ...

habe inzwischen gemerkt, dass die Fehlermeldung auf

self.grammar.CmdLoadFromFile(file, constants.SLODynamic)

beruht. Darf natürlich nicht file als variablennamen verwenden. Das Ganze als self.file und sie verschwindet. Mit diesem Code:

Code: Alles auswählen

self.listener = win32com.client.Dispatch("SAPI.SpSharedRecognizer")
self.context = self.listener.CreateRecoContext()
self.file = self.grammar_dir + file
self.grammar = self.context.CreateGrammar(0)
self.grammar.CmdLoadFromFile(self.file, constants.SLODynamic)
self.grammar.CmdSetRuleIdState(0, constants.SGDSActive)
läuft alles sauber durch, nur funktionieren tut es überhaupt nicht. Keine Ahnung warum... Lustigerweise funktioniert es ohne Fehlermeldung nicht.

Hilfe!

Nachtrag:

habe gerade festgestellt, dass der oben geschriebene Quellcode nur ohne Fehlermeldung durchläuft, wenn vorher eine Grammatik aus einer Liste geladen wurde, also Liste in Form eines Array, vielleicht bringt mich das weiter
Antworten