Spracherkennung mit SAPI 4 in Python

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
homer

Hallo Leuts,

ich versuche gerade auf SAPI 4 (Microsoft Speech API) in Python zuzugreifen um ein Spracherekennungstool zu schreiben. Es sollte eigentlich alles funktionieren. Die Einbindung über ActiveX geht, nur der EventHandler für die Spracherkennung wird nicht gestartet. Die Parameterliste des Events OnPhraseFinish stimmt auch noch nicht. Eigentlich sollte es dort einen Fehler geben.

Vieleicht kann mir ja jemand von euch helfen.

Code: Alles auswählen

import win32com.client
from win32com.client import *
import pythoncom
import string

defaultNamedOptArg=pythoncom.Missing
defaultNamedNotOptArg=pythoncom.Missing
defaultUnnamedArg=pythoncom.Missing

gencache.EnsureModule("ActiveListen.ActiveListen", 0, 1, 0)

class dictation:
    """ Initialize the speech recognition with the passed in list of words """
    def __init__(self, eventClass=None):
        # For text-to-speech
        self.sr = win32com.client.DispatchWithEvents("ActiveListen.ActiveListen", eventClass) 
        
        self.sr.GrammarFromString("[Grammar] \n langid = 1033 \n type=dictation")        
        self.speaker = win32com.client.Dispatch("SAPI.SpVoice")
        # For speech recognition - first create a listener
        self.say(self.sr.Grammars(1))
        self.say("Started successfully")
	"""Speak a word or phrase"""
    def say(self, phrase):
        self.speaker.Speak(phrase)
    
class ExampleSapiEvents:
    def OnPhraseFinish(self):
        newResult = win32com.client.Dispatch(Result)
        print "You said: ",newResult.PhraseInfo.GetText()
    def OnPhraseStart(self, hi=defaultNamedNotOptArg, lo=defaultNamedNotOptArg):
        print "Hallo"
    
if __name__=='__main__':
    wordsToAdd = [ "Hello", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"]
    speechReco = dictation( ExampleSapiEvents)
    while 1:     
        pythoncom.PumpWaitingMessages()
Edit (Leonidas): Programm in Python Tags gesetzt, da sonst komplett unlesbar und nicht gültiger Code.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Vielleicht kannst du ja den Code vom PyGE Projekt durchforsten. Ich auch mal was ich so zusammenbekomme.

Magest du eigentlich SAPI4 oder SAPI5 haben?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Homer

Für SAPI5 habe ich gute Beispiele, die auch funktionieren. Brauche aber SAPI4, da ich ViaVoice von IBM nutzen möchte.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich habe gerade was im Python Cookbook gefunden (unten ist auch eines ohne Tk), konnte es aber leider nicht testen, da ich nur SAPI 5.0 habe. Ich habe mal SAPI 4.0 installiert, aber irgendwie keine Stimmen.. wenn du welche findest.. Sonst habe ich noch pyTTS gefunden, vielleicht hilft dir das ja.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
abgdf

@ Leonidas: Will er nicht "Speech to Text" und nicht "Text to Speech" ?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

abgdf hat geschrieben:Will er nicht "Speech to Text" und nicht "Text to Speech" ?
Hast du etwa etwas zu "Speech To Text" gefunden?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Mit Jython könnte man http://cmusphinx.sourceforge.net/sphinx4/ nutzen.
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Also ich beschäftige mich selbst sehr ausgiebig mit SAPI4 + SAPI5 in Python. Speech Recognition mit Python und SAPI4 funktioniert, allerdings musst du dir ne *.dll schreiben um auf die Schnittstelle aus Python zugreifen zu können. Kann dir über die *.dll jetzt nicht so viel sagen, da sich damit ausschließlich mein Kollege beschäftigt hat. Ansonsten schau dich mal auf http://fh-wiki.de.vu um da wirst du unter Projekte einges finden.

Meine SAPI4 Python sieht so aus: (das modul test ist der Zugriff auf die dll)

Code: Alles auswählen

import test
import pythoncom
import thread
import time
import win32com.client


#con = win32com.client.Dispatch("Python.GetSRServer")

class VoiceEvent:
    def __init__(self, **kwargs):
      self.__dict__.update(kwargs)

class VoiceEventManager:
    def __init__(self, pySapiIn_self):
      self.handlers = {}
      self.sapi = pySapiIn_self.onreco

    def ConnectHandler(self, name, func):  
      if callable(func):
          self.handlers[name] = func
    
    def DisconnectHandler(self, name):
      try:
        del self.handlers[name]
      except KeyError:
        pass
      
    def OnPhraseFinish(self, text):  
      try:
        name = 'OnPhraseFinish'
        func = self.handlers[name]
        #self.sapi.NewReco(text)
        self.sapi.OnWordRecognition(text)
        #self.sapi.OnWordRecognition(text)
        #erg = con.OnWordRecognition(text)
        #self.sapi.sr.NewReco(text)
      except KeyError:
        return
      func(text)
      
      
      
class pySapiIn:
    def __init__(self, sr_self):
        self.onreco = sr_self
        self.sr = test.SpeechRec()
        self.events = VoiceEventManager(self)
        self.sr.set_pymethod(self.events.OnPhraseFinish)
        self.currentEngine= ""
        self.activated= 0
        self.started=0
        self.grammar_dir = "Grammar\SAPI4\\"
        self.file = "tv2.txt"
        self.wordsToAdd = ['Hello','Howdy','Control','Open']
        self.dic_state = 0
        self.grammar_method = 0 # current status how grammar loaded; 0= LoadGrammar with WordList; 1= LoadGrammarFile
        
        engines = self.getEngines()
        self.setEngine(engines[1])
        self.loadGrammarFile(self.file)
        self.activate()
        self.connect("OnPhraseFinish", self.func1)
        self.init()

        
    def init(self):
        
        thread.start_new_thread(self.endless,())

    def loadGrammarFile(self, file):
        self.file = self.grammar_dir + file
        self.grammar_method = 1

    def endless(self):
        self.sr.GetItAllSetup()
        self.sr.SetSpeechEngine(self.currentEngine)
        self.sr.LoadGrammarFile(self.file)
        self.sr.Activate()
        self.started = 1
        while(self.started==1):
            time.sleep(1)
            while self.activated & self.started:
                time.sleep(0.05)
                try:
                    self.sr.Nachrichten()
                except:
                    pass
               
        self.sr.ShutItAllDown()
        print "deaktiviert"
               
    def getEngines(self):
        self.sr.GetItAllSetup()
        s = self.sr.get_engines()
        self.sr.ShutItAllDown()
        return s

    def setEngine(self, name):
        self.currentEngine = name
                      
    def connect(self, name, func):
        self.events.ConnectHandler(name, func)

    def func1(x):
        print  x
        return 0

    def activate(self):
        self.activated = 1
        
    def deactivate(self):
        self.activated = 0
        
        
    def shutdown(self):
        self.started = 0

    def restart(self):
        self.activate()
        self.init()

    def ShutItAllDown(self):
        self.started = 0
        self.activated = 0
        con = ""
        # self.sr.ShutItAllDown()

    def StartServerConnection(self):
        #con = win32com.client.Dispatch("Python.GetSRServer")
        return None

    def GrammarWords(self):
        return self.wordsToAdd

    def CurDicState(self):
        return self.dic_state

    def DictationState(self, state):
        self.dic_state = state
        return None

    def GrammarLoadMode(self):
        return self.grammar_method

    def CurGrammarFile(self):
        return self.file


PS: ein bißchen Suche und du wirst eine dll im Netz finden ;) die du umbauen kannst
Antworten