[電源を入れる] Windows音声初期プログラミング

[電源を入れる] Windows音声初期プログラミング

、SAPIプロフィール

ソフトウェアの音声技術は二つの側面、音声認識(音声認識)と音声合成(音声合成)が含まれています。両方の技術は、サポート音声エンジンが必要です。MicrosoftのアプリケーションプログラミングインタフェースAPIは、業界標準ではなく、広く使われているが。

SAPIは、Microsoft音声APIの略です。音声SDK開発キット位置SRとSSエンジンに関連します。音声認識エンジンは、複数の言語をサポートしていますというように英語、中国語、日本語を含め、声を出して読んでください。

次の成分(界面)を含むSAPIオブジェクト。

(1)ボイスコマンドのAPI。制御アプリケーション、一般的に音声認識のために使用されるシステム。順序を識別した後、それは、関連するインタフェースが機能に対応する完全なアプリケーションである呼びます。あなたは、ボイスコントロールをプログラムしたい場合は、オブジェクトのこのセットを使用する必要があります。
(2)音声ディクテーションAPI。ディクテーション、すなわち、音声認識インターフェース。
(3)音声テキストAPI。スピーチへのテキストからの変換、すなわち、音声合成を完了します。
(4)音声電話API。音声認識と電話システムの統合された使用上の音声合成は、このインタフェースの使用は、電話応答システムを確立し、さらには携帯電話を介してコンピュータを制御することができます。
(5)オーディオAPIオブジェクト。コンピュータのサウンドシステムをカプセル化します。

SAPIアーキテクチャはCOMに基づいており、Microsoftはまた、ActiveXコントロールを提供し、そうではないだけでも、Webページ、VBAやEXCELでさえチャートに使用することができ、一般的なWindowsプログラムのために使用することができます。あなたはCOMに慣れていないなら、あなたはまた、MicrosoftのC ++ラッパーを使用することができ、それが音声SDKのCOMオブジェクトをカプセル化するC ++クラスを使用しています。

第二に、SAPI SDKをインストールします。

まず、このサイトから開発キットをダウンロードしてください:http://www.microsoft.com/speech/download/sdk51

Microsoft音声SDK 5.1は、オートメーションサポートを追加します。これは、VB、ECMAScriptのなどの言語サポートオートメーションで使用することができます。

リリースノート:
バージョン:5.1
リリース日:2001年8月8日
音声:英語
ダウンロードサイズ:2.0 MB - 288.8メガバイト

SDKは、開発キットが簡単に英語と中国語の音声合成エンジン(TTS)に公開することができます含まれており、英語で、中国語、日本語の音声認識エンジン(SR)。

請求項98バージョンでシステム。プログラムコンパイラ開発パッケージの例としては、VC6環境よりも多くを必要とします。

****** ******ダウンロード手順:
あなたがサンプルプログラム、ドキュメント、SAPIと開発のためのアメリカ英語のスピーチエンジンをダウンロードする場合は(1)、あなたは68Mについて、SpeechSDK51.exeをダウンロードする必要があります。
あなたは簡体字中国語、日本語音声合成エンジンを使用する場合(2)、あなたはSpeechSDK51LangPack.exeをダウンロードする必要があります。82Mについて。
あなたが一緒にソフトウェアの音声エンジンを所有して公開する場合(3)、あなたはSpeechSDK51MSM.exe、約132Mをダウンロードする必要があります。
     (このアドレスでは、私は正常にダウンロードできませんでした)。
あなたはXPの下にマイクとメアリーの声を取得したい場合は(4)、Sp5TTIntXP.exeをダウンロードしてください。約3.5M。
あなたはドキュメント開発キットを取得したい場合は(5)、sapi.chmをダウンロードしてください。約2.3M。これは、すでに内部sdk51に含まれています。

ダウンロードが完了した後、SpeechSDK51.exeをインストールした後、中国の言語パッチSpeechSDK51LangPackをインストールし、展開する
msttss22lを、自動的に必要なシステムDLLディレクトリにインストールされます。

第三に、コンフィギュレーション・VC環境

