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

答え2

Raspbianを再インストールすると問題が解決したようです。私は初期のプロジェクトにアルサを妨害する何かをインストールしたと思います。

これで、Espeakは通常の対話型モードとnetcatからコンテンツをストリーミングするときに応答します。しかし、オーディオが5〜10秒ほど経過すると故障が始まりますが、短いメッセージだけを読んでくれるので、私にとっては問題にならないと思います。この問題は他のフォーラムで言及されています。これはリンクですこのトピックのraspberypi.orgフォーラムスレッドに移動すると、Pyオーディオが不安定であることが正しいようです。基本的に私に効果があったリンクに記載されている解決策は、speakが音声をサウンドカードの代わりにstdoutに出力するように強制し、それを再生にパイプすることでした。

espeak --stdout <text> | aplay -q

これは、netcatを介してコンテンツをパイピングするときにも非常にうまく機能します。

答え3

必要ではないと仮定すると、その機能をnc使用できます。それでもインポートする必要があります。 Raspbianを使用しているので、次のコマンドを使用してインポートします。-cncat

apt-get install nmap --no-install-recommends

不要なファイルがたくさんあるので、nmapこれはncatを引き起こします。

必要なサーバーを設定するには、次のコマンドを実行します。

ncat -l 7777 -k -c "espeak"

接続(どんなバリエーションでも利用可能nc):

ncat [your host ip] 7777

クライアントが接続するときにコマンドを実行してクライアントにコマンドを送信し、クライアントからコマンドを受け取る役割を-cします。これにより、リモートでコマンドを実行できます。ncatstdoutstdinespeak

より簡単な別の方法はを使用することですがssh、私があなたのケースでやった方法です。 piで有効になっているSSHサーバーを使用することraspi-configも、困難な方法で実行できる必要があります。

また、オーディオの問題を発見しました。私のパイにもこの問題がありました。それはすべて愚かさに帰結します。 SDカードにRaspbianを再フラッシュするまで問題を解決できなかったことを覚えておいてください。電力が不足すると、音声が不均一になる可能性があります。私は音量を聞くのに良いレベルに下げ、増幅スピーカーを使って音を大きくすることでこの問題を解決しました。効果はとても良いです!

関連情報