Frage: Raspberry übers Web & Python via Sprache steuern.

  • Ich hab einen Pi im Netzwerk, auf dem läuft mit bottle ein WebServer.


    Nun suche ich eine Möglichkeit, den Pi über Netzwerk und dem Web-Interface via Sprache zu steuern - also Speech-To-Text. Für letzteres nutze ich speech_recognition, aber womit kann ich das Mic meines PC's quasi streamen? :s



    Also der Pi steht far far away, ein direktes Mikrofon am Pi selbst kommt nicht in Frage, auch kein Bluetooth oder so.


    Ich möchte eine Webseite öffnen, einen Button drücken, in mein Mikrofon sabbeln, der Pi empfängt und verarbeitet es ... usw



    Hintergrund ist mein RoPi Projekt, in dem ich meinem Gefährt Sprachbefehle geben können möchte, auch wenn dieser außer Sichtweite ist.


    Es muss auf jeden Fall mit Bottle umgesetzt werden, da darauf mein gesamtes Web-Interface basiert - möchte nur ungerne Mischmasch.
    Python3 ist ebenfalls Pflicht ;)


    Ich hab zwar angebliche HTML5 Lösungen gefunden, benötigen aber Google Chrome - nutze ich zwar, möchte es aber gerne auch für FireFox lauffähig haben (auch wenn ich persönlich SRWare Iron bevorzuge)



    Mein tts und stt Gedöns sieht derzeit so aus: => http://codepad.org/SllgOq0B



    :danke_ATDE:

  • Hallo,


    also meine spontane Idee wäre:


    - Client-seitig den Text aufnehmen, vermutlich unter Einsatz einer JS Lib
    - an den Server senden (POST-Request, Websocket, was-auch-immer)
    - Serverseitig verarbeiten


    Ob das so möglich ist - keine Ahnung. Aber danach würde ich im Web suchen, wenn ich das gleiche Problem hätte.


    Gruß, noisefloor

  • Ja, ich würde, wie noisefloor auch versuchen, den Sprachbefehl schon auf der Clientseite in Text umzuwandlen. Wenn die Erkennung unbedingt auf dem Pi funktionieren soll: Muss von jedem PC aus gesendet werden können, oder nur von einem? Wenn du eh nur einen PC zum Steuern benutzt, gäbe es vielleicht die Möglichkeit mit JACK Audio ein remote Microphone zu streamen (sowas in die Richtung: https://www.raspberrypi.org/fo…iewtopic.php?f=41&t=78185)


    Wenn es von einem beliebigen PC aus funktionieren soll, könntest du eventuell auch die aufgenommene WAV Datei an den HTTP POST anhängen. So macht man das ja auch bei der Google Voice API. Könnte mir nur vorstellen, dass das dann die Latenz erhöht und die soll schätzungsweise optimiert werden, dass der Roboter nicht schon an die Wand gefahren ist, bis der Befehl ausgewertet wurde :D

  • Ich hab gerade diese Seiten gefunden:
    https://dvcs.w3.org/hg/audio/r…ams/StreamProcessing.html
    https://de.wikipedia.org/wiki/WebRTC , https://lincolnloop.com/blog/what-webrtc/ , http://pyvideo.org/europython-…tions-with-webrtc-an.html , https://github.com/webrtc/samples
    https://w3c.github.io/media-source/
    https://github.com/rahulsekar/brautopy


    Letzteres sieht interessant aus
    WebRTC sieht aber auch interessant aus


    ..Naja, sehr viel zum lesen.. *puh*


    //EDIT: Ich denke das wäre mit "BRowser webAUdio TO PYthon webserver" machbar, nach beenden der Aufnahme wird eine *.wav geschrieben die wiederum von speech_recognition.AudioFile eingelesen wird ... Vorteil: Dank Opus Codec sind die übertragenen Daten kleiner da encoded/komprimiert, es muss also insg. weniger übertragen werden.
    mal zurecht basteln ;)

  • Puh, komplizierter als gedacht... :@


    Mittlerweile muss man mit Google Chrome HTTPS verwenden um die Audio API verwenden zu können => https://sites.google.com/a/chr…tures-on-insecure-origins


    Das wiederum kloppt sich dann aber mit WebSocket. Da https verwendet wird weigert sich der Browser eine normale ws:// Verbindung herzustellen - also muss man auch hier nachrüsten und wss:// (secure websocket) verwenden, nur hier beginnen dann die Probleme...


    Ich würde gerne ws4py nutzen da ich das bereits für den Stream der RaspiCam nutze. ws4py scheint das aber nur als Client zu unterstützen nicht als Server :-/
    Google selbst entwickelt pywebsocket mit dem das möglich wäre, ist aber unstable
    Da ich bereits bottle verwende, will ich nicht tornado zur Lösung dieses Problems nutzen - damit ginge das auch.
    websockify würde das angeblich am besten unterstützen.


    :denker: sollte ich jetzt ws4py einstampfen und alles umprogrammieren? :s


    Evtl. kann man auch Pythons ssl Module verwenden (ssl.wrap_socket()), sieht mir aber grad zu komplex aus :blush:


    Aber HTTPS ist nicht gleich HTTPS. HTTPS kann über SSL und TLS in unterschiedlichen Versionen mit unterschiedlichen Verschlüsselungsalgorithmen laufen....




    PS: Und durch dieses Problem wiederum muss ich bottle bei bringen auch über https ansprechbar zu werden, ggf funktioniert eines von http://stackoverflow.com/a/21641086