如何让 espeak 持续说出从 netcat 管道传输的标准输出

如何让 espeak 持续说出从 netcat 管道传输的标准输出

我有一个 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 卡上。电源不足也会导致音频断断续续,我通过将音量调低到听起来不错的程度来解决这个问题,并使用放大扬声器使其声音更大。效果非常好!

相关内容