none
Comando de Voz C# RRS feed

  • Pergunta

  • Galera

    Quero desenvolver um programa que tenha comandos de voz Basico. Por exemplo: eu queria que quando a pessoa falasse " botao" o botão do meu forme fosse precionado.


    Porque com isso eu consigo pegar a logica da coisa,(que não faço a mínima ideia de como seja). queria uma ajuda pra isso, alguma dica, sei lá. Pois não faço ideia, pq nunca mexi com comando de voz.

    Já me dicerram que o c# tem uma ferramenta que faz isso, mas é só em ingles...
    Mas veja o que esse cara desenvolveu


    Veja nos comentarios em baixo que ele diz quais foram as ferramentas usadas.

    "O reconhecimento de fala é uma Engine da Microsoft chamada Speech Recognition"

    Mas esse sistema é totalmente portugues! ( Claro que nao quero fazer algo parecido, é bem mais simples)
    Queria um help. se alguem pudesse me ajudar agradeceria MUIIITOO

    Desde já Obrigado
    • Movido Rogerio Jerez segunda-feira, 29 de março de 2010 15:58 Movido para o Forum apropriado. (De:Onde devo postar minha dúvida?)
    quinta-feira, 18 de março de 2010 16:55

Respostas

  • Yuri,

    Eu gravei um vídeo para o Portal de Vídeos .Net do Linha de Código justamente sobre Speech Sinthesizer e Recognition... Você tem a assinatura desse portal?

    Se não, eu vou procurar ele aqui no meu computador e sumarizo o que eu fiz aqui pra você (já que eu não posso passar o vídeo, que é exclusivo do Linha de Código)...

    Caso você tenha a assinatura desse portal, o vídeo é o seguinte:

    Criando um menu com Speech Synthesizer e Recognition
    Autor: André Alves de Lima
    Data publicação: 13/06/2007


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Marcado como Resposta Yuri Mendonça quarta-feira, 24 de março de 2010 16:28
    sábado, 20 de março de 2010 22:04
    Moderador
  • Yuri,

    Bom, de qualquer forma, recomendo a assinatura desses vídeos... Tem muito conteúdo por lá, viu...

    Enfim, faz tempo que gravei esse vídeo, mas, pelo que me lembro (dos slides que eu tenho salvos aqui), para fazer o reconhecimento de fala você precisa:

    - Referenciar System.Speech
    - Adicionar referência ao namespace System.Speech.Recognition
    - Criar uma instância da classe GrammarBuilder
    - Criar a gramática desejada
    - Adicionar a gramática criada a uma instância da classe SpeechRecognizer
    - Criar um Event Handler para o evento SpeechRecognize desse objeto SpeechRecognizer

    Vou postar o código aqui que eu utilizei no vídeo... (lembre-se que é WPF com C#):

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
    using System.Speech.Synthesis;
    //using System.Speech.Recognition;
    using SpeechLib;
    
    namespace WindowsApplicationSpeech
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
    
        public partial class Window1 : System.Windows.Window
        {
            private SpeechSynthesizer _synth = new SpeechSynthesizer();
            //private SpeechRecognizer _rec = new SpeechRecognizer();
            private const int grammarId = 10;
            private String PreCommandString = "click";
            private SpeechLib.SpSharedRecoContext objRecoContext;
            private SpeechLib.ISpeechRecoGrammar grammar;
            private SpeechLib.ISpeechGrammarRule ruleTopLevel;
            private SpeechLib.ISpeechGrammarRule ruleListItems;
    
            private void InitializeSpeech()
            {
                objRecoContext = new SpeechLib.SpSharedRecoContext();
                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);
    
                // Adicionando as palavras desejadas à gramática:
                ruleListItems.Clear();
                string word = "file";
                PropValue = "";
                int i = 1;
                ruleListItems.InitialState.AddWordTransition(null, word,
                                        " ", SpeechGrammarWordType.SGLexical, word, i, ref PropValue, 1F);
    
                word = "open";
                PropValue = "";
                i = 2;
                ruleListItems.InitialState.AddWordTransition(null, word,
                                        " ", SpeechGrammarWordType.SGLexical, word, i, ref PropValue, 1F);
    
                word = "save";
                PropValue = "";
                i = 3;
                ruleListItems.InitialState.AddWordTransition(null, word,
                                        " ", SpeechGrammarWordType.SGLexical, word, i, ref PropValue, 1F);
    
                word = "close";
                PropValue = "";
                i = 4;
                ruleListItems.InitialState.AddWordTransition(null, word,
                                        " ", SpeechGrammarWordType.SGLexical, word, i, ref PropValue, 1F);
    
                grammar.Rules.Commit();
                grammar.CmdSetRuleState("TopLevelRule", SpeechRuleState.SGDSActive);
            }
    
            public void RecoContext_Recognition(int StreamNumber, object StreamPosition, SpeechRecognitionType RecognitionType, ISpeechRecoResult Result)
            {
                ISpeechPhraseProperty oItem;
    
                oItem = Result.PhraseInfo.Properties.Item(0).Children.Item(0);
                if ((System.Decimal)Result.PhraseInfo.GrammarId == grammarId)
                {
                    if (oItem.Name.Equals("file"))
                    {
                        menu1_file.IsSubmenuOpen = true;
                        menu1_file.Focus();
                    }
                    else if (oItem.Name.Equals("open"))
                    {
                        menu1_file_open_Click(this, new RoutedEventArgs());
                        menu1_file.IsSubmenuOpen = false;
                    }
                    else if (oItem.Name.Equals("save"))
                    {
                        menu1_file_save_Click(this, new RoutedEventArgs());
                        menu1_file.IsSubmenuOpen = false;
                    }
                    else if (oItem.Name.Equals("close"))
                    {
                        menu1_file_close_Click(this, new RoutedEventArgs());
                        menu1_file.IsSubmenuOpen = false;
                    }
                }
            }
    
            public Window1()
            {
                InitializeComponent();
                InitializeSpeech();
                //GrammarBuilder _gbuilder = new GrammarBuilder(new Choices("file", "open", "save", "close"));
                //Grammar _grammar = new Grammar(_gbuilder);
                //_rec.LoadGrammar(_grammar);
                //_rec.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(_rec_SpeechRecognized);
            }
    
            //void _rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            //{
            //    string _textoReconhecido = e.Result.Text;
            //    switch (_textoReconhecido)
            //    {
            //        case "file":
            //            menu1_file.IsSubmenuOpen = true;
            //            menu1_file.Focus();
            //            break;
            //        case "open":
            //            menu1_file_open_Click(this, new RoutedEventArgs());
            //            menu1_file.IsSubmenuOpen = false;
            //            break;
            //        case "save":
            //            menu1_file_save_Click(this, new RoutedEventArgs());
            //            menu1_file.IsSubmenuOpen = false;
            //            break;
            //        case "close":
            //            menu1_file_close_Click(this, new RoutedEventArgs());
            //            menu1_file.IsSubmenuOpen = false;
            //            break;
            //    }
            //}
    
            public void menu1_file_open_Click(object sender, RoutedEventArgs e)
            {
                _synth.Speak("You clicked the item OPEN of the menu FILE");
            }
            public void menu1_file_save_Click(object sender, RoutedEventArgs e)
            {
                _synth.Speak("You clicked the item SAVE of the menu FILE");
            }
            public void menu1_file_close_Click(object sender, RoutedEventArgs e)
            {
                _synth.Speak("You clicked the item CLOSE of the menu FILE");
                System.Threading.Thread.Sleep(500);
                _synth.Speak("Goodbye! See you later!");
                this.Close();
            }
        }
    }
    

    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Marcado como Resposta Yuri Mendonça quarta-feira, 24 de março de 2010 16:27
    segunda-feira, 22 de março de 2010 21:55
    Moderador

