Macにはsayコマンドがあります。コマンドライン上でttsを実現してくれるコマンドです。そんなに用途はありませんが、せっかくなので「意地で」Windowsでもやってみましょう。制約としては「追加インストールなし」「コンパイルなし」という範囲でやります。この制約は単なる意地でありお遊びですが「依存モジュールが最小限である」というのはエンジニアリングの美学でもあります。
.NETのAPIをPowerShellから呼び出す
まず回答から。以下のワンライナーをPowerShell上で呼び出します。
Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak("こんにちは")
C#のコードを書かずとも.NETフレームワークが直接呼び出せるというのがPowerShellのいいところ。
これでも用は足ります。ただせっかくなので第一引数をもらってsayコマンドに近づけましょう。
PowerShellを単品で動かすのは面倒で、だったら先のワンライナーで十分です。そこで古き良きバッチファイルに変換します。第一引数をもらって音声に変換するバッチファイルバージョンがこちら。
@echo off
setlocal
set "text=%~1"
powershell -Command "Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak(
'%text%')"
powershellという比較的モダンなスクリプト単品を動かすために30年前から受け継がれてるバッチファイルというのも気持ちが悪いですが仕方ありません。
あとはこんな感じで使えます。
PS C:\Users\yugoy> C:\Users\yugoy\Desktop\say.bat こんにちは
バッチファイルなので、パスの通ったところにおけばよりコマンドっぽく使えます。
ポイント
- PowerShellを通じて.NETフレームワークのAPIをスクリプトっぽく呼び出せる
- シンプルなスクリプトならワンライナーにできる
- ワンライナーを実行可能にするにはバッチファイルにする
この手法を使えば、「.NETフレームワークのこの機能だけ使いたい」ということができます。単機能のバッチファイルを複数作ることで、UNIX哲学の「一つのことをうまくやるプログラムを書く」が実現できます。
WSLからでも使えるの?
WSLからでもPowerShell経由の.NETは呼び出せます。こんな感じでbash上から起動できます。
powershell.exe 'Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak("こ
んにちは")'