2013年12月31日火曜日

Windows7で音声合成できない・・・・

先日Windowsで音声合成するサンプルを書きましたが、Windows7では動作させることができません。
Windows7標準の音声合成機能はなぜか日本語音声合成エンジンの提供が通常では行われていないので、プログラムから標準機能のみでの音声合成はできないことになります。

Microsoftの方針としてはSpeechPlatformをインストールして利用してほしいようです。
実際Office2010以降の読み上げ機能もSpeechPlatformをインストールするように説明があります。

音声認識に関してもサンプルプログラムは動きませんでした。

次回はちょっと予定を変更して、SpeechPlatformのインストールに関して書いてみたいと思います。

2013年12月27日金曜日

Windowsで音声認識(Choices+GrammarBuilder)

先日の音声合成に続いて、Windows標準の音声認識機能を使ってみます。

標準の音声認識機能は学習方式と辞書方式どちらにも対応しているようなのですが、今回は辞書方式で認識させます。

音声合成の場合と同じく特に用意するものはありません。

さっそくサンプルプログラムです。コンソールアプリケーションです。

using System;
using System.Speech.Recognition;

namespace SpeechRecognized_Sample
{
    class Program
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {

            //認識エンジン(既定のロケールを使用)
            using (SpeechRecognitionEngine sre = new SpeechRecognitionEngine())
            {

                //イベント登録
                sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized);

                //語彙登録
                Choices words = new Choices(new string[] { "晴れ", "曇り", "雨", "雪" });

                //GrammarBuilderインスタンス
                GrammarBuilder gb = new GrammarBuilder("今日の天気は");

                //GrammarBuilderインスタンスに語彙を追加
                gb.Append(words);

                //Grammarインスタンスを作成
                Grammar g = new Grammar(gb);

                //Grammarインスタンスをロード
                sre.LoadGrammar(g);

                Console.Write("認識開始" + "\n");

                //入力ソース(既定のマイク)
                sre.SetInputToDefaultAudioDevice();

                //非同期で認識開始
                sre.RecognizeAsync(RecognizeMode.Multiple);

                while (true)
                {
                    Console.ReadLine();
                }
            }
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            Console.WriteLine("認識しました:" + e.Result.Text + " 信頼度:" + e.Result.Confidence);
        }
    }
}


説明:
「プロジェクト」>「参照の追加」>「アセンブリ」>「フレームワーク」内の「System.Speech」のチェックを忘れないでください。
今回辞書への登録方法としてChoicesクラスとGrammarBuilderクラスを使っています。
Choicesクラスに認識させたい単語を文字列配列として与えます。
その後Choicesオブジェクトを引数としてGrammarBuilderクラスに与えます。
次にGrammarクラスにGrammarBuilderオブジェクトを与えます。
最後に認識エンジンにGrammarオブジェクトをロードして辞書に登録します。

サンプルではGrammarBuilderインスタンスを作成するときに文字列を与えています。
このようにすることで「今日の天気は」+「Choicesクラスに登録した単語」の組み合わせの文章を登録できます。

音声合成の場合より少し複雑ですが、手順がわかればそれほど難しくはないと思います。

次回はSRGSを使って認識させるサンプルの予定です。


2013年12月25日水曜日

Windowsで音声合成

先日大阪でDev(ice)LOVE デバイス祭りという勉強会に参加しました。
「KINECTを使った音声対話」という内容で話をさせていただいたのですが、その時のスライドに対応したサンプルプログラム+αを何回かに分けて書いていきたいと思います。

ちなみにスライドはこちらにアップロードしています。

まず最初に音声合成のサンプルプログラムです。
勉強会の時はSpeechPlatform11をインストールした状態での説明でしたが、Windows標準の状態でもできますので特に何も用意する必要はありません。(もちろん開発環境は必要です^^;)

サンプルプログラムの動作確認は Windows8 Pro+VS C# 2012 Express for Desktopですが、
Windows7やC#2010でも動くと思います。.NET Framework3.5以上なら大丈夫でしょう。もしかするとXPでも動くかもしれないです。

さっそくプログラムです。コンソールアプリとなります。

using System;
using System.Speech.Synthesis;

namespace Speak_Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            //音声合成エンジン
            SpeechSynthesizer ss = new SpeechSynthesizer();
           
            //出力を既定のスピーカーに設定
            ss.SetOutputToDefaultAudioDevice();

            //音声出力
            ss.Speak("こんにちは,今日はようこそいらっしゃいました。");

            //キー入力待ち
            Console.ReadKey();
           
        }
    }
}

あらかじめ「プロジェクト」>「参照の追加」>「アセンブリ」>「フレームワーク」内の「System.Speech」にチェックを入れてください。

2行目の「System.Speech.Synthesis」でWindows標準の音声合成機能を利用できるようにしています。

しゃべらせるだけならこれだけです。ひらがな、カタカナ、漢字も使えます。英語も標準で使えます。
多国語対応ですが、別に言語パックなどをインストールしなければいけないでしょう。