Hi,
Ich arbeite gerade an einem Raspberry PI gestützten Amazon Echo "Imitat". Hab einfach Lautsprecher & Mikro an den Pi gehängt und da läuft eben eine Spracherkennung drauf.
Jetzt gelange ich allerdings langsam an einen Punkt wo ich weiß das die Wartbarkeit des Codes mit jedem weiteren Befehl abnimmt, was natürlich nicht Sinn der Sache sein kann.
Habe mir dazu folgendes überlegt (handelt sich um ein Python Projekt, aber die Vorgehensweise ist sprachenunabhängig): Ich bastele ein einfaches Plugin-System dass einfach alle Module aus dem /commands Ordner lädt die eine Implementierung des ICommand Interfaces haben. Das funktioniert auch soweit.
Jetzt zur eigentlichen Frage: wie gestalte ich die Spracherkennung möglichst flexibel, d.h. sie reagiert sowohl auf "play song xyz" oder "start song xyz" hört? Habe mir dazu überlegt eine Grammatik zu implementieren die aus Verben und Subjekten besteht, die jeweils Synonyme & Deklinationen beinhaltet. Außerdem verfügt Sie natürlich über WildCards die im Falle von oben das "xyz" erkennen würden oder eben jeden anderen Namen. Hier liegt der Hund auch schon begraben - Ich kann nicht abschätzen wie viele Wörter maximal in einer Wildcard sein können, z.B. Songnamen können 1 Wort oder auch 10 haben. Zudem kommt natürlich das Problem das man dazu neigt Füllwörter wie "the", "a" usw. zu nutzen beim Sprechen.
Bisherige Implementierung, die die Reihenfolge der Kommandobestandteile berücksichtigt (Ja es ist Python, aber das soll nur das Prinzip zeigen):
Hat hierzu jemand eine gute Idee?
Ich arbeite gerade an einem Raspberry PI gestützten Amazon Echo "Imitat". Hab einfach Lautsprecher & Mikro an den Pi gehängt und da läuft eben eine Spracherkennung drauf.
Jetzt gelange ich allerdings langsam an einen Punkt wo ich weiß das die Wartbarkeit des Codes mit jedem weiteren Befehl abnimmt, was natürlich nicht Sinn der Sache sein kann.
Habe mir dazu folgendes überlegt (handelt sich um ein Python Projekt, aber die Vorgehensweise ist sprachenunabhängig): Ich bastele ein einfaches Plugin-System dass einfach alle Module aus dem /commands Ordner lädt die eine Implementierung des ICommand Interfaces haben. Das funktioniert auch soweit.
Jetzt zur eigentlichen Frage: wie gestalte ich die Spracherkennung möglichst flexibel, d.h. sie reagiert sowohl auf "play song xyz" oder "start song xyz" hört? Habe mir dazu überlegt eine Grammatik zu implementieren die aus Verben und Subjekten besteht, die jeweils Synonyme & Deklinationen beinhaltet. Außerdem verfügt Sie natürlich über WildCards die im Falle von oben das "xyz" erkennen würden oder eben jeden anderen Namen. Hier liegt der Hund auch schon begraben - Ich kann nicht abschätzen wie viele Wörter maximal in einer Wildcard sein können, z.B. Songnamen können 1 Wort oder auch 10 haben. Zudem kommt natürlich das Problem das man dazu neigt Füllwörter wie "the", "a" usw. zu nutzen beim Sprechen.
Bisherige Implementierung, die die Reihenfolge der Kommandobestandteile berücksichtigt (Ja es ist Python, aber das soll nur das Prinzip zeigen):
Quellcode
- class ICommand():
- words = []
- parameters = []
- def recognize(self, rec_text):
- rec_text_fragments = rec_text.split()
- for word in self.words:
- fragment = None
- while not word.recognize(fragment):
- if len(rec_text_fragments) > 0:
- fragment = rec_text_fragments.pop(0)
- else:
- return False
- if isinstance(word, WildCard):
- self.parameters.append(fragment)
- return True
- def execute(self):
- pass
Hat hierzu jemand eine gute Idee?
faxe1008