none
Como faço para fazer o meu software responder a comandos de voz?

    Question

  •  

    Olá! a todos.

     

    Como faço para fazer o meu software responder a comandos de voz?

     

       Essa é uma pergunta meus caros desenvolvedores que não mais ficará sem uma resposta simples.

       Quero antes de mais nada agradecer a todos os integrantes desta comunidade que sempre foram solidários uns aos outros, e que apenas obtendo informações direta dos artigos publicados aqui, eu comecei a escrever em CSharp fazem hoje extamente 14 dias e queiram vocês acreditarem ou não, o primeiro aplicativo que criei na linguagem é exatamente o código a seguir:

     

       Antes de mais nada é necessário obter as informações sobre as ferramentas que iremos utilizar.

     

       Microsoft  Speech SDK 5.1

       Visual C# .Net (2008)

      .Net Framework 3.5  <<<<< Não testei em plataformas inferiores provavelmente suportará até 2.0 façam os teste>>>>

     

       Depois dessa enorme lista vamos ao que interessa:

     

     1º)  Incie um novo projeto em FILE >> NEW >> PROJECT

           Crie um novo WindosFormsApplication

      

      2º) Clique em Solution Explorer

           Com o botão direito do mouse clique sobre o nome do aplicativo em seguida ADD >> NEW ITEM

     

      3º) Escolha no Menu a opção Component Class e de o nome ao novo componente de  SAPI_ListBox.cs 

     

      4º) Depois de Instalado o Microsoft Speech SDK 5.1, adicione a referência MICROSOFT SPEECH OBJECT LIBRARY 5.0   na aba COM

     

      5) Agora no Solution Explorer clique com o botão direito sobre SAPI_ListBox.cs o componente que criamos e escolha a opção VIEW CODE e adicione o código a seguir:

     

     

    Wednesday, July 23, 2008 5:08 AM

