テキストの音声変換

 テキストの音声変換は、以前からWindowsの標準機能として搭載されていましたが、WINdows8からは、日本語にも対応しているので、プログラム上で、注意や、操作方法を音声で出力することが出来ます。
Edge の WEB画面では、文字を読み上げる機能が標準であります。

音声認識も標準で搭載されており、キーボードの代わりとして入力することが出来ます。

ここでは、テキストを、音声で出力するプログラムを取り上げます。

 テキストを音階として出力するプログラムは、 https://sakuramml.com/ テキスト音楽「サクラ」 があり、Delphi 7 で作成されていて、非常に良く出来ています。
ソースリストも github からダウンロード出来るようになっており、参考になると思います。(著作権があり取り扱いには注意してください)

 プログラム上でテキストを音声で出力するプログラムは、OLE(Object Linking and Embedding)を利用して行いますが、テキストを、Speechに渡すだけなので、Delphi側でのプログラムは非常に簡単です。

Delphiで使用するため、SpeechのOleを読み込んで、Delphiで利用する為の環境を作成します。

 音声出力用のOLEコンポーネントのインポートを行います。
メニューのコンポーネントからコンポートのインポートを選択します。


 VCL for Delphi Win32を選択して。 次へ。
Win32用となっており、コンポーネントのFormへの貼り付けは、ターゲットプラットフォーム 32ビット モードでしか出来ませんが、張り付けた後 64ビットに切り替えてコンパイルすれば、64ビットでも問題なく使用できます。


 コンポーネントの種類として、タイプライブラリの取り込みを選択します。


 Micrsoft Speech Object Library 5.4 を選択します。
二つある場合は、最初のものを選択します。




 パレットページ名とディレクトリー名を指定します。
Activexはデフォルトで生成されいるので、それを選択します。
既にあるものを指定した場合は、ユニットディレクトリー名は自動的に設定されます。
コンポーネントラッパーを生成するにチェックをいれます。



 新規のパッケージへインストールを選択します。


 新規パッケージに解りやすい名前を付けてコンポーネントをインストールします。

 以上の作業で、Speech のコンポーネントが使用できるようになりました。
タイプライブラリのファイルが生成されているので、そのファイルにパスを通せば、フォームにコンポーネントを貼り付けなくても、音声出力は出来ます。

 次のプログラムは、単にタイプライブラリィファイルを追加して音声出力をしています。
SpeechLib_TLB.pasファイルを、プログラムファイルと同じフォルダーにコピーしておけば、パソコンが変わっても、そのままでデバックが可能となります。

=======================================================================================================

program SpeechTest;

uses
  Vcl.Forms,
  Main in 'Main.pas' {Form1},
  SpeechLib_TLB in 'SpeechLib_TLB.pas';

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := True;           // メモリーリーク検出
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

========================================================================================================

unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, MMsystem;

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

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses SpeechLib_TLB;

procedure TForm1.Button1Click(Sender: TObject);
var
  Voice: TSpVoice;
begin
  Voice := TSpVoice.Create(nil);                            // Voice 生成
  Voice.Speak('Hello World!', SVSFlagsAsync);               // 音声出力
  Voice.WaitUntilDone(1000);                                // 出力を待つ タイムアウト1秒
  Voice.Free;                                               // Voice 解放
end;

// 音声をwavファイルに出力し、PlaySound(MMsystem)で再生します。
procedure TForm1.Button2Click(Sender: TObject);
var
  Voice: TSpVoice;
  Stream: TSpFileStream;
begin
  Voice := TSpVoice.Create(nil);                            // Voice 生成
  Stream := TSpFileStream.Create(nil);                      // ファイルストリーム生成
  Stream.Format.Type_ := SAFT48kHz16BitStereo;              // 音源タイプ
  Stream.Open('c:\tmp\test.wav', SSFMCreateForWrite, True); // true 作成or上書き False 上書きのみ
  Voice.AudioOutputStream := Stream.DefaultInterface;       // 音声出力をファイルに
  Voice.Speak('Hello World!', SVSFlagsAsync);               // 音声出力
  Voice.WaitUntilDone(1000);                                // 出力を待つ タイムアウト1秒
  Stream.Close;                                             // ファイルクローズ
  Stream.Free;                                              // ストリーム解放
  Voice.Free;                                               // Voice 解放
  PlaySound('c:\tmp\test.wav', 0, SND_ASYNC);               // wavファイル音声再生 
end;

end.

 コンポーネント利用による音声出力

 Memoに書き込んだテキストを読み上げます。
SpVoiceを複数使用することにより、同時に複数のテキストを読み上げることができます。


unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, MMsystem, Vcl.OleServer,
  SpeechLib_TLB;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    SpVoice1: TSpVoice;
    SpFileStream1: TSpFileStream;
    Button3: TButton;
    SpVoice2: TSpVoice;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  SpVoice1.Speak(Memo1.Text, SVSFlagsAsync);                        // Memo1テキスト音声読み上げ
  SpVoice1.WaitUntilDone(1000);                                     // 出力待ちタイムアウト1000ミリ秒
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Button2.Enabled := False;
  SpFileStream1.Format.Type_ := SAFT48kHz16BitStereo;               // 出力音特性設定
  SpFileStream1.Open('c:\tmp\test.wav', SSFMCreateForWrite, true);  // true 作成or上書き False 上書きのみ
  SpVoice2.AudioOutputStream := SpFileStream1.DefaultInterface;     // 音声出力をファイルに
  SpVoice2.Speak('Hello World!', SVSFlagsAsync);                    // 音声出力
  SpVoice2.WaitUntilDone(1000);                                     // 出力待ちタイムアウト1000ミリ秒
  SpFileStream1.Close;                                              // ファイルクローズ
  Button2.Enabled := True;
  Button3Click(nil);                                                // wavファイル音声再生
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if Button2.Enabled then PlaySound('c:\tmp\test.wav', 0, SND_ASYNC);  // wav音声再生 
end;

end.

   download Speech.zip.zip


   最初に戻る