そのようなマシンの典型的なタスク:
- メディアセンター
- トレントロッキングチェア
- ファイルストレージ
- リポジトリ
たとえば、通知します。
- 新しい手紙について
- 窓の外の温度について
- 明日の天気について
- あなたの想像力がシェルスクリプトで武装できる多くのこと
仕事に取り掛かりましょう。タスクはどのOSのほぼすべてのプラットフォームでも実装できます。
Intell Atomの「サーバー」で実行されるUbuntu Serverでの実装方法を説明します。
Ubuntuとオーディオシステムで実行できるサウンドカードがあり、私のオーディオシステムは「サーバー」に接続されていることがわかります。 これらの目的のために、「コンピュータースピーカー」でさえ7ドルで何でもできます。
祭りの設定
これについては多くのことが書かれています。 例えば 、Habréとインターネットの両方で、私は指示に従って何をしたかを言うだけで、問題は発生しませんでした。
後で私はそれを自分で構築し、フェスティバルサーバーを実行することにしました。 彼は悪魔の重さを量り、私たちはクライアントの助けを借りてそれに接続し、命令します。 長所-「スマート」システムおよび現在の時間のタイプのフレーズでの応答時間が大幅に短縮され、遅延は1〜2秒に過ぎません。
プロジェクトページからすべてのソースアーカイブをダウンロードします 。
/ usr / local / bin / festival /($ INST_DIRの前)などのフォルダに解凍します。標準のsudo make installで製品をインストールしても機能しません。結果として収集する必要があります。 これで、festival /とspeech_tools /がディレクトリに表示されます。最後の1つはThe Edinburgh Speech Tools音声ライブラリです。そこからアセンブリを開始する必要があります。
$cd speech_tools $ ./configure $make
libcursesの欠如を誓う
$sudo aptitude install libncurses-dev
組み立てを繰り返す
祭りをまとめる
$cd ../festival $ ./configure $make
festivaleなどでは、festivalとfestivale_clientが表示されます。これらは近くにないバイナリへのシンボリックリンクです。
festivaleを開始し(新しいファイルへのパスを使用します。そうしないと、古いファイルが開始されるか、何も開始されません)、英語のテキストを試して開始します。
フェスティバル>(SayText "Hello World")
話したことがあるなら、それほど大きくはありません。Linuxの場合:/ dev / dspを開けない場合は、 https: //wiki.archlinux.org/index.php/Festival#can.27t_open_.2Fdev.2Fdspを ご覧ください ( RussianNeuroMancerに感謝)
ロシア化!
ここからロシア語の声をダウンロードしてください: http : //festlang.berlios.de/docu/doku.php?id=russianru
$ INST_DIR / festival / lib / voices / ru /にmsu_ru_nsh_clunits-0.5.tar.bz2(これを書いている時点では最新バージョンです)を解凍します-ディレクトリ構造を保存する必要があります。
ファイル$ INST_DIR / festival / lib / languages.scmの先頭に次のように記述します。
(define (language_russian) "(language_russian) Set up language parameters for Russian." (set! male1 voice_msu_ru_nsh_clunits) (male1) (Parameter.set 'Language 'russian) )
次の行で始まるブロックを探しています:
(define (select_language language)
他の言語との類推により、追加
((equal? language 'russian) (language_russian))
ロシア語を確認します。
echo "" | festival --tts --language russian
すばらしい場合は、サーバーを起動してみてください。
$INST_DIR/festival/bin/festival --server --language russian
バックグラウンドで実行するのではなく、デバッグのために端末にハングさせます。
別のターミナルでクライアントを起動します(alsaとaplayを持っているバリアントは正常に動作します)
echo "" | $INST_DIR/festival/bin/festival_client -ttw | aplay
-ttwスイッチはテキストをウェーブに変換することを意味します。-ttsスイッチを使用するとテキストから音声に変換できます
echo "" | $INST_DIR/festival/bin/festival_client -tts
話す -スーパー! そうでない場合は、サーバーが実行されている端末を見てください。拒否クライアントが許可された接続のリストにないことを示すメッセージが表示され、ファイル$ INST_DIR / festival / lib / festival.scmを編集します。
パラメータを見つける
(defvar server_access_list '("192.168.2.1" "127.0.0.1" localhost)
そして、接続元のホストのIPアドレスを追加します(127.0.0.1を介して接続しようとしましたが、サーバーはクライアントを192.168.2.1として呪い、定義しましたが、IPはすべてOKでした)。 これらはリモートホストから制御できることは明らかです。ところで、ポート1314は接続に使用されます。この構成で変更することも、-portキーでクライアントとサーバーを起動するときに変更することもできます。当然、クライアントとサーバーのポートは同じでなければなりません
システム起動時のOrthodoxの起動のために、init-scriptを投げました。
#!/bin/sh ### BEGIN INIT INFO # Provides: helius # Required-Start: $local_fs # Required-Stop: $local_fs # Should-Start: $network # Should-Stop: $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Festival server # Description: Start Festival daemon as server ### END INIT INFO . /lib/lsb/init-functions PATH=/sbin:/bin:/usr/sbin:/usr/bin NAME=festival DESC="Festivale Speech system" DAEMON=/home/eugene/src/festival_src/festival/bin/festival START_MPD= # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 fest_start () { log_daemon_msg "Starting $DESC" "$NAME" start-stop-daemon --start --quiet --oknodo \ --exec "$DAEMON" -- --server --language russian & log_end_msg $? } fest_stop () { log_daemon_msg "Stopping $DESC" "$NAME" start-stop-daemon --stop --quiet --oknodo --retry 5 \ --exec $DAEMON log_end_msg $? } case "$1" in start) fest_start ;; stop) fest_stop ;; restart|force-reload) fest_stop fest_start ;; force-start|start-create-db) FORCE_CREATE_DB=1 fest_start ;; force-restart) FORCE_CREATE_DB=1 fest_stop fest_start ;; *) echo "Usage: $0 {start|start-create-db|stop|restart}" exit 2 ;; esac
ルートから/etc/init.d/にコピーし、do
$sudo update-rc.d festivald defaults
始める
$sudo /etc/init.d/festivald start
クライアントが正常に接続することを確認します-フレーズが発音され、スクリプトで実行するようにクライアントを調整します、お楽しみください! :D
彼が何かを言うには、次のように彼を呼ぶだけで十分です。
エコーこんにちは| 祭り--tts-言語ロシア語
これをスクリプトにフォーマットし、文字列を標準入力に渡す方が便利です。
しかし、音楽を再生するとどうなりますか? 音楽を聴いているときにサウンドカードシンセサイザーの音量が変わるとどうなりますか? 夕方に音量を下げるのを忘れた場合、朝に悲鳴から飛び降りたくないですか? :D
私の音はAlsaで再生されます。マナを読んだ後、希望の音量を設定してalsaミキサーを制御する方法を見つけました。 私が使用するプレーヤーは、MOC(Music On Consol)を使用して一時停止し、簡単なコマンドの再生を開始できます(別のオーディオプレーヤーを使用している場合は、制御方法を見つけ、一時停止-削除するか、単にこれらの行を削除します)。
このように:
1)プレーヤーを一時停止する
2)所定の「快適な」音量レベルを設定する
3)フレーズを発音する
4)音量レベルを返す
5)一時停止からプレーヤーを削除する
ここに私が得たものがあります:sayitスクリプト
#!/bin/bash <br/>
# <br/>
read str <& 0 <br/>
# <br/>
/ usr / bin / mocp -P <br/>
# <br/>
amixer -c 0 -- sset Master playback 40 <br/>
# <br/>
echo " $str " | festival --tts --language russian<br/>
# <br/>
amixer -c 0 -- sset Master playback 100 <br/>
# <br/>
/ usr / bin / mocp -U <br/>
#!/bin/bash <br/>
# <br/>
read str <& 0 <br/>
# <br/>
/ usr / bin / mocp -P <br/>
# <br/>
amixer -c 0 -- sset Master playback 40 <br/>
# <br/>
echo " $str " | festival --tts --language russian<br/>
# <br/>
amixer -c 0 -- sset Master playback 100 <br/>
# <br/>
/ usr / bin / mocp -U <br/>
メールをチェック
私はGmailを使用していますが、新しい文字のリストを取得する方法はすでにHabréで伝えられていますが 、すべてがそれで簡単です、アルゴリズムはこれです:
1)新しい文字の数を取得する
2)ファイル内で以前に書かれた番号と番号を比較します(「新しい」未読番号がない場合にチャットしないように、ただし別の未読番号が現れた後のみ)
3)それが記録されている以上の場合、「新しい手紙を持っています」というフレーズを言います
4)記録された数値がゼロより大きい場合(未読の数値がまだある場合)、標準出力「未読の数値」に出力します
スクリプト:
#! /bin/bash <br/>
# - <br/>
Nmb = ` curl -u LOGIN:PASSWORD --silent "mail.google.com/mail/feed/atom" | grep -c "<entry>" ` <br/>
# - <br/>
OldNmb = ` cat / home / eugene / mail_count ` <br/>
# - <br/>
if ( ( $Nmb > $OldNmb ) ) <br/>
then <br/>
# , - <br/>
# "" <br/>
if ( ( $Nmb > 1 ) ) <br/>
then <br/>
echo " . " $Nmb | / home / eugene / .bin / sayit<br/>
else <br/>
echo " ." | / home / eugene / .bin / sayit<br/>
fi <br/>
fi <br/>
# - <br/>
echo " $Nmb " >/ home / eugene / mail_count<br/>
<br/>
#! /bin/bash <br/>
# - <br/>
Nmb = ` curl -u LOGIN:PASSWORD --silent "mail.google.com/mail/feed/atom" | grep -c "<entry>" ` <br/>
# - <br/>
OldNmb = ` cat / home / eugene / mail_count ` <br/>
# - <br/>
if ( ( $Nmb > $OldNmb ) ) <br/>
then <br/>
# , - <br/>
# "" <br/>
if ( ( $Nmb > 1 ) ) <br/>
then <br/>
echo " . " $Nmb | / home / eugene / .bin / sayit<br/>
else <br/>
echo " ." | / home / eugene / .bin / sayit<br/>
fi <br/>
fi <br/>
# - <br/>
echo " $Nmb " >/ home / eugene / mail_count<br/>
<br/>
あなたのログイン/パスワードを置き換えることを忘れないでください! =)
Cronに追加します。
「窓の外」の温度
ここでも、すべてが非常に簡単です。現在の気温を解析して引き出しやすい「天気」のサイトを見つける必要があります。ノボシビルスク(私がいる場所)には、「ハンギング」温度を持つメインサイトにget.cur_tmprスクリプトがあるwww.ngs.ruがあります:
1)wgetでページをプルアップする
2)正規表現を通過し、
3)温度を「16」または「-9」などの「純粋な」形式で返します。
> #!/bin/bash <br/>
# c http://ngs.ru <br/>
wget -P / home / eugene / .tmp http: // ngs.ru -q <br/>
# UTF-8 - <br/>
stringZ = ` cat / home / eugene / .tmp / index.html | iconv -f CP1251 -t UTF- 8 ` <br/>
# <br/>
tmp_str = ` expr " $stringZ " : '.*</a></h2>: \(.........\).*$' ` <br/>
# <br/>
digit = ` expr " $tmp_str " : '^.*\([0-9]\{1,2\}\)' ` <br/>
# <br/>
sign = ` expr " $tmp_str " : '^\(.......\)' ` <br/>
# - "-" <br/>
if [ [ $sign = "−" ] ] <br/>
then <br/>
tmpr = "-" <br/>
fi <br/>
tmpr = $tmpr $digit <br/>
# <br/>
echo $tmpr <br/>
# <br/>
rm / home / eugene / .tmp / index.html
次のコマンドをcronに追加して、このスケジュールスクリプトを実行します。
get_cur_tmpr | 言う
たとえば、私では朝のコーヒーを飲みながら起動するので、仕事の途中で服を着る方法を知っています。
明日の予報
このスクリプトは、就寝前の夜にCronによって起動されるため、明日仕事に行く際にどの交通手段を選択するか、また、どの交通手段を利用するかを知っています。D:D:D
前のものと大きな違いはありません。Yandexを情報源として使用しているだけです(誰かの権利を侵害しないことを願っています=)。 Yandexは賢く、ページの要求元を知っており、お住まいの地域の天気予報を提供するので、スクリプトはどこでも同じように、つまりどこでも異なって機能します)
get_fut_tmprスクリプト:
#!/bin/bash <br/>
# <br/>
wget -P / home / eugene / .tmp http: // m.weather.yandex.ru / -q <br/>
# <br/>
stringZ = ` cat / home / eugene / .tmp / index.html<br/>
# <br/>
tmpr = " `expr "$stringZ" : '.*.*....\(..............\)'` " <br/>
# , <br/>
if [ -n " $tmpr " ] # <br/>
then <br/>
# ( : -9 -11) <br/>
tmprhi = ` echo $tmpr | egrep -o '^.?[0-9][0-9]?' ` <br/>
tmprlo = ` echo $tmpr | egrep -o '.?[0-9][0-9]?$' ` <br/>
# <br/>
if ( ( $tmprhi < 0 ) ) # <br/>
then <br/>
shi = "" <br/>
# <br/>
tmprhi = ` echo $tmprhi | egrep -o '[0-9][0-9]?' ` <br/>
else <br/>
shi = " " <br/>
fi <br/>
if ( ( $tmprlo < 0 ) ) # <br/>
then <br/>
slo = "" <br/>
# <br/>
tmprlo = ` echo $tmprlo | egrep -o '[0-9][0-9]?' ` <br/>
else <br/>
slo = " " <br/>
fi <br/>
else <br/>
echo " ." <br/>
exit 0 <br/>
fi <br/>
<br/>
echo " $shi $tmprhi $slo $tmprlo " <br/>
# <br/>
rm / home / eugene / .tmp / index.html
#!/bin/bash <br/>
# <br/>
wget -P / home / eugene / .tmp http: // m.weather.yandex.ru / -q <br/>
# <br/>
stringZ = ` cat / home / eugene / .tmp / index.html<br/>
# <br/>
tmpr = " `expr "$stringZ" : '.*.*....\(..............\)'` " <br/>
# , <br/>
if [ -n " $tmpr " ] # <br/>
then <br/>
# ( : -9 -11) <br/>
tmprhi = ` echo $tmpr | egrep -o '^.?[0-9][0-9]?' ` <br/>
tmprlo = ` echo $tmpr | egrep -o '.?[0-9][0-9]?$' ` <br/>
# <br/>
if ( ( $tmprhi < 0 ) ) # <br/>
then <br/>
shi = "" <br/>
# <br/>
tmprhi = ` echo $tmprhi | egrep -o '[0-9][0-9]?' ` <br/>
else <br/>
shi = " " <br/>
fi <br/>
if ( ( $tmprlo < 0 ) ) # <br/>
then <br/>
slo = "" <br/>
# <br/>
tmprlo = ` echo $tmprlo | egrep -o '[0-9][0-9]?' ` <br/>
else <br/>
slo = " " <br/>
fi <br/>
else <br/>
echo " ." <br/>
exit 0 <br/>
fi <br/>
<br/>
echo " $shi $tmprhi $slo $tmprlo " <br/>
# <br/>
rm / home / eugene / .tmp / index.html
Yandexはユーフォニー専用に書かれており、シンセサイザーはいくつかの単語を曲がりくねって言っています。
あなたは他に何を考えることができます、はいたくさん! ハブのカルマ、急流の評価、バックアップ結果(特にネガティブ)、インターネットからの攻撃の観測、夜のホームサイトへの訪問数を要約して報告します。サイトの制御については説明しません(Webプログラマー向け)。 画像、夜、3時間、「xxxサイトでは利用できないコンテンツがあります!」
シンセサイザーにはいくつかの不快な瞬間があります。
1)フレーズを発音する前に長い間考えていました(辞書で検索、合成)これを打ち負かす方法を見つけられなかった、誰もが文句を言う、明らかに実装機能。
2)辞書には個々の単語の発音に関して多くの要望が残されています。一部の単語は同義語に置き換える必要があります。 彼らは率直にひどく聞こえます:D
一般に、「単語を選ぶ」と発音は悪くありません! ポーズの良い男性の声。
音声の合成と「毎日」の目的でのその使用はますます使用されるようになっており、私たちは未来に半歩近づきます!
さて、私があなたに言わなければならないことはこれだけです。誰かがこの問題に興味を起こしたことを願っています!
ご清聴ありがとうございました。