質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • C#

    7664questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • .NET Framework

    487questions

    .NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Windowsフォームでの音声認識のエラーについて

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 212

north

score 2

お世話になっております。
現在下記の記事を参考に音声認識のプログラムを組み込んでいるのですが

音声認識

recognizerRule.Recognizer.Recognizer = recoperson;
のところでハンドルされていない例外 HRESULT からの例外:0x80045014
というエラーが出てなぜそうなるのか原因が分からず悩んでおります。
恐らくrecopersonがnullになっていたのでこれだと思っているのですがなぜnullになってしまうのかというところで詰まっています。

原因、対策をご教示いただけたらと思います。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DxLibDLL;//DxLibを使用
using CoreTweet; //CoreTweetを使用
using System.IO;//FileInfoを使用
using SpeechLib; //音声認識用

namespace DesctopMascot
{
    public partial class Form1 : Form
    {
        private int[] modelNum;
        private string[] modelName;
        private string[] modelPass;
        private int modelHandle;
        private int cameraHandle;
        private int soundHandle;
        private int nowModelIndex;
        private int attachIndex;
        private float totalTime;
        private float playTime;
        private const float playSpeed = 0.48f;
        private int motionNum;
        private const int maxNum = 2;
        private Tokens token;
        private int NowInput, EdgeInput, PrevInput;
        private int Catch;
        private int CatchMouseX, CatchMouseY;
        private DX.VECTOR Catch3DModelPosition;
        private DX.VECTOR Catch3DHitPosition;
        private DX.VECTOR Catch2DHitPosition;
        private DX.VECTOR scale;
        private float rot;
        private int musicIndex;
        private SpeechLib.SpInProcRecoContext recognizerRule; //音声認識オブジェクト
        private SpeechLib.ISpeechRecoGrammar recognizerGrammarRule; //音声認識のための言語モデル
        private SpeechLib.ISpeechGrammarRule recognizerGrammarRuleGrammarRule; ////音声認識のための言語モデルのルールのトップレベルオブジェクト
        private enum ModelNum
        {
            KAEDE,
            RIN
        }

        private enum MusicNum
        {
            KOIKAZE
        }

        private enum MotionNum
        {
            FUYU,
            FUYU2,
            KOIKAZE
        }

        public Form1()
        {
            InitializeComponent();

            //マウスのホイール動作の追加
            MouseWheel += new MouseEventHandler(Form1_MouseWheel);


            ClientSize = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); //画面サイズの設定
            Text = "DesktopMascot"; //ウインドウの名前を設定
            AllowDrop = true;       //ドラッグ&ドロップを許可

            token = Tokens.Create(""); //twitterアカウントの認証

            DX.SetOutApplicationLogValidFlag(DX.FALSE);    //Log.txtを生成しないように設定
            DX.SetUserWindow(Handle);                      //DxLibの親ウインドウをこのフォームに設定
            DX.SetZBufferBitDepth(24);                     //Zバッファの精度を変更
            DX.DxLib_Init();                               //DxLibの初期化処理
            DX.SetDrawScreen(DX.DX_SCREEN_BACK);           //描画先を裏画面に設定

            modelHandle = DX.MV1LoadModel(modelPass[(int)ModelNum.KAEDE]);
            cameraHandle = 0;
            nowModelIndex = 0;
            attachIndex = DX.MV1AttachAnim(modelHandle, motionNum, -1, DX.FALSE);
            totalTime = DX.MV1GetAttachAnimTotalTime(modelHandle, attachIndex);
            playTime = 0.0f;
            scale = DX.MV1GetScale(modelHandle);
            NowInput = 0;
            EdgeInput = 0;
            PrevInput = 0;
            Catch = 0;
            musicIndex = 0;
            soundHandle = 0;

            OnseiNinshiki();
        }

        public void MainLoop()
        {
            DX.ClearDrawScreen();//裏画面を消す

            DX.DrawBox(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, DX.GetColor(1, 1, 1), DX.TRUE);//背景を設定(透過させる)

            playTime += playSpeed;

            //モーションの再生位置が終端まで来たら最初に戻す
            if (playTime >= totalTime)
            {
                playTime = 0.0f;
            }

            DX.MV1SetAttachAnimTime(modelHandle, attachIndex, playTime);//モーションの再生位置を設定

            ModelMove();

            if (cameraHandle > 0)
            {
                // VMDカメラモーションのパラメータをDXライブラリの設定に反映させる
                //SetupVMDCameraMotionParam(cameraHandle, playTime);
            }
            if (soundHandle > 0 && DX.CheckSoundMem(soundHandle) == 0)
            {
                DX.DeleteSoundMem(soundHandle);
            }

            if (modelHandle != 0)
            {
                DX.MV1DrawModel(modelHandle);//3Dモデルの描画
            }

            //ESCキーを押したら終了
            if (DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) != 0)
            {
                Close();
            }

