SAPIを使ってパソコンに喋らせる

# はじめに
コンピュータに喋らせるやつのことを音声合成というのですが、実はWindowsに元から入っていて、プログラムから簡単に利用することができます。
この記事ではVBScriptを使ってこの「Microsoft Speech API(SAPI)」を使う方法について説明していきます。

#簡単な例
次のコードをvbsファイルに保存して実行すれば、パソコンが喋り出すはずです。

```
Option Explicit
Dim sapi
Set sapi = CreateObject("SAPI.SpVoice")
sapi.Speak "こんにちは"
Set sapi = Nothing
```

非常に簡単ですね。
#様々なオプション
速度や音量などの様々なオプションを指定して喋らすことができます。
##Rate プロパティ
-10〜10の範囲で音声の読み上げ速度を指定できます。
喋っている途中で値を変更しても、再び喋り始めるまで反映されません。

```
sapi.Rate = 10　 '-10〜10の範囲で指定
```

##Volume プロパティ
0〜100の範囲で音量を指定できます。
喋っている途中で値を変更しても、再び喋り始めるまで反映されません。

```
sapi.Volume = 100　 '0〜100の範囲で指定
```

##Priority プロパティ
複数のSAPIが同時に話そうとしたときの優先度を指定します。
次の3つの番号を指定できます。デフォルトは0です。

|番号|処理|
|:---|:---|
|0|1番より優先度が低い。1番と同時に喋ろうとすると中断される。|
|1|0番より優先度が高い。0番と同時に喋ろうとするとこちらが優先される。|
|2|中断はしないで、同時に喋る。|

言葉で説明してもわかりにくいと思うので、実際にコードを実行してみます。

```sapi01.vbs
Option Explicit
Dim sapi
Set sapi = CreateObject("SAPI.SpVoice")
sapi.Priority = 0
sapi.Speak "私の番号は0番です。"
Set sapi = Nothing
```

```sapi02.vbs
Option Explicit
Dim sapi
Set sapi = CreateObject("SAPI.SpVoice")
sapi.Priority = 1
sapi.Speak "私の番号は1番です。"
Set sapi = Nothing
```

この2つのコードを保存し、sapi01.vbsを実行した後にsapi02.vbsを実行してみます。
するとsapi01.vbsの音声が中断され、優先順位の高いsapi02.vbsが喋り始めます。

次に、下のコードをsapi03.vbsとして保存します。

```sapi03.vbs
Option Explicit
Dim sapi
Set sapi = CreateObject("SAPI.SpVoice")
sapi.Priority = 2
sapi.Speak "私の番号は2番です。"
Set sapi = Nothing
```

sapi01.vbsを実行した後にsapi03.vbsを実行してみると、同時に喋るはずです。

##Voice プロパティ
どの音声で喋らせるか指定します。
Windowsには元から「Microsoft Haruka」などの音声がインストールされており、それぞれに対応するSpObjectTokenオブジェクトを指定します。
ではSpObjectTokenオブジェクトをどうやって取得するのかというと、GetVoicesメソッドを使います。

```
Dim voices
Set voices = sapi.GetVoices("Language=411")
```

GetVoicesメソッドは、第一引数に指定した条件を満たすSpObjectTokenオブジェクトの配列を返します。
第一引数に何も指定しないと、インストールされているすべての音声を返します。
条件には次のようなものが指定できます。

|条件|処理|
|:---|:---|
|Gender|音声の性別　Male / Femaleを指定できる|
|Age|音声の年齢　Adultしか指定できない模様|
|Name|音声の名前|
|Language|音声の言語ID　例えば日本語なら411|
|Vendor|音声の製作元|

Languageに指定できる言語IDは以下の通りです。

|条件|処理|
|:---|:---|
|410|イタリア語(イタリア)|
|413|オランダ語(オランダ)|
|403|カタロニア語|
|41D|スウェーデン語|
|80A|スペイン語(メキシコ)|
|C0A|スペイン語(モダン ソート)|
|406|デンマーク語|
|407|ドイツ語(ドイツ)|
|414|ノルウェー語(ブークモール)|
|40B|フィンランド語|
|C0C|フランス語(カナダ)|
|40C|フランス語(フランス)|
|416|ポルトガル語(ブラジル)|
|816|ポルトガル語(ポルトガル)|
|415|ポーランド語|
|419|ロシア語|
|804|中国語(中国)|
|404|中国語(台湾)|
|C04|中国語(香港)|
|411|日本語|
|409|英語(U.S.)|
|4009|英語(インド)|
|C09|英語(オーストラリア)|
|1009|英語(カナダ)|
|809|英語(英国)|
|412|韓国語|

複数の条件を書きたい場合は、

```
Dim voices
Set voices = sapi.GetVoices("Language=411; Gender=Female")
```

のようにセミコロンで区切ります。

日本語の音声を指定して喋らせるプログラムは次のようになります。

```
Option Explicit
Dim sapi, voice
Set sapi = CreateObject("SAPI.SpVoice")
Set voice = sapi.GetVoices("Language=411")(0)
Set sapi.Voice = voice
sapi.Speak "日本語を話しています。"
Set voice = Nothing
Set sapi = Nothing
```

#音声を録音する
実はSAPIには、音声を録音してファイルに保存する機能まであります。

```
Dim sapi, stream
Set sapi = CreateObject("SAPI.SpVoice")
Set stream = CreateObject("SAPI.SpFileStream")

stream.Open "test.wav", 3
Set sapi.AudioOutputStream = stream

sapi.Speak "こんにちは"

stream.Close
Set sapi = Nothing
```

このコードを実行してみると、test.wavというファイルが生成され、「こんにちは」と録音されているはずです。

streamのOpenメソッドの第二引数には、ファイルのアクセスモードを指定します

|番号|処理|
|:---|:---|
|0|既存のファイルを読み取り専用で開く。|
|1|既存のファイルを読み書き可能として開く。|
|2|既存のファイルを読み書き可能として開く。それ以外の場合は、ファイルを作成してから読み取り/書き込みとして開く。|
|3|ファイルが存在する場合でもファイルを作成し、既存のファイルを破棄または上書きする。|