このページでは、sapiw.dllと Visual BASIC 4.0で、簡単なプログラムを試しに作ってみたので その過程を紹介します。
sapiw.dllはSAPI(Speech API)を使用するためのDLLです。 SAPIとProTALKER97を使って音声を出力するプログラムを 書くためには、結構難しいことをやらないといけません。 (素人の私には全く理解できませんでした。) でも、このsapiw.dllを使用すると、音声を出力する プログラムを簡単に書くことができます。
sapiw.dllは 視覚障害関連開発サイトVips の ftpサイト で手に入ります。 また、 音声もぐらの 中にも含まれていると思います。 音声を出力するにはSAPI対応の音声エンジンが必要です。 私の場合、ProTALKER97を購入しました。 大きめのパソコンショップなら手に入れられると思います。 他のSAPI対応音声合成エンジン、例えば、 その他のSAPI対応音声合成エンジンに あげられているものでは、おそらく音が出ないでしょう、確認してはいないですが。
ProTALKER97をインストールしただけでは、sapiw.dllを 使用して音声を出力することはできないようです。 私の場合、Win-BES99をインストールすることで、 音声を出力することができました。 (強引だなあ〜) なお、 ホームページ・リーダー とかが入っていると、必要なファイルがインストールされて、 特に何もしなくても音声が出るらしいです。
最近は、Microsoftのプログラミング言語もバージョンアップしていないので Visual Basic4.0しかありません。 (Visual Basicの最新版は6.0だったか?)
Visual Basic4.0でもプログラムは作れるので、作ってみました。 まず、次のようなフォームを作成しました。
フォームの上に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があればエラーは出ないと思います。)
[ファイル(F)] [EXEファイルの作成(K)]で作った実行形式 ファイルを含めてリンクを張っておきます。 Visual Basic4のDLLがインストールされていないと、 実行できないと思います。
実用性0の例をあげてしまったので、次は、ProTALKER97に 付属のクリップボードリーダの設定プログラムに似た 機能を持つプログラムを作ってみました。
クリップボードリーダの設定プログラムでは、声の設定、読み上げのタイミング、 息継ぎ位置の設定、数字の読み方などが細かく設定できます。 また、声の設定では、声を試しに聞きながら 速度、音量、ピッチ、抑揚などを設定することができます。
現在のsapiw.dllでは抑揚など細かい設定はできないようですが、 速度、音量、ピッチを変えて 試しに声を聞くことができるプログラムを作ってみました。 自分でプログラムして 関数 SAPI_* を使うときに役に立つよう、 プログラムの関数で使う数値を右側に表示するようにしました。 (音でしゃべるようにすればよかったな…)
まず、フォームを作成しました。 男性音か女性音かを選択するための ComboBox と、 速度、音量、ピッチを変えるための ScrollBar と、 しゃべる言葉を入力する TextBox と、 しゃべるのを実行するための CommandButton を配置しました。
コードも適当に書きましたが、ここには、示しません。 興味がある方は、ファイルを置いておくので、それを見てください。 速度やピッチの上限が良く分からなかったので、デフォルト値の32767に なっています。聞いている限りでは、大きくしすぎても変化がなく 意味がない気がします。
[ファイル(F)] [EXEファイルの作成(K)]で作った実行形式 ファイルを含めてリンクを張っておきます。 Visual Basic4のDLLがインストールされていないと、 実行できないと思います。
E-mail : nnakamur@mxq.mesh.ne.jp