3

PowerPoint のスライドに単語またはフレーズを割り当てることができるクライアント用の音声キュー システムを実装しようとしています。その単語またはフレーズを話すと、スライドが進みます。文法を作成するために使用しているコードは次のとおりです (SpeechRecognitionEngine実際の作業には Microsoft のコードを使用しています)。

Choices choices = new Choices();
string word = speechSlide.Scenes[speechSlide.currentslide].speechCue;
if (word.Trim() != "")
{
    choices.Add(word);
    GrammarBuilder builder = new GrammarBuilder(choices);
    Grammar directions = new Grammar(builder);
    return directions;
}

信頼度のしきい値を上げてみましたが、それでも誤検知が多すぎます。文法を改善する方法はありますか?文法の受け入れリストに単語を 1 つだけ追加することが、すべての誤検知を引き起こしていることを何かが教えてくれます。

4

2 に答える 2

3

認識エンジンの結果は、多くの要因によって異なります。これらには、バックグラウンド ノイズ、マイクの品質、オーディオ入力の設定とレベルが含まれます。良いマイクを備えた静かな部屋で試してみて、結果が良くなるかどうかを確認してください。

1 語文法が問題を引き起こすというあなたの理論は公正かもしれません。(これは、選択肢が 1 つしかないテストで教師が多肢選択式の質問をし、非常に多くの生徒が正解したことに驚いたのを思い出します。) 文法の他の選択肢としてジャンク ワードを追加して、エンジンが唯一の選択肢をデフォルトにするだけではありませんか?次のようなものを試してください:

choices.Add("zebra"); 
choices.Add("umbrella");
choices.Add("plunger");

結果が改善するかどうかを確認します。

ディクテーション文法を使用する Windows 7 では、Windows 7 の音声認識機能を使用して、単一の話者をより適切に認識できるように認識エンジンをトレーニングできます。あなたが説明したように、これが固定文法に役立つかどうかはわかりません。トレーニングを試して、結果が改善されるかどうかを確認することをお勧めします。詳細については、 http://windows.microsoft.com/en-US/windows7/Set-up-Speech-Recognitionを参照してください。

于 2012-06-22T19:20:16.123 に答える
3

これが私が思いついたものです:

@Michael Levy が言ったように、聞く単語を 1 つ与えるだけでは、コンピューターはあまり機能しません。基本的には、オーディオ レベルが特定の値に達したときをリッスンし、それがその単語であるに違いないと想定します。だから私はそれに反対の音を別の言葉を与えなければならないと決めました。ここでの私の目標は、音声学の研究に何週間も費やしたり、照合しようとしている単語から遠く離れて聞こえる単語を特定するための完璧なアルゴリズムを見つけたりすることではなかったので、最初の文字に焦点を当てることにしました. 操作の順序は次のとおりです。

  1. XML ファイルからスライドを進めるためのトリガー ワードを抽出する
  2. 単語の最初の文字を見つける
  3. ステップ 2 で見つけた文字の音と最も似ている文字を 3 つ見つけます
  4. 手順 3 で見つかった 3 つの文字のそれぞれで始まる、長さ、音節数、末尾の音、および 2 番目の文字が異なる 4 つの単語を見つけます。
  5. ステップ 4 で見つかった 12 語すべてを、トリガー ワードと共に選択肢リストに追加します。現在13語あります。1 つは私たちが見つけた単語で、残りの 12 はその単語のようには聞こえません。したがって、コンピューターは、イベントハンドラーを起動する前に、それが正しいことを確信します:)

反対の文字を判断するために、ここに質問を投稿しましたが、有用なアドバイスを得る前にシャットダウンされました): 理由がわかりません。私は家族や友人にアンケートをとってみることにしました。各文字には、元の文字の音からできるだけ遠くに聞こえるように 3 つの文字があります。