Answers

  • Bom agora que o nosso código está pronto vá até opção Build e de um Rebuild Solution

     

    Volte até o Solution Explorer e abra o FORM1 em mode DESIGNER clique na Toolbox preste atenção na primeir aba da Toolboox irá aparecer com o nome do aplicativo em seguida Components e lá está a nossa SAPI_List.cs

     

    adiocione a SAPI_ListBox.cs ao Form como se fosse utilizar uma ListBox comum

     

    Clique com o botão direito do mouse sobre a ListBox que é criada no Form e vá até Propriedades

     

    altere as opções:

     

    Modifiers           = Public

    SpeechEnabled = True

     

     

    No Evento Load do Formulário adiocione o código

     

    private void Form1_Load(object sender, EventArgs e)

    {

    SpeechListBox1.RebuildGrammar();

    }

     

     

    Clique em DEBUG e ....

     

    somente diga INTERNET...

     

    VALEU ???

     

    e Ah!  para os mais desatentos é necessário ter um microfone funcionando para esse exemplo ter validade...

     

     

    Wednesday, July 23, 2008 6:06 AM
  • namespace SAPI_ListBox

    {

    using System;

    using System.Collections;

    using System.ComponentModel;

    using System.Drawing;

    using System.Data;

    using System.Windows.Forms;

    using System.Diagnostics;

    using SpeechLib;

    public class SpeechListBox : System.Windows.Forms.ListBox

    {

    private const int grammarId = 10;

    private bool speechEnabled = false;

    private bool speechInitialized = false;

    private String PreCommandString = "";

    private SpeechLib.SpSharedRecoContext objRecoContext;

    private SpeechLib.ISpeechRecoGrammar grammar;

    private SpeechLib.ISpeechGrammarRule ruleTopLevel;

    private SpeechLib.ISpeechGrammarRule ruleListItems;

    private System.Diagnostics.Process p = new System.Diagnostics.Process();

    private String ANS_ROCK = "Internet";

    public bool SpeechEnabled

    {

    get

    {

    return speechEnabled;

    }

    set

    {

    if( speechEnabled != value )

    {

    speechEnabled = value ;

    if(this.DesignMode) return;

    if (speechEnabled)

    {

    EnableSpeech();

    }

    else

    {

    DisableSpeech();

    }

    }

    }

    }

    public void RecoContext_Hypothesis(int StreamNumber,

    object StreamPosition,

    ISpeechRecoResult Result)

    {

    Debug.WriteLine("Hypothesis: " +

    Result.PhraseInfo.GetText(0, -1, true) + ", " +

    StreamNumber + ", " + StreamPosition);

    }

    public void RecoContext_Recognition(int StreamNumber,

    object StreamPosition,

    SpeechRecognitionType RecognitionType,

    ISpeechRecoResult Result)

    {

    Debug.WriteLine("Recognition: " +

    Result.PhraseInfo.GetText(0, -1, true) + ", " +

    StreamNumber + ", " + StreamPosition);

    int index;

    ISpeechPhraseProperty oItem;

    oItem = Result.PhraseInfo.Properties.Item(0).Children.Item(0);

    index = oItem.Id;

    if ((System.Decimal)Result.PhraseInfo.GrammarId == grammarId)

    {

    if (oItem.Name.CompareTo(ANS_ROCK) == 0)

    {

    MessageBox.Show("Sim Mestre...seu desejo é uma ordem");

    String diret = System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);

    String Pat = System.IO.Path.Combine(diret, @"Internet Explorer\IExplore.exe");

    p.StartInfo.FileName = Pat;

    p.Start();

    Application.DoEvents();

    }

    else

    {

    MessageBox.Show(oItem.Name);

    }

    }

    }

     

    private void InitializeSpeech()

    {

    Debug.WriteLine("Initializing SAPI objects...");

    try

    {

    objRecoContext = new SpeechLib.SpSharedRecoContext();

     

    objRecoContext.Hypothesis += new

    _ISpeechRecoContextEvents_HypothesisEventHandler(

    RecoContext_Hypothesis);

    objRecoContext.Recognition += new

    _ISpeechRecoContextEvents_RecognitionEventHandler(

    RecoContext_Recognition);

    grammar = objRecoContext.CreateGrammar(grammarId);

    ruleTopLevel = grammar.Rules.Add("TopLevelRule",

    SpeechRuleAttributes.SRATopLevel | SpeechRuleAttributes.SRADynamic, 1);

    ruleListItems = grammar.Rules.Add("ListItemsRule",

    SpeechRuleAttributes.SRADynamic, 2);

    SpeechLib.ISpeechGrammarRuleState stateAfterSelect;

    stateAfterSelect = ruleTopLevel.AddState();

    object PropValue = "";

    ruleTopLevel.InitialState.AddWordTransition(stateAfterSelect,

    PreCommandString, " ", SpeechGrammarWordType.SGLexical,

    "", 0, ref PropValue, 1.0F );

    PropValue = "";

    stateAfterSelect.AddRuleTransition(null, ruleListItems, "",

    1, ref PropValue, 0F);

    RebuildGrammar();

     

    grammar.CmdSetRuleState("TopLevelRule", SpeechRuleState.SGDSActive);

    speechInitialized = true;

    }

    catch(Exception e)

    {

    System.Windows.Forms.MessageBox.Show(

    "Exception caught when initializing SAPI."

    + " This application may not run correctly.\r\n\r\n"

    + e.ToString(),

    "Error");

    }

    }

     

    private bool EnableSpeech()

    {

    Debug.Assert(speechEnabled, "speechEnabled must be true in EnableSpeech");

    if (this.DesignMode) return false;

    if (speechInitialized == false)

    {

    InitializeSpeech();

    }

    else

    {

    RebuildGrammar();

    }

    objRecoContext.State = SpeechRecoContextState.SRCS_Enabled;

    return true;

    }

     

    public bool RebuildGrammar()

    {

    if( !speechEnabled || this.DesignMode )

    {

    return false;

    }

    object propValue = "";

    try

    {

    ruleListItems.Clear();

    ruleListItems.InitialState.AddWordTransition(null, ANS_ROCK,

    " ", SpeechGrammarWordType.SGLexical, ANS_ROCK, 0, ref propValue, 1F);

    grammar.Rules.Commit();

    }

    catch(Exception e)

    {

    System.Windows.Forms.MessageBox.Show(

    "Exception caught when rebuilding dynamic listbox rule.\r\n\r\n"

    + e.ToString(),

    "Error");

    }

    return true;

    }

     

    private bool DisableSpeech()

    {

    if (this.DesignMode) return false;

    Debug.Assert(speechInitialized,

    "speech must be initialized in DisableSpeech");

    if( speechInitialized )

    {

    objRecoContext.State = SpeechRecoContextState.SRCS_Disabled;

    }

    return true;

    }

    }

    }

    Wednesday, July 23, 2008 5:36 AM
  • Oi ANS:

     

    Eu estou também mergulhando no reconhecimento de Voz mas infelizmente não sei o suficiente de Visual C++ pois desde há alguns anos que me tenho dedicado ao Visual Basic, neste momento estou com Visual Basic 2008, mas não tenho problemas coma versão desde a 1.0 até ao 2008.

     

    Quando V. tiver novidades sobre o seu modulo nesta lingua me diga por favor.

     

    Um abração

     

    rui

     

    Friday, December 19, 2008 5:53 PM

