- Published on
WSL BashとPowershellで簡単なタイマーアプリを作る
- Authors
- Name
- Shou Arisaka / 有坂翔
WSL BashとPowershellで簡単なタイマーアプリを作る方法について紹介します。
声で知らせてくれるタイマーです。タイマーが過ぎたら経過時間を表示したりします。
e.g. ttstimer "15m" "cooking"
で15分経過したらcooking timer fired. 15 m passed.
と声で知らせてくれます。
このプログラムは、指定された時間間隔でタイマーを設定し、タイマーが終了すると指定されたテキストを音声合成で読み上げます。また、経過した時間も通知します。以下に各行のコメントを追加し、その後にプログラムの動作をステップバイステップで説明します。
ttstimer(){
# タイマーを設定するための関数の開始
: e.g. ttstimer "15m" "cooking"
# 関数の呼び出し例: ttstimer "15m" "cooking" という引数でこの関数を呼び出す
json=
ttstimer_d=
ttstimer_w=
# json 変数、ttstimer_d 変数、ttstimer_w 変数を初期化
[ -z "${1}" ] && return 1
# 第1引数が空であればエラーとして関数を終了
json="$(python3 - $@ <<EOF
# -*- coding: utf-8 -*-
import sys
args = sys.argv
import re
import json
text = """${1}"""
result = re.match(r'(\d+)([a-z]{1})', text, re.M)
print (json.dumps(list(result.groups())))
EOF
)"
# Python スクリプトを実行して json 変数に結果を格納
[ -z "${json}" ] && return 1
# json 変数が空であればエラーとして関数を終了
ttstimer_d="$( echo $json | parsejson '[0]' )"
ttstimer_w="$( echo $json | parsejson '[1]' )"
# json の内容をパースして ttstimer_d と ttstimer_w に格納
# sleep ${1} && tts "${2} timer fired. ${ttstimer_d} ${ttstimer_w} passed." && termdown
sleep ${1} && ( tts "${2} timer fired. ${ttstimer_d} ${ttstimer_w} passed." & termdown )
# 指定された時間待機し、指定されたテキストを音声合成で読み上げ、経過時間も通知する
# & を使用してバックグラウンドで実行
}
このプログラムの主な動作ステップは以下の通りです:
ttstimer
関数が開始します。関数が引数として時間間隔(例: "15m")とテキスト(例: "cooking")を受け取ります。
json
、ttstimer_d
、およびttstimer_w
変数を初期化します。第1引数が空であれば関数をエラーとして終了します。
Python スクリプトが実行されて、指定された時間間隔(例: "15m")が正規表現を使用して分解され、結果が JSON 形式で
json
変数に格納されます。json
変数が空であれば関数をエラーとして終了します。json
変数の内容がパースされ、ttstimer_d
とttstimer_w
変数に格納されます。これらは、時間間隔を数値と単位に分割した値です。指定された時間間隔(例: "15m")だけスリープし、その後に指定されたテキスト(例: "cooking")を音声合成で読み上げます。また、経過時間も通知します。この処理はバックグラウンドで実行されます。
最初3行だったんだけど気づいたら肥大していた。
その他のコード
以下のスクリプトの目的は、.bashrc
内の parsejson
関数を使用してJSONデータを解析し、解析されたデータを tts
関数を使用して音声合成で読み上げることです。また、PowerShellスクリプト内の tts
関数も同様の目的で使用されますが、PowerShell内で音声合成を行います。
// .bashrc
parsejson(){
: e.g. parsejson '[0]["title"]'
python3 -c "import json,sys;print(json.load(sys.stdin)${1})"
}
tts(){
powershell.exe - <<EOF
tts "${1}"
EOF
}
// Microsoft.PowerShell_profile.ps1
function tts(){
Add-Type -AssemblyName System.speech
$tts = New-Object System.Speech.Synthesis.SpeechSynthesizer
$Phrase = @"
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xml:lang="en-US">
<voice xml:lang="en-US">
<prosody rate="1">
<p>$($args[0])</p>
</prosody>
</voice>
</speak>
"@
$tts.SpeakSsml($Phrase)
}
.bashrc
ファイル:
parsejson
関数:JSONデータ内の特定の値を抽出するための関数です。例えば、parsejson '[0]["title"]'
と呼び出すことで、JSONデータ内の指定された場所の値を抽出します。Pythonを使用してJSONデータをパースします。tts
関数:PowerShellを呼び出して、指定されたテキストを音声合成で読み上げます。
Microsoft.PowerShell_profile.ps1
ファイル:
tts
関数:PowerShell内で音声合成を実行するための関数です。System.Speech.Synthesis.SpeechSynthesizer
クラスを使用して、指定されたテキストを音声合成で読み上げます。テキストは SSML (Speech Synthesis Markup Language) 形式で提供され、音声プロパティ(rateなど)を設定できます。