VC6.0の音声環境下でプロジェクトをコンパイルするには、まずビルド環境を設定する必要があります。想定SDK Dにインストール:の下に\ Microsoft音声SDK 5.1 \パス、C / C ++で、列をプロジェクトの設定]ダイアログボックスを開き、プリプロセッサのカテゴリを選択し、中に入る「追加パスが含ま」
D:\ Microsoft音声SDK 5.1 \が含ま
伝えます場所SAPIは、VCのコンパイラのヘッダファイルを必要としていました。
:その後、LINKフィールド、入力の分類の下に追加のライブラリパスを入力に切り替える
\ Microsoft音声SDK 5.1 \ libに\ I386をD:
VCはリンクsapi.lib時に見つけることができるようにします。

第四に、音声合成アプリケーション。それは、SAPI TTS(テキストを音声に)使用して達成されます。

1、音声インタフェースを初期化するためには、2つの方法があります。
   ISpVoice * pVoice;
   ::のCoInitialize(NULL);
   HRESULTのHR =のCoCreateInstance(CLSID_SpVoice、NULL、CLSCTX_ALL、IID_ISpVoice、
               (無効**)&pVoice)は、
   その後、使用します関数ポインタSAPIを呼び出し、例えば
   pVoice-> SetVolume(50); //ボリューム設定
   pVoice->(str.AllocSysString()、話す SPF_ASYNC、NULL)を、

   別の方法として、次のように使用できる:
    CComPtrを<ISpVoice> m_cpVoice;
    HRESULTのHR = m_cpVoice.CoCreateInstance(CLSID_SpVoice);
   このm_cpVoice変数を使用している以下の実施例。

   CLSID_SpVoice SPAI.Hは、定義にあります。

2、設定/出力周波数を取得します。

   :SAPIがテキストを読んで、これらのような方法で出力音周波数、様々な使用することができ
   8kHzの8ビットモノラル、ステレオ8ビット8kHzの、モノラル16ビット44kHz、44kHzのような16ビットステレオ。口調はやや異なります。特定の参照sapi.h.

   次のコードは、現在の構成を得るために使用することができる:
   CComPtr <ISpStreamFormat> cpStream;
   HRESULT hrOutputStream = m_cpVoice->のgetOutputStream(&cpStream);
   IF(hrOutputStream == S_OK)
   {
       CSpStreamFormat FMT;
       HR = Fmt.AssignFormat(cpStream);
       IFは(SUCCEEDED( HR))
       {
           SPSTREAMFORMAT eFmt Fmt.ComputeFormatEnum =();
       }
   }
    SPSTREAMFORMAT ENUMは位置SPAI.Hで定義されたタイプです。各値は、異なる周波数の設定に対応します。例えばSPSF_8kHz8BitStereo = 5

    現在の周波数コードによって提供されるが読み込まれる:
    CComPtrを<ISpAudio> m_cpOutAudio; //音声出力インタフェース
    SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOOUT、&m_cpOutAudio); // インターフェイスを作成

    SPSTREAMFORMAT eFmt = 21。// SPSF_22kHz 8ビットステレオ

    CSpStreamFormat FMT;
    Fmt.AssignFormat(eFmt)。
    IF(m_cpOutAudio)
    {
HR = m_cpOutAudio->のsetFormat(Fmt.FormatId()、Fmt.WaveFormatExPtr())。
    }
    他HR = E_FAIL。

    IF(SUCCEEDED(HR))
   {
       m_cpVoice-> SetOutput(m_cpOutAudio、FALSE)。
   }

図3は、取得/設定するには、再生中の音声を使用していました。

   使用される音声データファイルエンジンは、一般に、VCEのSPDまたはSpeechEnginesにファイルに格納されています。SDKをインストールした後は、そのようなので、上の英語、オス/メス、簡体字中国語男性の声として、可能な音声のレジストリに保存。場所は次のとおりです。
   HKEY_LOCAL_MACHINE \ SOFTWARE \マイクロソフト\スピーチ\声\トークンに
中国語音声読み上げオペレーティングシステムをインストールする場合、使用されるデフォルトは、中国が簡略化されています。SAPIの欠点は、それが中国語と英語の混在読み取りをサポートすることはできませんで、中国語、英語の出会いを読んだ時には、唯一の文字で文字を読み取ることができます。自分の声の切り替えをプログラムする必要があります。

