1. sigmaponta

    Posted

    sigmaponta
Changes in title
+SAPIで湯婆婆を実装してみる
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,80 @@
+#前置き
+巷では湯婆婆の実装が流行っているそうですね。
+私も真似してみようと思いましたが、有名どころのプログラミング言語は粗方実装され尽くしているように思います。
+
+なので少し趣向を変えて、テキストではなく音声で湯婆婆を再現してみたいと思います。
+
+#コード
+```VBScript:湯婆婆.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501246/9719bcfe-c91a-1d4e-37d2-92ae5a04aaf6.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文字だけ抜き取った時とで漢字の読みが変わることです。例えば、千尋は"チヒロ"と読み、千は"セン"と読み上げてくれます。
+また難点はやはり、棒読みになってしまい緊張感に欠けることですね。最後に"!!"を付けても感情を込めてくれないので、劇中の情景とはギャップが生まれます。