            DX.ScreenFlip();//裏画面を表画面にコピー
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            DX.DxLib_End();//DxLibの終了処理
        }

        private void OnseiNinshiki()
        {
            bool hit = false;
            //ルール認識 音声認識オブジェクトの生成
            recognizerRule = new SpeechLib.SpInProcRecoContext();
            foreach(SpObjectToken recoperson in recognizerRule.Recognizer.GetRecognizers())
            {
                string language = recoperson.GetAttribute("Language");
                //日本語かチェック
                if(language == "411")
                {
                    recognizerRule.Recognizer.Recognizer = recoperson;
                    hit = true;
                    break;
                }
            }
            if(!hit)
            {
                MessageBox.Show("日本語認識が利用できません。\r\n日本語音声認識 MSSpeech_SR_ja-JP_TELE をインストールしてください。\r\n");
            }
            recognizerRule.Recognizer.AudioInput = CreateMicrofon();

            //音声認識イベントでデリゲートによるコールバックを受ける
            //認識の途中
            recognizerRule.Hypothesis += delegate (int streamNumber, object streamPosition, SpeechLib.ISpeechRecoResult result)
            {
                string strText = result.PhraseInfo.GetText(0, -1, true);
            };

            //認識完了
            recognizerRule.Recognition += delegate (int streamNumber, object streamPosition, SpeechLib.SpeechRecognitionType srt, SpeechLib.ISpeechRecoResult isrr)
            {
                string strText = isrr.PhraseInfo.GetText(0, -1, true);
                MessageBox.Show(this, strText, "メニュー", MessageBoxButtons.OK, MessageBoxIcon.Information);
            };
            //ストリームに何かデータが来た(?)
            this.recognizerRule.StartStream += delegate (int streamNumber, object streamPosition)
            {
                MessageBox.Show("おはよう", "メニュー", MessageBoxButtons.OK, MessageBoxIcon.Information);
            };
            //認識失敗
            this.recognizerRule.FalseRecognition +=
            delegate (int streamNumber, object streamPosition, SpeechLib.ISpeechRecoResult isrr)
            {
                MessageBox.Show("--ERROR!--", "メニュー", MessageBoxButtons.OK, MessageBoxIcon.Information);
            };

            //言語モデルの作成
            recognizerGrammarRule = recognizerRule.CreateGrammar(0);
            recognizerGrammarRule.Reset(0);

            //言語モデルのルールのトップレベルを作成する
            recognizerGrammarRuleGrammarRule = recognizerGrammarRule.Rules.Add("TopLevelRule", SpeechRuleAttributes.SRATopLevel | SpeechRuleAttributes.SRADynamic);
            //文字列の追加.
            recognizerGrammarRuleGrammarRule.InitialState.AddWordTransition(null, "りんごください");
            recognizerGrammarRuleGrammarRule.InitialState.AddWordTransition(null, "バナナください");
            recognizerGrammarRuleGrammarRule.InitialState.AddWordTransition(null, "らんらんるー");
            recognizerGrammarRuleGrammarRule.InitialState.AddWordTransition(null, "私がムスカ大佐だ");

            //ルールを反映させる。
            recognizerGrammarRule.Rules.Commit();

            //音声認識開始。(トップレベルのオブジェクトの名前で SpeechRuleState.SGDSActive を指定する.)
            recognizerGrammarRule.CmdSetRuleState("TopLevelRule", SpeechRuleState.SGDSActive);
        }

        //マイクから読み取るため、マイク用のデバイスを指定する.
        private SpeechLib.SpObjectToken CreateMicrofon()
        {
            SpeechLib.SpObjectTokenCategory objAudioTokenCategory = new SpeechLib.SpObjectTokenCategory();
            objAudioTokenCategory.SetId(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech Server\v11.0\AudioInput", false);
            SpeechLib.SpObjectToken objAudioToken = new SpeechLib.SpObjectToken();
            objAudioToken.SetId(objAudioTokenCategory.Default, @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech Server\v11.0\AudioInput", false);
            return objAudioToken;
        }
    }
}


文字数オーバーになるため関係ないと思われるところは省略しています。
どうかよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • y_waiwai

    2018/07/24 17:14

    あなたの書いたソースコードを提示してください。編集で、<code>を押して、’’’の枠の中にコピペしてください

    キャンセル

まだ回答がついていません

同じタグがついた質問を見る

  • C#

    7664questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • .NET Framework

    487questions

    .NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。