(1)現在のSDKの関数として使用することができるサポートするコンボボックス内に充填されたボイス:
    で// SAPI5 sphelper.hヘルパー関数
    HWND hWndCombo GetDlgItem =(hWndは、IDC_COMBO_VOICES); //コンボボックスハンドル
    HRESULTのHR = SpInitTokenComboBox( hWndCombo、SPCAT_VOICES);
    この関数は、現在利用可能なコンボボックスインタフェースにキャプションを追加するために、IEnumSpObjectTokens音声インタフェースを介して列挙するためのインターフェース、およびLPARAMとしてインターフェイスポインタである
    コンボボックスに格納されています。
    :必ず、保存されたコンボボックスインターフェイスのリリースを最後にプログラムが終了を覚えている
    。SpDestroyTokenComboBox(hWndCombo)
    、この原則の機能は、各項目のコンボLPARAMデータ内の一つ一つを得ることであるのIUnknownインターフェイスポインタに変換され、その後、リリース関数を呼び出します。
(2)場合、コンボボックスは、次の関数は、ユーザが選択した音声を得るために使用することができる選択の変化:
    ISpObjectToken * = SpGetCurSelComboBoxToken pToken(hWndCombo)。

(3)次の関数と現在使用中の音声を取得:
    CComPtr <ISpObjectToken> pOldToken;
    HRESULT HR = m_cpVoice-> GetVoice(&pOldToken);
(4)ユーザが音声と現在使用中の一貫性のない場合、以下によってを選択したとき機能を変更します
    (!pOldToken = pToken)のIF
    {       
         //現在の読書の一端が、これは必要ありません。
         HR = m_cpVoice- HRESULT>スピーク(NULL、SPF_PURGEBEFORESPEAK、0);
         IF(SUCCEEDED(HR))
        {
            HR = m_cpVoice-> SetVoice(pToken);
         }
    }
(5)SpGetTokenFromIdは、取得した指定された機能として使用することができる音声トークンポインタ例えば:
      WCHAR pszTokenId [] = L "HKEY_LOCAL_MACHINEソフトウェア\\ \\ \\ Microsoft音声声\\ \\ \\ MSSimplifiedChineseVoiceトークン";
    SpGetTokenFromId(pszTokenID、&pChineseToken)。

4、現在の読み取り開始/一時停止/再開/終了
  
   テキスト文字列がワイドになっている必要があり音読するには、位置szWTextStringはその後、仮定:
   :のコード読み取り開始
   HR = m_cpVoice->話す(szWTextString、SPF_ASYNC | SPF_IS_NOT_XML、0) ;
   あなたがXMLテキストを解釈する場合:
   HR = m_cpVoice->(szWTextString、SPF_ASYNC | SPF_IS_XML、0)を話します。

   コード一時停止:m_cpVoice->一時停止();
   コード回復:m_cpVoice->再開();
   終了コード:(例えば上記で説明した)
   HR = m_cpVoice->、(NULL、SPF_PURGEBEFORESPEAK話す0)。

5、テキスト部分を読み飛ばし

   次のように読み出し時には、後読み続けするテキストの一部を省略することが可能である:
   ULONG ulGarbage = 0;
   WCHAR szGarbage [] = L "文";
   HR = m_cpVoice->スキップ(szGarbage、SkipNum、&ulGarbage);
   SkipNumでありますスキップされる文の数を設定し、値が負/正であってもよいです。
   SDKの説明書によると、現在、このタイプのSAPI文をサポートしています。SAPIは、文の句読点によって区別されます。

6、WAVファイルを再生します。SAPIはISpStreamによって実装されるインタフェースであるWAVファイルを、再生することができます:

   CComPtr <ISpStream> cpWavStream。
   WCHAR szwWavFileName [NORM_SIZE] = L "" ;;

   USES_CONVERSION;
   wcscpy(szwWavFileName、T2W(szAFileName))など; //ワイド文字列にANSI WAVファイル名から変換し、

   //この関数を使用することは、sphelper.h wavファイルオープン提供、及びIStreamへのポインタを取得
   HR = SPBindToFile(szwWavFileName、SPFM_OPEN_READONLY、&cpWavStream);
   IF(SUCCEEDED(HR))
   {
        m_cpVoice-> SpeakStream(cpWavStream、SPF_ASYNC、NULL); // WAVファイルを再生
   }
