espeakがnetcatでパイプされたstdoutを続けて話すようにする方法

espeakがnetcatでパイプされたstdoutを続けて話すようにする方法

私は、リモートサーバーから入力を受け取るnetcatからパイプされたコンテンツを知らせるために、speakを使用して一種のPAシステムとして使用したいRaspberry pi 3を持っています。パイでは、次のようにリスナーを起動します。

nc -lk 7777 | espeak

リモートコンピュータ(テスト目的でMacbook Pro)から発行されます。

echo "hello world" | nc raspberrypi 7777

最初に送るというのにさらに送ろうとすると、音声も出力されず、端末にテキストも書きません。 netcatはまだ実行中ですが、speakは停止したようです。

端末にstdoutを置き、Macでecho | ncコマンドをスパムに送り、すべてが期待どおりにpiに表示されるようにパイプなしでリスナーを起動しました。

私は解決策を見つけるためにインターネットを検索しようとしましたが、ncリスナーからデータファイルとしてstdoutを継続的に提供する方法がありますが、espeakに関連するものは表示されません.

また、ncをteeやlogaveなどの他のコマンドに接続してみましたが、期待どおりに機能し、ncの出力をファイルに継続的に記録しました。

修正する

私は、上記の設定がLinux Mintをリスナーとして実行する強力なデスクトップと、エコーを送信するクライアントとしてUbuntu Serverを実行するほぼ強力なサーバーボックスでシームレスに動作するように、以下の説明で説明しました。これはNCではなく、Piに責任があると考えさせます。私はこれがPiのオーディオに関連していると疑っていくつかのことを試しました。

  • mplayerを使用してHDMIと3.5mmジャックを介してWi-Fi経由でmp3ラジオ局をストリーミングすると、何が起こっているのかがわかりましたが、深刻な途切れが発生しました。イーサネットで試しましたが、同じ結果が得られました。

  • mplayerを使用してHDMI経由でローカルに保存されているmp3ファイルを再生しても、同じ遅延が発生します。

  • aplayを使用してHDMI経由で同じmp3を再生すると、大きな白いノイズが発生します。

また、インタラクティブモードで espeak を試しましたが、同じ問題が発生しました。入力した最初の行は表示されますが、それ以降のすべての行は無視されます。時々上記のようにncに触れると、私が入力しようとしていた行を一度にすべて吐き出すことがあります。

ベストアンサー1

私はpi jessieで3つの異なるバージョンのnetcatを試しましたが、netcat -lkサポートしていないか、-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

おすすめ記事