喋るぞ幸運菓子(Microsoft.Speech)

Acronym を PowerShell に喋らせる」後「ヤスタカ」たら、元の「Acronym を PowerShell に喋らせる」が出来なくなっちゃった、というのは内緒だ。

fortuneの喋る版、ですが、「自分の PC の powershell に喋らせる」ので、fortuneみたいに WEB ベースではでけんですの。

まずお菓子を入手しますよ。一行に一名言、なテキストにしとこうな、簡単のために。例えばこんなから持ってくるとか。quotes.txt て名前にしようね。

powershell スクリプトはこんだけなの:

fortune_speak.ps1
 1 $quotes = Get-Content $pwd/quotes.txt
 2 $feelsolucky = Get-Random -InputObject $quotes
 3 $logo = [Reflection.Assembly]::LoadWithPartialName("Microsoft.Speech")
 4 $speak = New-Object Microsoft.Speech.Synthesis.SpeechSynthesizer
 5 #Add-Type -AssemblyName System.speech
 6 #$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer
 7 $speak.Rate = -3
 8 $speak.SetOutputToDefaultAudioDevice()
 9 $speak.SelectVoice('Microsoft Server Speech Text to Speech Voice (en-GB, Hazel)')
10 $feelsolucky
11 $speak.Speak("$feelsolucky")
12 $speak.Dispose()

ま、目新しいのはテキストファイルから読み込む Get-Content と Get-Random で一行選ぶとこ、それと Unix 的シェルで言うところの「コマンドの結果の引用(borne-shell系ではバッククオート)」だけよね。

ヤスタカ」「和英混在の文章を PowerShell に喋らせる」で Microsoft Speech Platform (Version 11) 有効にしたので、と思うけど、元の「System.Speech」が(多分デバイスの奪い合いに負けて)使えなくなるみたい。ので、Microsoft.Speech が動作出来るか System.Speech で動作出来るかは、環境次第です。

さて。この fortune_speak.ps1、せっかくの幸運菓子なので、ログオン時に祝詞おくれよ、と。

うーん、それよりも。ps1 の置き場、どうしとこうか…。なんか標準マナーとかあんのかな、と思いつつも、ここんとこの「標準個人ブツ置き場」と思われる %Users%/AppData/Roaming/ に .site-powershell なんてフォルダを作り、そこに置くことにしてみた。どうせ個人のものだからな、まぁ良かろ。

で、「起動時に」と、「-ExecutionPolicy」のために、ショートカットを作る:

あとはこのショートカットを「スタートアップ」に置くだけ。なんだか起動が遅いのが難点だけど、「ありがたや…」という気分になれます。

あっ、やべ。Windows 機はスリープで眠らせてばかりで、滅多にログオフ・ログインしないじゃねーか、どうしてくれる。










ところで、Get-Random なんですけど、なんかね、こうするとダメなの:

fortune_speak.ps1
1 Get-Content $pwd/quotes.txt | Get-Random

これについてはここに似た情報がありました。

In PS 3.0, ‘Get-random’ doesn’t return an error value for a $null variable without the use of ‘-inputobject’.

アタシの遭遇してる問題とはなんか違う気はするけど、とにかく「パイプライン」ではダメ(というかなんでパイプラインに $null が「流れてく」のか謎なの)。-InputObject に明示的に渡せばうまくいく。釈然としないけど、まぁいいか、今は。そのうち理解出来る日も来るであろ。