Delphi 2.0からsapiw.dllを使ってみる

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

目次

sapiw.dllとは?

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

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

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

フォームを作成する

Delphiの最新版はDelphi4です。 つい最近Delphi5もアナウンスされましたが、 私のWindows95には、Delphi2しか入っていません。 (Windows NTの方にはDelphi4を入れてあるのですが…)

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

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

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

コードを書く

私の聞いた限りではsapiw.dllをDelphiから使用している人は、 いないようで参考にできるものがなかったので、 Visual Basicでの宣言を参考に、以下のようなコードを書きました。 ここで、重要なのは、DLLを呼ぶための宣言をすることと、 uses節に OleAuto を加えることです。 (OleAuto 以外は、デフォルトで記述されていたものです。) sapiw.dll は、OLE を使用するので、 OleAuto を加えないと、プログラムを実行しても音声がでません。 これで、はまって相当苦労しました。 (ただ、本当に OleAuto で良いかは確認ができていない…) ボタンをクリックしたときの動作を Button1Click に記述して、 ボタンを押すと"こんにちは"としゃべるようにしました。 SAPI_SetVolume, SAPI_SetPitch, SAPI_SetSpeed の 第1項を0にすると、男性音、 第1項を1にすると、女性音の設定ができ、 SAPI_Speech の 第1項を0にすると、男性音、 第1項を1にすると、女性音でしゃべります。

unit hellofrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, OleAuto;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function SAPI_Open(hwnd: HWND): Integer; Stdcall;
external 'sapiw.dll';
procedure SAPI_Close; Stdcall;
external 'sapiw.dll';
procedure SAPI_Speech(nType: Integer; tx: PAnsiChar); Stdcall;
external 'sapiw.dll';
procedure SAPI_Stop; Stdcall;
external 'sapiw.dll';
function SAPI_SetSpeed(nType: Integer; nSpeed: Integer): Integer; Stdcall;
external 'sapiw.dll';
function SAPI_SetVolume(nType: Integer; nLeftVolume: Integer; nRightVolume: Integer): Integer; Stdcall;
external 'sapiw.dll';
function SAPI_SetPitch(nType: Integer; nPitch: Integer): Integer; Stdcall;
external 'sapiw.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
     SAPI_Speech(1, 'こんにちは');
end;

procedure TForm1.FormShow(Sender: TObject);
begin
     SAPI_Open(Handle);
     SAPI_SetVolume(1, 65535, 65535);
     SAPI_SetPitch(1, 150);
     SAPI_SetSpeed(1, 240);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
     SAPI_Stop;
     SAPI_Close;
end;

end.

本当は、他にもいろいろな関数があるので、それらの関数を 使用する場合には、宣言をしておかなければいけませんが、 今回は記述しませんでした。

実行する

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

実行結果

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

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

実行時にできた実行形式ファイルを含めてリンクを張っておきます。 Delphi用のDLLがインストールされていないと、 実行できないかどうかは分かりません。

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