Help us understand the problem. What is going on with this article?

SAPIで湯婆婆を実装してみる

前置き

巷では湯婆婆の実装が流行っているそうですね。
私も真似してみようと思いましたが、有名どころのプログラミング言語は粗方実装され尽くしているように思います。

なので少し趣向を変えて、テキストではなく音声で湯婆婆を再現してみたいと思います。

コード

湯婆婆.vbs
Option Explicit

Dim sapi
Set sapi = CreateObject("SAPI.SpVoice")

sapi.Speak "契約書だよ。そこに名前を書きな。"

Dim name
name = InputBox("契約書")

If Len(name) = 0 Then
    Wscript.Arguments(-1)
End If

sapi.Speak ("フン。" & name & "というのかい。贅沢な名だねぇ。")

Dim newName
Randomize
newName = Mid(name, Int(Len(name) * Rnd + 1), 1)

sapi.Speak ("今からお前の名前は" & newName & "だ。いいかい、" & newName & "だよ。分かったら返事をするんだ、" & newName & "!!")

Set sapi = Nothing

WindowsのSAPI (Speech APIの略で、サピと読みます) を使用し、VBSで実装しました。

解説

まずはSAPIを呼び出すためのオブジェクトを生成します。
生成以降、Speakメソッドで音声が出力できるようになります。

Dim sapi
Set sapi = CreateObject("SAPI.SpVoice")

sapi.Speak "契約書だよ。そこに名前を書きな。"

次に、契約書を入力するためのボックスを表示します。

Dim name
name = InputBox("契約書")

image.png

そして入力後、未記入の場合にクラッシュする必要があるため、わざとエラーを引き起こすようにしています。

If Len(name) = 0 Then
    Wscript.Arguments(-1)
End If

記入されている場合はランダムで文字を1つ選び、後は名前を奪って完了です。
※乱数取得前にRandomizeを実行しておかないと、続けて実行したときに同じ乱数が返ってきてしまいます。

sapi.Speak ("フン。" & name & "というのかい。贅沢な名だねぇ。")

Dim newName
Randomize
newName = Mid(name, Int(Len(name) * Rnd + 1), 1)

sapi.Speak ("今からお前の名前は" & newName & "だ。いいかい、" & newName & "だよ。分かったら返事をするんだ、" & newName & "!!")

感想

SAPIで湯婆婆を実装してみる、ということでSAPI婆を実装してみました。
使ってみて良いなと思ったのは、名前を入力した時と1文字だけ抜き取った時とで漢字の読みが変わることです。例えば、千尋は"チヒロ"と読み、千は"セン"と読み上げてくれます。
また難点はやはり、棒読みになってしまい緊張感に欠けることですね。最後に"!!"を付けても感情を込めてくれないので、劇中の情景とはギャップが生まれます。

sigmaponta
関西在住の組込みシステムエンジニアです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away