web-dev-qa-db-ja.com

netcatからパイプされたstdoutを継続的に話すためにespeakを取得する方法

一種のPAシステムとして使用したいRaspberryPi 3があります。これは、リモートサーバーから入力を取得しているnetcatからパイプされたものをespeakを使用してアナウンスします。円周率では、次のようにリスナーを開始します。

nc -lk 7777 | espeak

リモートリモートマシン(テスト用のMacbook pro)で発行します

echo "hello world" | nc raspberrypi 7777

私が最初に送信するものを話しますが、もっと多くのものを送信しようとすると、音声が出力されず、端末にもテキストが書き込まれません。 netcatがまだ実行されているにもかかわらず、espeakが停止したかのようです。

パイプなしでリスナーを開始しようとしました。これにより、端末にstdoutが配置され、エコーをスパムすることができます。 Macからのncコマンドを実行すると、すべてがpiに期待どおりに表示されます。

ソリューションをグーグルで検索してみましたが、ncリスナーからデータファイルにstdoutを継続的にフィードすることについては何かがありますが、特にespeakに関連するものは何も表示されません。

また、ncをteeやlogsaveなどの他のコマンドにパイプしてみましたが、期待どおりに動作し、ncの出力をファイルに継続的に書き込みます。

[〜#〜] update [〜#〜]

以下のコメントで、Linux Mintをリスナーとして実行している頑丈なデスクトップと、エコーを送信するクライアントとしてUbuntuサーバーを実行しているほぼ同じくらいのサーバーボックスで、上記のセットアップをスムーズに機能させることができたと述べました。これは私に、ncではなくPiについての何かが原因であると思いました。私の疑いは、それがPiのオーディオと関係があるということです、それで私はいくつかのことを試みました:

  • Mplayerを使用してHDMIと3.5mmジャックの両方を介してwifi経由でmp3ラジオ局をストリーミングすると、何が起こっているのかはある程度理解できましたが、大規模な吃音が発生しました。イーサネット経由で試してみると、同じ結果が得られました。

  • Mplayerを使用してローカルに保存されたmp3ファイルをHDMI経由で再生しても、同じ途切れが発生しました。

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

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

4
user2368261

3つの異なるバージョンのnetcatを使用してpijessieで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
meuh

Raspbianを再インストールすると、問題が解決したようです。以前のプロジェクトでAlsaに干渉するものをインストールしたと思います。

Espeakは、通常のインタラクティブモードとnetcatからのパイプの両方で応答するようになりました。ただし、5〜10秒程度の音声で途切れ始めますが、ショートメッセージしか読まないので問題ないと思います。この問題は、他のいくつかのフォーラムでも言及されています。 ここにリンクがあります このトピックに関するraspberypi.orgフォーラムの投稿への投稿であり、piのオーディオが不安定であることに私は正しかったようです。基本的に、私にとって有効なリンクで言及されている解決策は、espeakに音声カードではなくstdoutに音声を出力させ、それをパイプで再生することです。

espeak --stdout <text> | aplay -q

これは、netcatを介してコンテンツをパイプする場合にも完全に機能します。

0
user2368261

ncが必要ないと仮定すると、ncat-c機能を使用できます。ただし、取得する必要がある場合があります。raspbianを使用しているため、これを使用して取得します。

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

nmapを含む不要なファイルがたくさんあるので、これでncatが得られるはずです。

必要なサーバーをセットアップするには、次のコマンドを実行します。

ncat -l 7777 -k -c "espeak"

接続するには(任意のncバリエーションを使用できることに注意してください):

ncat [your Host ip] 7777

ncat-cが行うことは、クライアントが接続したときにコマンドを実行し、コマンドのstdoutをクライアントに送信し、クライアントからstdinを受信します。これにより、espeakコマンドをリモートで実行できます。

もう1つの簡単な方法は、sshを使用することです。これは、私があなたの状況で行ったことです。 raspi-configを使用してpiでsshサーバーを有効にするか、難しい方法で有効にすることができるはずです。

また、私がpiで抱えていたオーディオの問題にも気づきました。それはすべてアルサが愚かであることに帰着します、そして私が私のSDカードにラズビアンを再燃させるまでそれを修正することができなかったことを覚えていると思います。電源が不十分な場合もオーディオが途切れる可能性がありますが、音量を下げて音が悪くならないようにし、増幅スピーカーを使用して音量を大きくしました。チャームのように働いた!

0
SpecialBomb