我有一个 Raspberry pi 3,我想将其用作一种 PA 系统,使用 espeak 来宣布从 netcat 管道传输的内容,netcat 从远程服务器获取输入。在 pi 上,我像这样启动监听器:
nc -lk 7777 | espeak
在远程机器(用于测试目的的Macbook pro)上我发出
echo "hello world" | nc raspberrypi 7777
它会说出我发送的第一件事,但如果我尝试发送更多内容,它不会输出语音,并且也不会向终端写入任何文本。就好像 espeak 已经停止一样,尽管 netcat 仍在运行。
我尝试在没有管道的情况下启动侦听器,以便它只是将 stdout 放在终端上,并且我可以发送垃圾邮件 echo |来自 Mac 的 nc 命令,并让所有内容按预期显示在 pi 上。
我尝试过谷歌搜索解决方案,并且有一些关于连续将标准输出从 nc 监听器馈送到数据文件的内容,但我看不到与 espeak 相关的任何内容。
我还尝试将 nc 通过管道传输到 tee 和 logsave 等其他命令,它们的行为符合我的预期,不断将 nc 的输出写入文件。
更新
我在下面的评论中指出,我能够让上面提到的设置顺利地与运行 Linux Mint 作为监听器的强大桌面和运行 Ubuntu 服务器作为发送回声的客户端的几乎强大的服务器盒子一起工作。这让我觉得应该归咎于 Pi,而不是 nc。我怀疑这与 Pi 的音频有关,所以我尝试了一些方法:
使用 mplayer 通过 HDMI 和 3.5 毫米插孔通过 wifi 传输 mp3 广播电台会导致严重的卡顿,尽管我可以弄清楚发生了什么。通过以太网尝试得到了相同的结果。
使用 mplayer 通过 HDMI 播放本地存储的 mp3 文件也会导致同样的卡顿。
使用 aplay 通过 HDMI 播放相同的 mp3 会产生很大的白噪声。
我也在交互模式下尝试了espeak,也出现了同样的问题。它显示我输入的第一行,但忽略所有后续行。有时,当像上面那样搞乱 nc 时,它会快速吐出我尝试一次输入的所有行。
答案1
我netcat -lk
在我的 pi jessie 上尝试了 3 个不同版本的 netcat,但它们要么不支持-k
,要么服务器在第一次连接后陷入繁忙循环:
$ strace nc -l -k -p 7777 </dev/null | espeak --stdout >/dev/null
poll([{fd=0, events=POLLIN}, {fd=-1}], 2, -1) = 1 ([{fd=0, revents=POLLNVAL}])
我建议你使用socat
对我有用的。这是等效的行:
socat -u TCP4-LISTEN:7777,reuseaddr,fork - | espeak
答案2
重新安装 Raspbian 似乎已经解决了这个问题。我想我在早期项目中安装了一些干扰 Alsa 的东西。
Espeak 现在在常规交互模式和从 netcat 传输内容时都能做出响应。然而,它会在大约 5 或 10 秒的音频后开始分解,但我认为这对我来说不是问题,因为它只会读出短消息。这个问题在其他一些论坛上也提到过。这是一个链接到 raspberypi.org 论坛上关于这个主题的帖子,看来我对 pi 音频不稳定的看法是正确的。基本上,对我有用的链接中提到的解决方案是强制 espeak 将语音输出到标准输出而不是声卡,然后通过管道将其输出到 aplay。
espeak --stdout <text> | aplay -q
当通过 netcat 管道传输内容时,这也非常有效。
答案3
假设您不需要nc
,您可以使用-c
的功能ncat
。不过,您可能必须获取它,并且由于您使用的是 raspbian,因此请使用以下命令来获取它:
apt-get install nmap --no-install-recommends
有很多不需要的文件nmap
,所以这应该会让你 ncat。
要设置所需的服务器,请运行以下命令:
ncat -l 7777 -k -c "espeak"
连接(请注意,您可以使用任何nc
变体):
ncat [your host ip] 7777
它-c
的作用ncat
是在客户端连接时运行命令,并将命令发送stdout
到客户端,并stdin
从客户端接收命令。这允许您远程执行espeak
命令。
另一件更容易做的事情就是使用ssh
,这就是我在你的情况下所做的。您应该能够使用 启用 pi 上的 ssh 服务器raspi-config
,或者以困难的方式完成。
您还注意到音频问题,我的 pi 也遇到了这个问题。这一切都归结于 alsa 的愚蠢,我想我记得无法修复它,直到我将 raspbian 重新烧录到我的 SD 卡上。电源不足也会导致音频断断续续,我通过将音量调低到听起来不错的程度来解决这个问题,并使用放大扬声器使其声音更大。效果非常好!