WPFで音声認識

今回はC#のWPFで音声認識するプログラム製作にポンコツ2人組が挑戦してみました。 アプリケーションを実行し、マイクに話しかけると音声認識されて、話しかけた言葉がメッセージボックスで表示されます。 開発環境はVisualStudio2019です。 C#初心者が制作したものなのでいろいろとおかしい部分が多いと思います。プログラムを流用する際は適宜修正してください。

※この記事は2024/04/09時点の情報です。

System.Speech
ソリューションエクスプローラーで、プロジェクト名を右クリックし、「参照の追加」を選択します。 次に左側の「フレームワーク」を選択し、右側のリストからSystem.Speechを見つけて選択します。 最後に「OK」ボタンをクリックしてアセンブリの参照を追加します。 これで音声認識エンジンが使用できるようになります。

System.Speechへの参照を追加

MainWindow.xaml
「音声認識テスト」という文字列を表示しているだけの画面になります。

<Window x:Class="SpeechRecognitionApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Speech Recognition App" Height="300" Width="300">
    <Grid>
        <TextBlock Text="音声認識テスト" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,20,0,0"/>
    </Grid>
</Window>

MainWindow.xaml.cs
InitializeSpeechRecognition()メソッドで音声認識エンジンを初期化してします。 日本語を使用して音声認識を行うように設定し、音声認識文法を設定します。 また、音声認識エンジンのイベントハンドラも設定します。 注意点はSpeechRecognitionEngineを初期化する際に日本語("ja-JP")を指定しないと マイクに話しかけても認識してくれませんでした。忘れずに設定しましょう。

var grammar = new Grammar(grammarBuilder);
GrammarBuilderを使用して作成された文法をもとに、音声認識エンジンに使用する文法を作成します。

speechRecognitionEngine.LoadGrammar(grammar);
上記で作成した文法を、音声認識エンジンにロードします。これにより、音声認識エンジンがその文法に基づいて音声を解析して認識することができるようになります。

speechRecognitionEngine.SetInputToDefaultAudioDevice();
音声入力デバイスを、システムのデフォルトのオーディオデバイスに設定します。これにより、音声認識エンジンがデフォルトのマイクから音声を受け取るようになります。

speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
非同期で音声認識を開始します。RecognizeMode.Multipleは、複数の音声を連続して認識するモードを示します。このモードでは、音声認識エンジンが音声を受け取り、適切な文法に基づいて認識し続けます。

using System;
using System.Speech.Recognition;
using System.Windows;

namespace SpeechRecognitionApp
{
    public partial class MainWindow : Window
    {
        //音声認識エンジンを初期化し、音声を認識するために使用
        private SpeechRecognitionEngine speechRecognitionEngine;

        public MainWindow()
        {
            InitializeComponent();
            InitializeSpeechRecognition();
        }

        private void InitializeSpeechRecognition()
        {
            try
            {
                //初期化時に、使用する言語として日本語("ja-JP")を指定
                speechRecognitionEngine = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("ja-JP"));

                //音声認識文法の制約をプログラムでビルドするための機構
                var grammarBuilder = new GrammarBuilder();
                grammarBuilder.AppendDictation();

                //grammarBuilderを使用して作成された文法をもとに、音声認識エンジンに使用する文法を作成
                var grammar = new Grammar(grammarBuilder);
                //上記で作成した文法を、音声認識エンジンにロード
                speechRecognitionEngine.LoadGrammar(grammar);
                //音声入力デバイスを、システムのデフォルトのオーディオデバイスに設定
                speechRecognitionEngine.SetInputToDefaultAudioDevice();
                //音声認識を開始 (RecognizeMode.Multipleは、複数の音声を連続して認識するモード)
                speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
                //イベントハンドラ設定
                speechRecognitionEngine.SpeechRecognized += SpeechRecognized;
            }
            catch (Exception ex)
            {
                MessageBox.Show("音声認識エンジンの初期化中にエラーが発生しました: " + ex.Message);
            }
        }

        ///音声認識エンジンが音声を認識したときに呼び出されるイベントハンドラ
        private void SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            if (e.Result != null && !string.IsNullOrWhiteSpace(e.Result.Text))
            {
                // 認識されたテキストを取得して、適切な処理を行います。
                MessageBox.Show("認識されたテキスト: " + e.Result.Text);
            }
        }

        ///ウィンドウが閉じられるときに呼び出されるメソッド
        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);

            if (speechRecognitionEngine != null)
            {
                //解放
                speechRecognitionEngine.Dispose();
            }
        }
    }
}

以下がアプリケーションを実行した画面です。認識率はあまり良くない印象ですが とりあえず音声を認識してメッセージボックスで表示されました!

C#のWPFで音声認識

管理人情報