ich habe mal hier das Thema eröffnet, weil ich denke, dass es hierhin besser passt. Ansonsten bitte verschieben!
Mein Problem:
Ich habe DNS 12.5 und versuche mit Hilfe von DragonFly/Natlink meine eigene kleine Steuerung zu programmieren. Erkennung klappt hervorragend, ein bisschen Training fehlt aber noch.
Wenn ich "Computer Licht an/aus" sage möchte ich das in diesem Fall mein Script "_icom.py" über eine TCP-Verbindung an meinem Server schickt, dass er das lockt an/aus machen soll. Das manuelle Senden klappt und alles funktioniert bis auf die automatische Verbindung über Sockets.
Momentan habe ich einige Probleme mit Threading in NatLink/DragonFly. Als Test habe ich eine Funktion loop_test() geschrieben, da ich Probleme mit der SocketVerbindung festgestellt habe.
loop_test() wird wie start_tcp_socket() in jeweils einem neuen Thread ausgeführt. Normalerweise sollte mir die Funktion jede Sekunde ein "loop" ausgeben. Dies tut sie aber nicht und macht es irgendwie sehr unregelmäßig. Während ich anfange zu sprechen und wenn DNS meine Eingabe wiederholt gibt es einen Output. ->print "loop" Sonst nicht.
Ich hänge die 80 Zeilen Code meiner _icom.py an.
Meine Frage: 1) Bin ich im richtigen Forum? 2) Ist mein Problem verständlich? 3) Habt ihr irgendwelche Tipps oder ähnliche Programme?
import socket, time from thread import start_new_thread
#--------------------------------------------------------------------------- # Create this module's grammar and the context under which it'll be active.
grammar = Grammar("ICOM") print "ICOM wird geladen..."
#--------------------------------------------------------------------------- # Create a mapping rule which maps things you can say to actions. # # Note the relationship between the *mapping* and *extras* keyword # arguments. The extras is a list of Dragonfly elements which are # available to be used in the specs of the mapping. In this example # the Dictation("text")* extra makes it possible to use "" # within a mapping spec and "%(text)s" within the associated action.
def start_tcp_socket():
TCP_IP = '0.0.0.0' TCP_PORT = 5005 BUFFER_SIZE = 20 # Normally 1024, but we want fast response
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((TCP_IP, TCP_PORT)) s.listen(1)
while 1: print "in loop, waiting for connection" conn, addr = s.accept() print 'Connection address:', addr
data = conn.recv(BUFFER_SIZE) if not data: break print "received data:", data conn.send(data) # echo conn.close()
def loop_test(): while 1: print "loop" time.sleep(1)
example_rule = MappingRule( name="example", # The name of the rule. mapping={ # The mapping dict: spec -> action. "[Computer] ": Function(speak, extra='text'), }, extras=[ # Special elements in the specs of the mapping. Dictation("text"), ], )
# Add the action rule to the grammar instance. grammar.add_rule(example_rule)
#--------------------------------------------------------------------------- # Load the grammar instance and define how to unload it.
Zitat von mattze96Meine Frage: 1) Bin ich im richtigen Forum? 2) Ist mein Problem verständlich? 3) Habt ihr irgendwelche Tipps oder ähnliche Programme?
zu 1) Möglicherweise, da ich der Mann bin, der es überhaupt ermöglicht hat, dass Sie NatLink in Version 12 verwenden, indem ich den kompletten Quellcode umprogrammiert und darauf angepasst habe.
zu 2) Nein, aber das sind die meisten Fragen zu dem Thema für mich jedenfalls nicht.
zu 3) Nein.
Gruß, RW
_______________________________________
Dragon Professional 16 auf Windows 10 Pro und Windows 11 SpeechMike Premium (LFH3500); Office 2019 Pro + Office 365 (monatliches Abo) HP ZBook Fury 17 G8 - i7-11800H - 24 MB SmartCache - 32 GB RAM - 1 TB SSD
ich habe immernoch keine weiteren Erfolge erzielen können. Der Server-Thread läuft irgendwie weiterhin komisch. nochmal zu meinem Problem:
ich möchte DNS sozusagen als Server nutzen. Der Server soll erkannte sprache an ein Python script schicken, welches diese dann verarbeitet. DNS sitzt in einer virtuellen Maschine unter Windows und Python Script soll als Client unter Linux laufen. Mein Ziel ist es NUR DNS unter Windows laufen zu lassen und den Rest unter Linux zu betreiben.
Es soll TTS und STT ausgetauscht werden können.
Beispiel: Ich sage: Computer mach das Licht an. DNS -> Client: "Computer mach das Licht an" Client verabeitet und schaltet das Licht ein. Client -> DNS: "Das Licht wurde an gemacht." DNS sagt: "Das Licht wurde an gemacht."
Zitat von mattze96ich möchte DNS sozusagen als Server nutzen. Der Server soll erkannte sprache an ein Python script schicken, welches diese dann verarbeitet. DNS sitzt in einer virtuellen Maschine unter Windows und Python Script soll als Client unter Linux laufen. Mein Ziel ist es NUR DNS unter Windows laufen zu lassen und den Rest unter Linux zu betreiben.
Das ist nun etwas klarer. Nach meiner langjährigen Lektüre des (mittlerweile von der Bildfläche verschwundenen) Speechcomputing Forums sind Sie nicht der erste, der auf die Idee gekommen ist, wären aber vermutlich der erste, dem es gelingen würde, wenn es Ihnen gelingt.
Meiner Kenntnis des Quell-Codes nach wird es mit NatLink auf keinen Fall gehen, weil NatLink und DNS so zwitterhaft miteinander verwoben sind, dass man sie nur mittels Total-Operation auseinander bekommt - was ich gerade hinter mir habe, aber der Patient liegt noch auf der Intensivstation.
Ob DNS über die Grenzen zwischen einer VM, auf der es läuft, und der die VM umgebenden Linux-Welt (die nicht meine und mir unbekannt ist) hinweg überhaupt operieren kann, halte ich weiterhin für fraglich.
Aber geben Sie nicht auf, ich gebe auch nie auf, sonst hätte ich NatLink nicht für DNS 12 fit gekriegt!
Gruß, RW
_______________________________________
Dragon Professional 16 auf Windows 10 Pro und Windows 11 SpeechMike Premium (LFH3500); Office 2019 Pro + Office 365 (monatliches Abo) HP ZBook Fury 17 G8 - i7-11800H - 24 MB SmartCache - 32 GB RAM - 1 TB SSD