📘

できた!うかつにもしゃべってしまう nyagos が

2021/05/26に公開
1

サンプルは PowerShell ですが…

$x=New-Object -ComObject SAPI.SpVoice
$x.Speak("早く人間に成りたい")

あ、COM のインスタンス作ってるじゃないですか。なら、nyagos の内蔵 Lua でもいけるんちゃうか?

-- talk.lua
nyagos.alias.talk = function(s)
    local sapi = nyagos.create_object("SAPI.SpVoice")
    for i=1,#s do
        sapi:Speak(s[i])
    end
    sapi:_release()
end

これを talk.lua という名前でセーブしてっと

$ lua_f talk.lua
$ talk 早く人間に成りたい

でけた!(音声を聞かせられないのが残念です。かといって、音声ファイルを UP するのもなぁ)

よし、これを応用すれば、プロンプトが表示されるタイミングで「Ready」とか言わせることで「蒼き流星SPTレイズナー」ごっこが出来るはず…
( あ、なんか、タイムリーなことに YouTube のサンライズチャンネルで 第一話 が公開されていましたよ!)

-- vmax.lua
share.sapi = nyagos.create_object("SAPI.SpVoice")
nyagos.prompt = function(this)
    share.sapi:Speak("Ready")
    return default_prompt(this)
end

どや!

$ lua_f vmax.lua

びみょう…発音・音程はともかく…「Ready」と言った後、カーソルが点滅するまで1秒ほど妙な間があって、普段使いはとてもできない。

だが、天は見捨てなかった!

なおデフォルトでは、同期呼び出しなので、発声が終わるまでSpeakメソッドは戻ってこない。これだとスクリプトの実行に差し障るというのであれば、非同期呼び出しとして発声が終わる前に制御を戻すこともできる。それには、後ろにもう1つ引数を追加して1(SVSFlagsAsync)をつける

おぉ

share.sapi = nyagos.create_object("SAPI.SpVoice")
nyagos.prompt = function(this)
    share.sapi:Speak("Ready",1)
    return default_prompt(this)
end

待ち時間がなくなった!やったね!
(音程はともかく、なんかいけそう)

まぁ、こういうお遊びはともかくとして、長時間処理を裏でやっている時に終わったことを知らせるアラームとかに使うのにいいかもしれませんね!

GitHubで編集を提案

Discussion

gorngorn

ただ、非同期実行だと、リソースを開放する人が居るのか心配だな。
luaがどのタイミングでリソースを開放するかだと思いますが。