2012-06-22 154 views
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; 
} 

我試圖提高門檻的信心,但是我還是得到太多的誤報。有沒有一種方法來提高語法?有些東西告訴我,在語法允許列表中只添加一個單詞是引發所有誤報的原因。

+0

而不是寫此F從頭開始,您可能想看看來自Microsoft的開源項目Mayhem [http://makemayhem.com/],它允許您使用觸發器或操作來連接事件。他們已經有了用於語音錄製的附加模塊和一個可以控制PowerPoint幻燈片的Office模塊。 –

+0

我會看看,謝謝你的幫助凱文。 –

回答

3

這裏是我想出了:

正如@邁克爾利維說,當你給它一個詞來聽電腦並沒有做太多的工作。它基本上只是監聽音頻電平何時達到某個值,然後假定它必須是該單詞。所以我決定,我必須給它與SOUND相反的其他詞語。現在我的目標不是花數週時間研究語音學,而是找出一個完美的算法來確定那些聽起來遠離我想匹配的單詞的單詞,所以我決定專注於第一個字母。下面是操作順序:

  1. 提取觸發字從XML文件進行操作的幻燈片
  2. 查找單詞
  3. 的第一個字母查找3個字母是最不像信的步驟發現聲音2
  4. 查找4個字的變長,音節計數,結束音,和第二個字母與每個在步驟中找到的三個字母的開始3
  5. Add找到所有12個字,在步驟4的選擇列表,以及沿觸發詞。現在有13個字。一個是我們找到的單詞,另外一個是12個單詞。因此,計算機將織補確保它是正確的之前觸發任何事件處理程序:)

我們判斷相反的字母,我發佈了一個問題here,但它得到了關閉之前,我得到任何有用的意見) :我不知道爲什麼,我查看了常見問題解答,看起來我是按照這裏描述的條款。我決定對我的家人和朋友進行投票,而我們的綜合智慧提出了一個對立的名單。每個字母都有三個字母,儘可能地讓它們遠離原始字母聲音。

最後一步是爲這些字母中的每一個查找單詞。我發現每個字母四個字,共104個字。我想要不同長度,第二個字母和結尾聲音的單詞,這樣我就可以覆蓋所有的基礎,儘可能「分散」計算機遠離目標單詞。我用這個University Vocab List想出了大話,用我小小的英語頭腦寫出了5個字母,最後我覺得我有一個很好的名單。我使用XML格式化它,添加解析代碼,並檢查結果.....好得多!幾乎太好了!沒有誤報,有些人的表達能力不好,將會很難使用我的程序!我將使它更容易一些,也許是通過去除分心詞的數量,但總體來說我還是很高興的結果,並讚賞@邁克爾·利維和@Kevin榮漢斯

代碼的建議:

<?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(); 
      } 
     } 
    } 
+0

我很高興這是爲你工作。我想知道,如果您嘗試添加簡單的垃圾單詞,而不是試圖從策略上選擇與您的目標單詞聽起來不同的垃圾單詞。識別器非常好,如果您的戰略性字詞選擇實際上比僅僅幾個隨機選擇的噪音字詞給出更好的結果,我會很好奇。 –

+0

說實話,我沒有,儘管這很有趣。我假設,僅僅從邏輯上來說,選擇性詞語選擇會更好,但是它是否會起作用_noticeably_ better是我想的真正問題。 –

2

識別器結果可能因許多因素而異。這些包括:背景噪音,麥克風質量以及音頻輸入設置和級別。嘗試一個帶有良好麥克風的安靜房間,看看你的結果是否更好。

你的一個單詞語法造成問題的理論可能是公平的。 (它讓我想起了一位老師在一次考試中提出了一個選擇題,只有一個選擇,然後當很多學生得到正確答案時感到驚訝)。你是否曾嘗試在文法中添加垃圾單詞作爲其他選擇,以便發動機不會僅僅默認唯一的選擇?嘗試類似:

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

並查看您的結果是否改善。

我知道在Windows 7中使用聽寫語法,您可以使用Windows 7語音識別功能來訓練識別器以更好地識別單個揚聲器。我不知道這是否可以幫助你使用固定的語法,正如你所描述的那樣。您可能想要通過培訓來了解結果是否有所改善。有關更多信息,請參閱http://windows.microsoft.com/en-US/windows7/Set-up-Speech-Recognition

+0

我不知道你爲什麼得到一票反對票......我給了你我的最高票數!我昨天晚上實施了這個,獲得了很多改進的結果!事實上,現在,除非你完美地表達,否則它不認識這個詞!我將發佈我的解決方案來解決問題,因爲它最終會成爲一個徹夜的努力,但我認爲我已經沿着您發佈的內容取得了一些進展,可以讓其他開發人員也遇到類似問題。 –

+2

downvotes沒有評論總是對我來說是一個謎。有時候,我認爲人們在發佈規則和網站風格上如此緊張,以至於他們寧願遵守規則,也不願意幫助某人。我的回答有點模糊,我不確定我的建議,所以我認爲保證投票。既然你沒有其他答案,我認爲一個模糊的建議可能比沉默更有幫助。 –