logo
Published on

WSL BashとPowershellで簡単なタイマーアプリを作る

Authors

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 )

# 指定された時間待機し、指定されたテキストを音声合成で読み上げ、経過時間も通知する
# & を使用してバックグラウンドで実行
}

このプログラムの主な動作ステップは以下の通りです:

  1. ttstimer 関数が開始します。

  2. 関数が引数として時間間隔(例: "15m")とテキスト(例: "cooking")を受け取ります。

  3. jsonttstimer_d、および ttstimer_w 変数を初期化します。

  4. 第1引数が空であれば関数をエラーとして終了します。

  5. Python スクリプトが実行されて、指定された時間間隔(例: "15m")が正規表現を使用して分解され、結果が JSON 形式で json 変数に格納されます。

  6. json 変数が空であれば関数をエラーとして終了します。

  7. json 変数の内容がパースされ、ttstimer_dttstimer_w 変数に格納されます。これらは、時間間隔を数値と単位に分割した値です。

  8. 指定された時間間隔(例: "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 ファイル:

  1. parsejson 関数:JSONデータ内の特定の値を抽出するための関数です。例えば、parsejson '[0]["title"]' と呼び出すことで、JSONデータ内の指定された場所の値を抽出します。Pythonを使用してJSONデータをパースします。

  2. tts 関数:PowerShellを呼び出して、指定されたテキストを音声合成で読み上げます。

Microsoft.PowerShell_profile.ps1 ファイル:

  1. tts 関数:PowerShell内で音声合成を実行するための関数です。System.Speech.Synthesis.SpeechSynthesizer クラスを使用して、指定されたテキストを音声合成で読み上げます。テキストは SSML (Speech Synthesis Markup Language) 形式で提供され、音声プロパティ(rateなど)を設定できます。