シェルスクリプト Forced Todo
有用なユーティリティコード
- TOP
- Old Archives
- シェルスクリプト Forced Todo
Forced Todoはなかなか進まない進捗に対して、一定の時間でTODOを読み上げ、進捗を迫るものである。 あまりに進捗しないので作ってみた。
Systray
Notifyを開始するとSystrayに常駐し、Systrayから終了できるようにした。
Systrayへの常駐はMailDeliver2同様、yad
を使うようにした。
notifypid=$!
yad --notification --image=player-time --text="TODO NOW!" --command="yad --text-info --timeout=15 --title=TODO --width 300 --height 300 --filename=$HOME/.yek/forcedtodo/todotext" --menu='Edit!'"$task_editor $HOME/.yek/forcedtodo/todotext"'|Quit!quit' --tooptip="Immidiately Task"
kill $!
Yadのオプションについて分析してみよう。
オプション | 意味 |
---|---|
--notification |
Systrayに常駐する |
--image=player-time |
Systrayのアイコンを選択 |
--text="TODO NOW!" |
Notificationの名前(ポップアップに影響) |
--command |
左クリック時の実行コマンド |
--menu |
右クリックメニュー。項目名とコマンドを! で分けている。quit で終了 |
ネストされているYadは次の通り
オプション | 意味 |
---|---|
--text-info |
テキストダイアログ |
--timeout=15 |
15秒でダイアログが閉じる |
--title=TODO |
ウィンドウタイトル |
--width 300 |
ウィンドウの幅 |
--height 300 |
ウィンドウの高さ |
--filename=... |
テキストの内容となるファイル |
Zenityとは結構な違いがあることに注意。
Yadは通常ブロックするため、Yadが終了しなければ戻らない。
そのため、Notifyするためのプログラムをサブシェルでバックグラウンドプロセスとして実行し、そのプロセスID($!
)を取得し、Yadが戻ったらKillすれば良い、ということになる。
Notify (Open JTalk)
Notifyは単一のプロセスIDを振るためにサブシェルで実行し、バックグラウンドプロセスとすることでループさせる。
(
while sleep $notify_interval
do
perl -pe 's/\n/。/g' ~/.yek/forcedtodo/todotext | open_jtalk "$jtalk_tuning[@]" -m $hts_voicefile -x $mecab_dictdir -ow $jtalk_tmpfile
play $jtalk_tmpfile >| /dev/null &|
notify-send -t $notify_time "TODO" "$(<$HOME/.yek/forcedtodo/todotext)"
done
) &
単純なsleep
によるループである。
基本的な手順としては
- Open JTalkで音声ファイルを作成
- 合成した音声ファイルをバックグラウンドプロセスとして再生
- Notify Sendを使って通知に表示
となる。
ここで大きな情報はOpen JTalkだろう。
Open JTalkはスピーチシンセサイザーだが、eSpeak, SVOX Pico, Festivalといったソフトウェアと比べて非常に自然で、日本語に対応している。 ただし、かなり複雑なソフトウェアだ。
Manjaro(Arch)では、AURにあるopen-jtalk
パッケージをインストールする。
NAIST
JdicファイルはAURにも存在していないが、辞書ディレクトリとして/usr/share/open-jtalk/dic/
を使用することができる。精度は異なるかもしれない。
NAIST
JDicをインストールするためには、mecab
をインストールし、さらにNaist
JDicで/usr/libexec
が指定されている部分を/usr/lib
に変更しなくてはいけない。
女声を使用するためにはopen-jtalk-voice-mei
をインストールする。
Open
JTalkは非常に自然で、Twitterの読み上げにも使えそうだが(tw
との組み合わせがいいだろう)、複数行を扱うことができないため、Perlで変換している。
また、Open JTalkは標準出力に吐くことはできないようだ。