LoginSignup
12
12

More than 3 years have passed since last update.

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

Posted at

はじめに

コンピュータに喋らせるやつのことを音声合成というのですが、実は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 ファイルが存在する場合でもファイルを作成し、既存のファイルを破棄または上書きする。
12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12