読み取りwavファイルに結果を保存し、7を
   TCHAR szFileName [256]; //オブジェクト・ファイルのパスが保持しているものと
   、USES_CONVERSIONを
   WCHAR m_szWFileName [MAX_FILE_PATH];
   としてwcscpy(m_szWFileName、T2W(szFileName)) ; //ワイド文字列が変換されます

   // wavファイル結合すること、出力ストリームを作成
   CSpStreamFormat OriginalFmtと、
   CComPtr <ISpStream> cpWavStream;
   CComPtr <ISpStreamFormat> cpOldStreamと、
   HRESULTのHR = m_cpVoice->のgetOutputStream(&cpOldStream);
   IF(HR == S_OK)HR = OriginalFmt.AssignFormat (cpOldStream);
   他のHR = E_FAIL;
   // sphelper.hを提供する機能使用してWAVファイルを作成
   IFを(SUCCEEDED(HR))
   {
      HR = SPBindToFile(m_szWFileName、SPFM_CREATE_ALWAYS、&cpWavStream、
                         &OriginalFmt.FormatId()、OriginalFmt.WaveFormatExPtr( ));
    }
   (SUCCEEDED(HR))IF
   {
      //スピーカー代わりに、音声wavファイルへの出力を設定
      m_cpVoice-> SetOutput(cpWavStream、TRUE);
    }
    読み込み開始//
    m_cpVoice->話す(szWTextString、SPF_ASYNC | SPF_IS_NOT_XML、0);

    //読み取り終了を待つ
    m_cpVoice-> waitUntilDone(INFINITE);
    cpWavStream.Release();

    元のストリームに再配置//出力
    m_cpVoice-> SetOutputは(cpOldStream、FALSE);
   
8、音量設定および読み出し速度
   m_cpVoice-> SetVolume((USHORT)HPOS ); // - 100ボリュームの範囲を0に設定
   m_cpVoice-を> setRate(HPOS); //設定された速度範囲-10--10

   値は、一般的にHPOSに位置しています

図9は、SAPI通知メッセージを提供しました。読書の過程でSAPIは、メッセージが指定したウィンドウを送信すると、ウィンドウがメッセージを受信するには、SAPIイベントを取得するためのイニシアチブをとることができ
   、そのような声を出して言葉を読まれているの位置、現在のように、あなたは現在のSAPIに関するいくつかの情報を得ることができ、さまざまなイベントに基づいて、口の値音読(表示する
   ようにアニメーションの口を、中国の音声の場合には、このイベントを提供していません)と。

   、SAPI通知を得るために最初のメッセージに登録する:
   m_cpVoice-> SetNotifyWindowMessage(hWndは、WM_TTSAPPCUSTOMEVENT、0、0);
   このコードは、典型的には、メインウィンドウを呼び出すとき、のhWndメインウィンドウ(またはメッセージを受信するウィンドウ)がハンドル初期化されます。WM_TTSAPPCUSTOMEVENTは、
   ユーザ定義のメッセージです。

   窓関数WM_TTSAPPCUSTOMEVENT応答メッセージに、通知イベントSAPIは、次のコードによって取得されました。

    CSpEventイベント; //このクラスを使用するには、構造がSPEVENT持つよりも便利です

    一方、(event.GetFrom(m_cpVoice)== S_OK)
    {
        スイッチ(event.eEventId)
        {
           ...
        }
    }

   SPEI_START_INPUT_STREAMが読み取り開始を指示など、多くのがありますeEventID、SPEI_END_INPUT_STREAMはそうで読書の終わりとを示しています。
   分析は、必要に応じて使用することができます。

IV結論
  
   な音声認識などの多くのSAPI機能は、限られた条件に起因してエネルギーに、構文解析を使用して、私は試してみることができない、と興味を持って友人が自分で見てインストールすることができます。
   また、簡単なプログラム例のダウンロードを提供し、場所は次のとおりです。
   FTP:// vckbase:[email protected]/user/iwaswzq/Universe.rar

ます。https://www.cnblogs.com/succ/archive/2010/03/12/1684332.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33841503/article/details/93155058