2017-09-02 2 views
0

klicken Ich brauche Hilfe. Ich habe einen Roboter mit Raspberry Pi gebaut und dann mit einer Kamera und einem Lautsprecher erweitert. Ich habe einen Lighthttpd-Server installiert und kann ihn über eine einfache Website steuern.Wie espeak Befehl ausführen, wenn ich auf einen Link in einer Website auf einem Raspberry Pi

Es funktioniert gut, der Webserver präsentiert diese Seite: https://github.com/Mjrovai/MJRoBot-Web-RPi-Robot/blob/master/index.html und wenn eine Schaltfläche angeklickt wird ein CGI-Skript einen Motor starten. Zum Beispiel forward.cgi (herausgegeben https://github.com/Mjrovai/MJRoBot-Web-RPi-Robot/blob/master/cgi-bin/forward.cgi) Skript enthält:

#!/bin/bash 
gpio mode 7 out 
gpio mode 0 out 
gpio mode 2 out 
gpio mode 3 out 
gpio write 7 0 
gpio write 0 1 
gpio write 2 0 
gpio write 3 1 

Wenn obigen Skript läuft es jeweils GPIO und Motoren starten setzt.

Was ich versuche, ist jetzt, eine Funktion hinzuzufügen, wenn ich eine Taste drücke, wird ein anderes CGI-Skript verwendet, um etwas Sprache zu erzeugen. Das Problem, das ich habe, ist, selbst wenn ich einen unteren Befehl zur oben genannten Datei hinzufüge, laufen die Motoren, aber es spricht nicht.

espeak test 

Ich versuchte mit PHP. Ich habe unten index.php Datei verwendet, um speak.sh zu starten, wenn Link geklickt wird, aber es funktioniert nicht.

index.php

<?php 
if ($_GET['run']) { 
    # This code will run if ?run=true is set. 
    exec("speak.sh"); 
} 
?> 

<!-- This link will add ?run=true to your URL, myfilename.php?run=true --> 
<a href="?run=true">Click Me!</a> 

speak.sh (aus stackoverflow.com kopiert)

#!/bin/bash 
# 
# announce - script to convert text parameter into spoken sound 
# 
# Prerequisites: 
# eSpeak 
# mbrola binary 
# mbrola voice 
# alsa sound 
# libportaudio 
# 
# Axel Kemper 21-Feb-2015 
# 
#================================================================== 
# 

get_abs_dir() { 
    echo "$(cd "$(dirname "$1")" && pwd)" 
} 

set_volume() { 
    # "amixer scontrols" lists all simple ALSA controls 
    # http://manpages.ubuntu.com/manpages/lucid/man1/amixer.1.html 
    amixer set Headphone $1 > /dev/null 
    amixer set Headphone $2 > /dev/null 
    amixer set PCM $1 > /dev/null 
    amixer set PCM $2 > /dev/null 
} 

text=$* 
amplitude=100  # 0 .. 200 default: 100 
pitch=50   # 0 .. 99 default: 50 
wordsPerMinute=90 # 80 .. 450 default: 175 
charFormat=2  # 8-bit character set 
charFormat=1  # UTF-8 character set 
soundDevice=sysdefault # cf. aplay -L 
esHome=$(get_abs_dir $0) 
esHome=${esHome%/bin} 

voice=en+m3  # "de+f2" 

export LD_LIBRARY_PATH=$esHome/shared_library 

set_volume 100% on 
# espeak-data has to reside in $esHome 
espeak -a $amplitude -p $pitch -b $charFormat -v $voice "text" --stdout | aplay -D$soundDevice &$ 

Der obige Code, wenn im Terminal laufen sie produziert Ton, aber wenn sie in einem Webserver laufen es nicht. Kann ich irgendeinen Befehl von einer Website ausführen? Ja, ich bin mir der Sicherheitsimplikationen darüber bewusst. Ich bin kein Entwickler und versuche zu lernen, also sind irgendwelche Ideen willkommen.

Gibt es auch eine Möglichkeit, eine Site mit einem Feld zu erstellen, um den Text einzugeben, der dann Raspberry Pi mit espeak sprechen würde?

+0

[Bearbeiten] Ihre Frage und zeigen, wie Sie beginnen 'forward.cgi' und wie' Index.php'? – stovfl

Antwort

0

Ich habe unten in der Datei/etc/sudoers hinzugefügt und es funktioniert. Ja, ich verstehe die Sicherheitsimplikationen, die dahinter stecken, also bitte nicht in einer Produktionsumgebung.

Cmnd_Alias ESPEAK_CMDS = /usr/bin/espeak 
www-data ALL=(ALL) NOPASSWD: ESPEAK_CMDS 

Überprüfen Sie auch/var/log/syslog für mehr Details