Visual Basicからsapiw.dllを使ってみる

このページでは、sapiw.dllと Visual BASIC 4.0で、簡単なプログラムを試しに作ってみたので その過程を紹介します。

目次

sapiw.dllとは?

sapiw.dllはSAPI(Speech API)を使用するためのDLLです。 SAPIとProTALKER97を使って音声を出力するプログラムを 書くためには、結構難しいことをやらないといけません。 (素人の私には全く理解できませんでした。) でも、このsapiw.dllを使用すると、音声を出力する プログラムを簡単に書くことができます。

sapiw.dllは 視覚障害関連開発サイトVipsftpサイト で手に入ります。 また、 音声もぐらの 中にも含まれていると思います。 音声を出力するにはSAPI対応の音声エンジンが必要です。 私の場合、ProTALKER97を購入しました。 大きめのパソコンショップなら手に入れられると思います。 他のSAPI対応音声合成エンジン、例えば、 その他のSAPI対応音声合成エンジンに あげられているものでは、おそらく音が出ないでしょう、確認してはいないですが。

ProTALKER97をインストールしただけでは、sapiw.dllを 使用して音声を出力することはできないようです。 私の場合、Win-BES99をインストールすることで、 音声を出力することができました。 (強引だなあ〜) なお、 ホームページ・リーダー とかが入っていると、必要なファイルがインストールされて、 特に何もしなくても音声が出るらしいです。

フォームを作成する

最近は、Microsoftのプログラミング言語もバージョンアップしていないので Visual Basic4.0しかありません。 (Visual Basicの最新版は6.0だったか?)

Visual Basic4.0でもプログラムは作れるので、作ってみました。 まず、次のようなフォームを作成しました。

Buttonが一つ置かれたフォーム

フォームの上にCommandButtonを一つ置いただけです。 何の意味もないプログラムですが、 SAPIを使用してProTALKER97に しゃべらせるのが目的なのでよしとしましょう。

コードを書く

DLLを使用したことはなかったので、 VoiceExplorer98音声もぐらの SAPIを使用するソースを参考に、 オブジェクト:(General)、プロシージャ:(declarations)のところに、 以下のようなコードを書きました。

Private Declare Function SAPI_Open Lib "sapiw.dll" (ByVal hwnd As Long) As Long
Private Declare Sub SAPI_Close Lib "sapiw.dll" ()
Private Declare Sub SAPI_Speech Lib "sapiw.dll" (ByVal nType As Long, ByVal tx As String)
Private Declare Sub SAPI_Stop Lib "sapiw.dll" ()
Private Declare Function SAPI_GetNotifyStatus Lib "sapiw.dll" () As Long
Private Declare Function SAPI_SetSpeed Lib "sapiw.dll" (ByVal nType As Long, ByVal nSpeed As Long) As Long
Private Declare Function SAPI_GetSpeed Lib "sapiw.dll" (ByVal nType As Long) As Long
Private Declare Function SAPI_SetVolume Lib "sapiw.dll" (ByVal nType As Long, ByVal nLeftVolume As Long, ByVal nRightVolume As Long) As Long
Private Declare Function SAPI_GetVolume Lib "sapiw.dll" (ByVal nType As Long) As Long
Private Declare Function SAPI_SetPitch Lib "sapiw.dll" (ByVal nType As Long, ByVal nPitch As Long) As Long
Private Declare Function SAPI_GetPitch Lib "sapiw.dll" (ByVal nType As Long) As Long

Visual Basic4だからか?うちの環境がそうなのか? 宣言が足りないからなのか?理由は良く分からないのですが、 私の場合、「Declare」の前に「Private」を書いておかないと、 「定数、固定長文字列、配列、またはDeclareステートメントは、クラスまたはフォームモジュールのPublicメンバとして定義することはできません。」 と怒られてしまってダメでした。

エラーの表示

次に、Form_Loadと、Form_Unloadに 以下のような記述をしました。 すべて、VoiceExplorer98や音声もぐらを参考にしました。 SAPI_SetVolume, SAPI_SetPitch, SAPI_SetSpeed の 第1項を0にすると、男性音、 第1項を1にすると、女性音の設定ができます。

Private Sub Form_Load()
    SAPI_Open hwnd
    SAPI_SetVolume 0, 65535, 65535
    SAPI_SetPitch 0, 150
    SAPI_SetSpeed 0, 240
End Sub

Private Sub Form_Unload(Cancel As Integer)
    SAPI_Stop
    SAPI_Close
End Sub

最後に、ボタンをクリックしたときの動作を以下のように記述しました。 ボタンを押すと"こんにちは"としゃべるはずです。 ここで、 SAPI_Speech の 第1項を0にすると、男性音、 第1項を1にすると、女性音でしゃべります。

Private Sub Command1_Click()
    SAPI_Speech 0, "こんにちは"
End Sub

実行する

プロジェクトを保存するでファイルを保存してから、実行してみました。 ボタンをクリックすると、「こんにちは」としゃべりました。

実行結果

ここで、大切なことを忘れていました。sapiw.dllを実行ファイルと 同じディレクトリに置いておかないと、エラーが出て実行できません。 (多分パスが通っているディレクトリや\WINDOWS\とか\WINDOWS\SYSTEMに DLLがあればエラーは出ないと思います。)

DLLがない時に表示されるエラー

[ファイル(F)] [EXEファイルの作成(K)]で作った実行形式 ファイルを含めてリンクを張っておきます。 Visual Basic4のDLLがインストールされていないと、 実行できないと思います。

もうちょっとましなプログラムを…

実用性0の例をあげてしまったので、次は、ProTALKER97に 付属のクリップボードリーダの設定プログラムに似た 機能を持つプログラムを作ってみました。

ProTALKER97に付属のクリップボードリーダの設定画面

クリップボードリーダの設定プログラムでは、声の設定、読み上げのタイミング、 息継ぎ位置の設定、数字の読み方などが細かく設定できます。 また、声の設定では、声を試しに聞きながら 速度、音量、ピッチ、抑揚などを設定することができます。

現在のsapiw.dllでは抑揚など細かい設定はできないようですが、 速度、音量、ピッチを変えて 試しに声を聞くことができるプログラムを作ってみました。 自分でプログラムして 関数 SAPI_* を使うときに役に立つよう、 プログラムの関数で使う数値を右側に表示するようにしました。 (音でしゃべるようにすればよかったな…)

まず、フォームを作成しました。 男性音か女性音かを選択するための ComboBox と、 速度、音量、ピッチを変えるための ScrollBar と、 しゃべる言葉を入力する TextBox と、 しゃべるのを実行するための CommandButton を配置しました。

フォーム

コードも適当に書きましたが、ここには、示しません。 興味がある方は、ファイルを置いておくので、それを見てください。 速度やピッチの上限が良く分からなかったので、デフォルト値の32767に なっています。聞いている限りでは、大きくしすぎても変化がなく 意味がない気がします。

実行時の画面

[ファイル(F)] [EXEファイルの作成(K)]で作った実行形式 ファイルを含めてリンクを張っておきます。 Visual Basic4のDLLがインストールされていないと、 実行できないと思います。

E-mail : nnakamur@mxq.mesh.ne.jp