2017-09-02 3 views
0

J'ai besoin d'aide. J'ai construit un robot en utilisant Raspberry pi, puis l'a élargi avec une caméra et un haut-parleur. J'ai installé un serveur Lighthttpd et je peux le contrôler en utilisant un simple site web.Comment exécuter la commande espeak lorsque je clique sur un lien dans un site Web sur un Raspberry pi

Cela fonctionne très bien, le serveur web présente ce site: https://github.com/Mjrovai/MJRoBot-Web-RPi-Robot/blob/master/index.html et quand un bouton est cliqué un script cgi démarrer un moteur. Par exemple forward.cgi scénario (sous la direction https://github.com/Mjrovai/MJRoBot-Web-RPi-Robot/blob/master/cgi-bin/forward.cgi) contient:

#!/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 

Lorsque ci-dessus script s'exécute, il définit chaque GPIO et moteurs démarre. Ce que j'essaye de faire maintenant est d'ajouter une fonction quand j'appuie sur un bouton un autre script de cgi sera employé pour produire un certain discours. Le problème que je suis est même si j'ajoute une commande ci-dessous au fichier ci-dessus, il fonctionne les moteurs, mais il ne parle pas.

espeak test 

J'ai essayé avec PHP. J'ai utilisé ci-dessous le fichier index.php pour déclencher speak.sh lorsque le lien est cliqué, mais cela ne fonctionne pas.

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 (copié à partir stackoverflow.com)

#!/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 &$ 

Le code ci-dessus, il produit lorsqu'il est exécuté dans le terminal solide, mais lorsqu'il est exécuté dans un serveur web, il ne le fait pas. Est-ce que je peux exécuter n'importe quelle commande à partir d'un site Web? Oui, je suis conscient des implications de sécurité à ce sujet. Je ne suis pas un développeur et j'essaie d'apprendre pour que les idées soient les bienvenues.

Existe-t-il un moyen de créer un site avec un champ pour taper le texte que parlait alors fraspberry pi en utilisant espeak?

+0

[Modifier] votre question et montrer comment vous commencez '' forward.cgi' et comment index.php'? – stovfl

Répondre

0

J'ai ajouté ci-dessous au fichier/etc/sudoers et cela fonctionne. Oui, je comprends les implications de sécurité derrière ceci donc s'il vous plaît ne le faites pas dans un environnement de production.

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

Vérifiez aussi/var/log/syslog pour plus de détails