最後のステップは、これらの各文字の単語を見つけることでした。1 文字あたり 4 単語、合計 104 単語が見つかりました。長さ、2 番目の文字、末尾の音を変えた単語が必要でした。これにより、すべてのベースをカバーし、コンピュータをターゲット単語からできるだけ「そらす」ことができました。この大学の語彙リストを使用しました大きな単語を思いつくために、私のちっぽけな英語の頭脳を使って 5 文字未満の単語を考え出し、最終的には良いリストができたと感じました。XML でフォーマットし、解析コードを追加し、結果をチェックしました。ほとんど良すぎる!誤検知はなく、明瞭度の低い人は私のプログラムを使用するのに苦労するでしょう! おそらく気を散らす言葉の数を削除することで、少し簡単になりますが、全体的には結果に非常に満足しており、@Michael Levy と @Kevin Junghans による提案に感謝しています

コード:

<?xml version="1.0" encoding="utf-8" ?>
<list>
  <a opposite="m,q,n">abnegate,apple,argent,axe</a>
  <b opposite="k,l,s">berate,barn,bored,battology</b>
  <c opposite="v,r,j">chrematophobia,cremate,cease,camoflauge</c>
  <d opposite="l,q,w">dyslogy,distemper,dog,dilligent</d>
  <e opposite="j,n,k">exoteric,esoteric,enumerate,elongate</e>
  <f opposite="g,i,t">flagitious,flatulate,fart,funeral</f>
  <g opposite="f,v,z">gracile,grace,garner,guns</g>
  <h opposite="q,d,x">hebetate,health,habitat,horned</h>
  <i opposite="m,n,f">isomorphic,inside,iterate,ill</i>
  <j opposite="c,e,x">jape,juvenescent,jove,jolly</j>
  <k opposite="l,w,v">kinetosis,keratin,knack,kudos</k>
  <l opposite="b,d,g">lactate,lord,limaceous,launder</l>
  <m opposite="v,i,f">malaria,mere,morbid,murcid</m>
  <n opposite="h,r,v">name,nemesis,noon,nuncheon</n>
  <o opposite="b,n,j">orarian,opiate,opossum,oculars</o>
  <p opposite="n,m,d">pharmacist,phylogeny,pelt,puny</p>
  <q opposite="d,h,f">query,quack,quick,quisquous</q>
  <r opposite="c,f,x">random,renitency,roinous,run</r>
  <s opposite="b,y,d">sand,searing,sicarian,solemn,</s>
  <t opposite="l,m,f">tart,treating,thunder,thyroid</t>
  <u opposite="f,g,j">unasinous,unit,ulcer,unthinkable</u>
  <v opposite="c,k,m">version,visceral,vortex,vulnerable</v>
  <w opposite="d,k,n">wand,weasiness,whimsical,wolf</w>
  <x opposite="m,l,p">xanthopsia,xanthax,xylophone,xray</x>
  <y opposite="s,j,d">yellow,york,yuck,ylem</y>
  <z opposite="m,n,g">zamboni,zip,zoology,zugzwang </z>
</list>

解析コード:

    private Dictionary<string, List<string>> opposites;
    private Dictionary<string, List<string>> words = new Dictionary<string, List<string>>();

    private void StartSpeechRecognition(Media_Slide slide)
    {
        if (opposites == null)
        {
            opposites = new Dictionary<string, List<string>>();
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            string file = System.IO.Path.GetDirectoryName(Assembly.GetAssembly(typeof(MainWindow)).CodeBase).Remove(0, 6) + "\\buzzlist.xml";
            doc.Load(file);
            foreach (System.Xml.XmlNode node in doc.ChildNodes[1].ChildNodes)
            {
                opposites.Add(node.Name, new List<string>(node.Attributes[0].InnerText.Split(',')));
                words.Add(node.Name, new List<string>(node.InnerText.Split(',')));
            }
        }

        speechSlide = slide;
        rec = new SpeechRecognitionEngine();
        rec.SpeechRecognized += rec_SpeechRecognized;
        rec.SetInputToDefaultAudioDevice();
        try
        {
            rec.LoadGrammar(GetGrammar());
            rec.RecognizeAsync(RecognizeMode.Multiple);
        }
        catch
        {
        }
    }

コードの確認:

void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        if (e.Result.Text == speechSlide.Scenes[speechSlide.currentslide].speechCue)
        {
            rec.UnloadAllGrammars();
            ScreenSettings.NextSlide(speechSlide);
            try
            {
                rec.LoadGrammar(GetGrammar());
            }
            catch
            {
                rec.RecognizeAsyncCancel();
            }
        }
    }
于 2012-06-22T20:03:16.247 に答える