All replies

  • namespace SAPI_ListBox

    {

    using System;

    using System.Collections;

    using System.ComponentModel;

    using System.Drawing;

    using System.Data;

    using System.Windows.Forms;

    using System.Diagnostics;

    using SpeechLib;

    public class SpeechListBox : System.Windows.Forms.ListBox

    {

    private const int grammarId = 10;

    private bool speechEnabled = false;

    private bool speechInitialized = false;

    private String PreCommandString = "";

    private SpeechLib.SpSharedRecoContext objRecoContext;

    private SpeechLib.ISpeechRecoGrammar grammar;

    private SpeechLib.ISpeechGrammarRule ruleTopLevel;

    private SpeechLib.ISpeechGrammarRule ruleListItems;

    private System.Diagnostics.Process p = new System.Diagnostics.Process();

    private String ANS_ROCK = "Internet";

    public bool SpeechEnabled

    {

    get

    {

    return speechEnabled;

    }

    set

    {

    if( speechEnabled != value )

    {

    speechEnabled = value ;

    if(this.DesignMode) return;

    if (speechEnabled)

    {

    EnableSpeech();

    }

    else

    {

    DisableSpeech();

    }

    }

    }

    }

    public void RecoContext_Hypothesis(int StreamNumber,

    object StreamPosition,

    ISpeechRecoResult Result)

    {

    Debug.WriteLine("Hypothesis: " +

    Result.PhraseInfo.GetText(0, -1, true) + ", " +

    StreamNumber + ", " + StreamPosition);

    }

    public void RecoContext_Recognition(int StreamNumber,

    object StreamPosition,

    SpeechRecognitionType RecognitionType,

    ISpeechRecoResult Result)

    {

    Debug.WriteLine("Recognition: " +

    Result.PhraseInfo.GetText(0, -1, true) + ", " +

    StreamNumber + ", " + StreamPosition);

    int index;

    ISpeechPhraseProperty oItem;

    oItem = Result.PhraseInfo.Properties.Item(0).Children.Item(0);

    index = oItem.Id;

    if ((System.Decimal)Result.PhraseInfo.GrammarId == grammarId)

    {

    if (oItem.Name.CompareTo(ANS_ROCK) == 0)

    {

    MessageBox.Show("Sim Mestre...seu desejo é uma ordem");

    String diret = System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);

    String Pat = System.IO.Path.Combine(diret, @"Internet Explorer\IExplore.exe");

    p.StartInfo.FileName = Pat;

    p.Start();

    Application.DoEvents();

    }

    else

    {

    MessageBox.Show(oItem.Name);

    }

    }

    }

     

    private void InitializeSpeech()

    {

    Debug.WriteLine("Initializing SAPI objects...");

    try

    {

    objRecoContext = new SpeechLib.SpSharedRecoContext();

     

    objRecoContext.Hypothesis += new

    _ISpeechRecoContextEvents_HypothesisEventHandler(

    RecoContext_Hypothesis);

    objRecoContext.Recognition += new

    _ISpeechRecoContextEvents_RecognitionEventHandler(

    RecoContext_Recognition);

    grammar = objRecoContext.CreateGrammar(grammarId);

    ruleTopLevel = grammar.Rules.Add("TopLevelRule",

    SpeechRuleAttributes.SRATopLevel | SpeechRuleAttributes.SRADynamic, 1);

    ruleListItems = grammar.Rules.Add("ListItemsRule",

    SpeechRuleAttributes.SRADynamic, 2);

    SpeechLib.ISpeechGrammarRuleState stateAfterSelect;

    stateAfterSelect = ruleTopLevel.AddState();

    object PropValue = "";

    ruleTopLevel.InitialState.AddWordTransition(stateAfterSelect,

    PreCommandString, " ", SpeechGrammarWordType.SGLexical,

    "", 0, ref PropValue, 1.0F );

    PropValue = "";

    stateAfterSelect.AddRuleTransition(null, ruleListItems, "",

    1, ref PropValue, 0F);

    RebuildGrammar();

     

    grammar.CmdSetRuleState("TopLevelRule", SpeechRuleState.SGDSActive);

    speechInitialized = true;

    }

    catch(Exception e)

    {

    System.Windows.Forms.MessageBox.Show(

    "Exception caught when initializing SAPI."

    + " This application may not run correctly.\r\n\r\n"

    + e.ToString(),

    "Error");

    }

    }

     

    private bool EnableSpeech()

    {

    Debug.Assert(speechEnabled, "speechEnabled must be true in EnableSpeech");

    if (this.DesignMode) return false;

    if (speechInitialized == false)

    {

    InitializeSpeech();

    }

    else

    {

    RebuildGrammar();

    }

    objRecoContext.State = SpeechRecoContextState.SRCS_Enabled;

    return true;

    }

     

    public bool RebuildGrammar()

    {

    if( !speechEnabled || this.DesignMode )

    {

    return false;

    }

    object propValue = "";

    try

    {

    ruleListItems.Clear();

    ruleListItems.InitialState.AddWordTransition(null, ANS_ROCK,

    " ", SpeechGrammarWordType.SGLexical, ANS_ROCK, 0, ref propValue, 1F);

    grammar.Rules.Commit();

    }

    catch(Exception e)

    {

    System.Windows.Forms.MessageBox.Show(

    "Exception caught when rebuilding dynamic listbox rule.\r\n\r\n"

    + e.ToString(),

    "Error");

    }

    return true;

    }

     

    private bool DisableSpeech()

    {

    if (this.DesignMode) return false;

    Debug.Assert(speechInitialized,

    "speech must be initialized in DisableSpeech");

    if( speechInitialized )

    {

    objRecoContext.State = SpeechRecoContextState.SRCS_Disabled;

    }

    return true;

    }

    }

    }

    Wednesday, July 23, 2008 5:36 AM
  • Bom agora que o nosso código está pronto vá até opção Build e de um Rebuild Solution

     

    Volte até o Solution Explorer e abra o FORM1 em mode DESIGNER clique na Toolbox preste atenção na primeir aba da Toolboox irá aparecer com o nome do aplicativo em seguida Components e lá está a nossa SAPI_List.cs

     

    adiocione a SAPI_ListBox.cs ao Form como se fosse utilizar uma ListBox comum

     

    Clique com o botão direito do mouse sobre a ListBox que é criada no Form e vá até Propriedades

     

    altere as opções:

     

    Modifiers           = Public

    SpeechEnabled = True

     

     

    No Evento Load do Formulário adiocione o código

     

    private void Form1_Load(object sender, EventArgs e)

    {

    SpeechListBox1.RebuildGrammar();

    }

     

     

    Clique em DEBUG e ....

     

    somente diga INTERNET...

     

    VALEU ???

     

    e Ah!  para os mais desatentos é necessário ter um microfone funcionando para esse exemplo ter validade...

     

     

    Wednesday, July 23, 2008 6:06 AM
  •  

    Olá galera, quero agradecer a todas as pessoas que de certa forma aumentaram seus próprios conhecimentos através desse tópico e me enviaram suas sugestões e críticas e para não deixarmos de nos ajudar ainda mais em breve irei postar em breve o código desse exemplo em VB .Net

    até mais....

    Tuesday, November 04, 2008 12:11 AM
  • Oi ANS:

     

    Eu estou também mergulhando no reconhecimento de Voz mas infelizmente não sei o suficiente de Visual C++ pois desde há alguns anos que me tenho dedicado ao Visual Basic, neste momento estou com Visual Basic 2008, mas não tenho problemas coma versão desde a 1.0 até ao 2008.

     

    Quando V. tiver novidades sobre o seu modulo nesta lingua me diga por favor.

     

    Um abração

     

    rui

     

    Friday, December 19, 2008 5:53 PM
  •  

    Olá! ruimacdonald

     

    Bem: eu testei aqui mas não tive muiot êxito com  VB.Net os comandos funcionam muito mal e até travou a minha máquina algumas vezes.

     

    Conversando com alguns colegas acabei descobrindo que trabalhar com linguagens de alto nível como VB.Net não é uma boa opção para esse tipo de aplicação:

     

    Ao trabalhar com reconhecimento de voz em linguagens de alto nível não podemos diagnosticar com precisão os erros gerados pela aplicação ao utilizar os componentes de reconhecimento isso porque a plataforma .Net absorve o erro e esconde o mesmo de alguma forma e o processo acaba sendo incompleto e insatisfatório.

     

    Quer uma ótima dica:   aprenda uma, duas, três, quatros, 'N' linguagens diferentes.

    Porque nos tempos de hoje é essencial estarmos preparados para um mundo digital MULTI-PLATAFORMA e MULTI-ARQUITETURA isso será muito bom para você e caso você precise de algum auxílio pode perguntar, nós aqui do fórum estamos aqui para isso mesmo.

     

    Valeu!!!

    Monday, December 29, 2008 9:24 PM
  • Olá ANS, gostei muito do artigo pq é justamente o que eu estava procurando.
     
    Estou com um problem: baixei o SDK 5.1 e fui colocar a referência no projeto, mas não achei a dll na aba COM... procurei com a pesquisa do windows e nada, além disso, as ferramentas TTS que vem no SDK 5.1 nã o funcionam!

    Se alguém puder me ajudar, ficarei grato!
    Wednesday, December 23, 2009 2:04 PM
  • somente diga INTERNET...

     

    Olá ANS, primeiramente venho parabenizá-lo pelo ótimo tópico que aborda um assunto legal  de reconhecimento de voz, comigo funcionou direitinho!

    Só uma dúvida, é possível instalar algo para que reconheça a fala em português? Pois fiz alguns testes com outras palavras e verifiquei que funcinou apenas com palavras em inglês...

    Obrigado,
    Lex.


    Alexei
    Thursday, July 22, 2010 7:49 PM
  • olha o erro que da no meu oque é esse erro como posso resolvelo
    Uploaded with ImageShack.us essa imagem tambem
    Monday, December 27, 2010 5:30 AM
  • Pessoal, segui todos os passos, mas estou tendo o seguinte erro:

     

    Error 1 The type name 'SpeechListBox' does not exist in the type 'WindowsFormsApplication5.SAPI_ListBox' f:\meus documentos\visual studio 2010\Projects\WindowsFormsApplication5\WindowsFormsApplication5\Form1.Designer.cs 31 52 WindowsFormsApplication5

     

    Será que alguém pode me ajudar???

     

    Desde já agradeço.


    Caio
    Monday, July 11, 2011 3:26 PM
  • olha o erro que da no meu oque é esse erro como posso resolvelo
    Uploaded with ImageShack.us essa imagem tambem

    Estou com o mesmo erro se alguem puder dar uma dica ficarei grato.
    Monday, October 17, 2011 3:39 PM
  •  4º) Depois de Instalado o Microsoft Speech SDK 5.1, adicione a referência MICROSOFT SPEECH OBJECT LIBRARY 5.0   na aba COM

    ou

    Você instalou a versão errada do SDK 5.1...


    ANS


    • Edited by ANS ROCK Tuesday, July 03, 2012 3:12 AM
    Tuesday, July 03, 2012 3:10 AM
  • cara está dando erro aqui na hora de executar:

    Error 8 The type name 'SpeechListBox' does not exist in the type 'WindowsFormsApplication1.SAPI_ListBox' c:\users\antunes\documents\visual studio 2010\Projects\CadMembros\WindowsFormsApplication1\WindowsFormsApplication1\Form1.Designer.cs 33 52 WindowsFormsApplication1

     o que você acha que é?

    vlw

    Sunday, August 26, 2012 5:46 PM
  • Acho que você não inclui a SAPI_ListBox.cs ao Form ou não inclui as referências necessárias

    Ou também

    você alterou o nome da SAPI_ListBox.cs para qualquer outro nome e executou o código


    ANS


    • Edited by ANS ROCK Tuesday, October 16, 2012 2:33 PM
    Tuesday, October 16, 2012 2:32 PM