Todas as Respostas

  • quinta-feira, 18 de março de 2010 20:23
    Moderador
  • Andre,

    O que o programinha que vem com o source faz?

    Me ajudou bastante, muito obrigado, mais eu precisava em portugues, como mostrado no video do link que passei.

    Não consegui achar nenhum tutorial ou algum tipo de aula na internet sobre o assunto.

    Desde já agradeço

    sábado, 20 de março de 2010 03:14
  • Yuri,

    Eu gravei um vídeo para o Portal de Vídeos .Net do Linha de Código justamente sobre Speech Sinthesizer e Recognition... Você tem a assinatura desse portal?

    Se não, eu vou procurar ele aqui no meu computador e sumarizo o que eu fiz aqui pra você (já que eu não posso passar o vídeo, que é exclusivo do Linha de Código)...

    Caso você tenha a assinatura desse portal, o vídeo é o seguinte:

    Criando um menu com Speech Synthesizer e Recognition
    Autor: André Alves de Lima
    Data publicação: 13/06/2007


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Marcado como Resposta Yuri Mendonça quarta-feira, 24 de março de 2010 16:28
    sábado, 20 de março de 2010 22:04
    Moderador
  • Andre, eu não tenho assinatura nesse site não.

    Se você puder me ajudar eu agradeço muito mesmo.

    Obrigado.

    E parabens pelo site, muito legal.

    sábado, 20 de março de 2010 23:43
  • Yuri,

    Bom, de qualquer forma, recomendo a assinatura desses vídeos... Tem muito conteúdo por lá, viu...

    Enfim, faz tempo que gravei esse vídeo, mas, pelo que me lembro (dos slides que eu tenho salvos aqui), para fazer o reconhecimento de fala você precisa:

    - Referenciar System.Speech
    - Adicionar referência ao namespace System.Speech.Recognition
    - Criar uma instância da classe GrammarBuilder
    - Criar a gramática desejada
    - Adicionar a gramática criada a uma instância da classe SpeechRecognizer
    - Criar um Event Handler para o evento SpeechRecognize desse objeto SpeechRecognizer

    Vou postar o código aqui que eu utilizei no vídeo... (lembre-se que é WPF com C#):

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
    using System.Speech.Synthesis;
    //using System.Speech.Recognition;
    using SpeechLib;
    
    namespace WindowsApplicationSpeech
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
    
        public partial class Window1 : System.Windows.Window
        {
            private SpeechSynthesizer _synth = new SpeechSynthesizer();
            //private SpeechRecognizer _rec = new SpeechRecognizer();
            private const int grammarId = 10;
            private String PreCommandString = "click";
            private SpeechLib.SpSharedRecoContext objRecoContext;
            private SpeechLib.ISpeechRecoGrammar grammar;
            private SpeechLib.ISpeechGrammarRule ruleTopLevel;
            private SpeechLib.ISpeechGrammarRule ruleListItems;
    
            private void InitializeSpeech()
            {
                objRecoContext = new SpeechLib.SpSharedRecoContext();
                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);
    
                // Adicionando as palavras desejadas à gramática:
                ruleListItems.Clear();
                string word = "file";
                PropValue = "";
                int i = 1;
                ruleListItems.InitialState.AddWordTransition(null, word,
                                        " ", SpeechGrammarWordType.SGLexical, word, i, ref PropValue, 1F);
    
                word = "open";
                PropValue = "";
                i = 2;
                ruleListItems.InitialState.AddWordTransition(null, word,
                                        " ", SpeechGrammarWordType.SGLexical, word, i, ref PropValue, 1F);
    
                word = "save";
                PropValue = "";
                i = 3;
                ruleListItems.InitialState.AddWordTransition(null, word,
                                        " ", SpeechGrammarWordType.SGLexical, word, i, ref PropValue, 1F);
    
                word = "close";
                PropValue = "";
                i = 4;
                ruleListItems.InitialState.AddWordTransition(null, word,
                                        " ", SpeechGrammarWordType.SGLexical, word, i, ref PropValue, 1F);
    
                grammar.Rules.Commit();
                grammar.CmdSetRuleState("TopLevelRule", SpeechRuleState.SGDSActive);
            }
    
            public void RecoContext_Recognition(int StreamNumber, object StreamPosition, SpeechRecognitionType RecognitionType, ISpeechRecoResult Result)
            {
                ISpeechPhraseProperty oItem;
    
                oItem = Result.PhraseInfo.Properties.Item(0).Children.Item(0);
                if ((System.Decimal)Result.PhraseInfo.GrammarId == grammarId)
                {
                    if (oItem.Name.Equals("file"))
                    {
                        menu1_file.IsSubmenuOpen = true;
                        menu1_file.Focus();
                    }
                    else if (oItem.Name.Equals("open"))
                    {
                        menu1_file_open_Click(this, new RoutedEventArgs());
                        menu1_file.IsSubmenuOpen = false;
                    }
                    else if (oItem.Name.Equals("save"))
                    {
                        menu1_file_save_Click(this, new RoutedEventArgs());
                        menu1_file.IsSubmenuOpen = false;
                    }
                    else if (oItem.Name.Equals("close"))
                    {
                        menu1_file_close_Click(this, new RoutedEventArgs());
                        menu1_file.IsSubmenuOpen = false;
                    }
                }
            }
    
            public Window1()
            {
                InitializeComponent();
                InitializeSpeech();
                //GrammarBuilder _gbuilder = new GrammarBuilder(new Choices("file", "open", "save", "close"));
                //Grammar _grammar = new Grammar(_gbuilder);
                //_rec.LoadGrammar(_grammar);
                //_rec.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(_rec_SpeechRecognized);
            }
    
            //void _rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            //{
            //    string _textoReconhecido = e.Result.Text;
            //    switch (_textoReconhecido)
            //    {
            //        case "file":
            //            menu1_file.IsSubmenuOpen = true;
            //            menu1_file.Focus();
            //            break;
            //        case "open":
            //            menu1_file_open_Click(this, new RoutedEventArgs());
            //            menu1_file.IsSubmenuOpen = false;
            //            break;
            //        case "save":
            //            menu1_file_save_Click(this, new RoutedEventArgs());
            //            menu1_file.IsSubmenuOpen = false;
            //            break;
            //        case "close":
            //            menu1_file_close_Click(this, new RoutedEventArgs());
            //            menu1_file.IsSubmenuOpen = false;
            //            break;
            //    }
            //}
    
            public void menu1_file_open_Click(object sender, RoutedEventArgs e)
            {
                _synth.Speak("You clicked the item OPEN of the menu FILE");
            }
            public void menu1_file_save_Click(object sender, RoutedEventArgs e)
            {
                _synth.Speak("You clicked the item SAVE of the menu FILE");
            }
            public void menu1_file_close_Click(object sender, RoutedEventArgs e)
            {
                _synth.Speak("You clicked the item CLOSE of the menu FILE");
                System.Threading.Thread.Sleep(500);
                _synth.Speak("Goodbye! See you later!");
                this.Close();
            }
        }
    }
    

    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Marcado como Resposta Yuri Mendonça quarta-feira, 24 de março de 2010 16:27
    segunda-feira, 22 de março de 2010 21:55
    Moderador
  • Veja este outro artigo sobre o mesmo assunto:

    http://www.redmondpie.com/speech-recognition-in-a-c-wpf-application/


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    segunda-feira, 22 de março de 2010 21:56
    Moderador
  • Esse código que você coloco ai em cima; A pessoa tem que falar em Inglês para que funcione certo?!

    Mas você viu o link do video que eu postei la em cima? é esse: http://www.youtube.com/watch?v=ZL2kznKJEXQ

    Aqui o cara fala tudo em portugues, o reconhecimento de fala é a Engine da Microsoft, Speech Recognition, e o programa foi desenvolvido em C# Visual Studio 2008. Ai que ta a jogada que eu quero entende. Porque tudo que eu achei na net até hoje foi reconhecimento de voz em inglês.
    Eu só preciso que eu fale pro meu programa: "A" e ele digite (a). Mais tem que ser em portugues.
    Muito Obrigado por postar aqui o codigo, vou estudar bastante.
    Já vou assinar um ano com Linha de código pra ter acessos aos videos. Mais o problema é que, você compra, e tem que espera chegar em casa né, achei que eles mandavam só o usuario e senha.

    Muito obrigado por me ajudar.

    terça-feira, 23 de março de 2010 01:10
  • Yuri,

    Pelo que eu entendi, basta você ter o language pack do idioma que você quer instalado e ativado que o Speech Recognition da Microsoft vai utilizá-lo para fazer o reconhecimento...

    Claro que o idioma tem que ser compatível com o Speech Recognition (que é o caso do português de Portugal... não sei se o pt-br é compatível)...


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    terça-feira, 23 de março de 2010 12:07
    Moderador
  • Ola André, tudo bem?

    eu vou desenvolver uma aplicação por comando de voz(o que a gente fala, a aplicação executa, e lhe da o retorno por voz tambem). Esse artico que vc publicou no videos.net, funciona dessa forma?

    muito obrigado 



    Ricardo Soares

    quinta-feira, 23 de agosto de 2012 14:04