php - 当我在 Raspberry pi 上单击网站中的链接时如何运行 espeak 命令

标签 php python linux raspberry-pi cgi

我需要帮助。我使用 Raspberry pi 构建了一个机器人,然后用相机和扬声器对其进行了扩展。 我安装了一个 lighthttpd 服务器,我可以使用一个简单的网站来控制它。

工作正常,网络服务器显示此站点:https://github.com/Mjrovai/MJRoBot-Web-RPi-Robot/blob/master/index.html单击按钮时,cgi 脚本会启动电机。例如 forward.cgi(已编辑 https://github.com/Mjrovai/MJRoBot-Web-RPi-Robot/blob/master/cgi-bin/forward.cgi)脚本包含:

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

当上面的脚本运行时,它会设置每个 GPIO 并启动电机。

我现在想做的是在我按下按钮时添加一个功能,另一个 cgi 脚本将用于生成一些语音。我遇到的问题是,即使我在上面的文件中添加以下命令,它也会运行电机,但它不会说话。

espeak test

我尝试使用 PHP。我使用下面的 index.php 文件在单击链接时触发 speak.sh 但它不起作用。

索引.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(从 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 &$

上面的代码,在终端中运行时会产生声音,但在网络服务器中运行时不会。有什么办法可以从网站运行任何命令吗?是的,我知道这方面的安全隐患。我不是开发人员并且正在努力学习,所以欢迎任何想法。

还有没有办法创建一个带有字段的站点来键入文本,然后树莓派会使用 espeak 说话?

最佳答案

我在/etc/sudoers 文件中添加了以下内容,它起作用了。是的,我了解这背后的安全隐患,所以请不要在生产环境中这样做。

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

还要检查/var/log/syslog 以获得更多详细信息

关于php - 当我在 Raspberry pi 上单击网站中的链接时如何运行 espeak 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46016576/

相关文章:

python - 使用 raw_input() 时,在 bash 中使用 > 保存 Python 脚本的输出

linux - 发送 telnet smtp 数据命令并以句点结尾不起作用

linux - 如何在复杂的文本文件中使用 Awk 段落?

php - 将日期增加一个月

python - 无法在 Windows 7 Ultimate 32 位上安装 setuptools

python - 检索包含 NaN 值的行的索引

c - 捕获进程进入/退出的任何可能的解决方案?

php - 如何在 WordPress 中使用 ajax 加载 facebook 评论

php - 使用 PHP 上传多张图片只保存一个文件路径到 MySQL 数据库

php - ÆØÅ 字母随机被 æÃ〜Ã¥ 取代