jump to navigation

Dica: Usando reconhecimento de voz no Vista sem conflitar com o sistema operacional 27/12/07

 

Fala pessoal!

Hoje eu estava brincando um pouco com o Vista, e resolvi fuçar para ver se eu conseguia resolver um velho problema de todos os desenvolvedores de voz no Vista: quando você usa algum comando que conflita com o Windows Vista (ex. "close", ou "start"), o Windows sempre ganha, e a aplicação não executa o que você quer. E então, eu descobri a salvação: substitua o SpeechRecognizer por um SpeechRecognitionEngine!

Para demonstrar a dica, vou fazer um pequeno programa WPF. Crie um novo projeto WPF Windows, adicione referência para o namespace System.Speech (Project > Add Reference… > aba .NET), e adicione na janela principal um TextBlock:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <TextBlock x:Name="resultado" Text="Nada, ainda"/>
    </Grid>
</Window>

No código C#, adicione uma referência (using) para System.Speech.Recognition, e crie o SpeechRecognizer como sempre. Neste exemplo, vou usar palavras que conflitam com  Vista, como "startmenu" e "close":

public partial class Window1
{
    public Window1()
    {
        InitializeComponent();
        Loaded += Window1_Loaded;
    }
    protected object grammarLock = new object();

    void Window1_Loaded(object sender, RoutedEventArgs e)
    {
        SpeechRecognizer _recognizer = new SpeechRecognizer();
        _recognizer.SpeechRecognized += _recognizer_SpeechRecognized;

        lock (grammarLock)
        {
            _recognizer.UnloadAllGrammars();
            _recognizer.LoadGrammar(new Grammar(new GrammarBuilder(new Choices("start menu", "close"))));
         }
    }

    void _recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        resultado.Text = e.Result.Text;
    }
}

Rode a aplicação e tente falar "close", ou "start menu". O Vista vai pegar a prioridade sobre o comando, e sua janela irá fechar, ou o menu iniciar vai abrir. Como resolver isso? Você terá que trocar o SpeechRecognizer criado com a engine do Vista por um SpeechRecognitionEngine. Veja as mudanças:

void Window1_Loaded(object sender, RoutedEventArgs e)
{
    SpeechRecognitionEngine _recognizer = new SpeechRecognitionEngine(); // mudei para SpeechRecognitionEngine
    _recognizer.SpeechRecognized += _recognizer_SpeechRecognized;
    _recognizer.SetInputToDefaultAudioDevice(); // adicionei essa linha para dizer que o som vem do microfone

    lock (grammarLock)
    {
        _recognizer.UnloadAllGrammars();
        _recognizer.LoadGrammar(new Grammar(new GrammarBuilder(new Choices("start menu", "close"))));
    }
    _recognizer.RecognizeAsync(RecognizeMode.Multiple); // adicionei essa linha ativar o reconhecimento
 }

E pronto! Após essas mudanças, rode a aplicação e veja o resultado: quando você falar "close" e "start menu", eles aparecerão escritos na janela!

Problema resolvido! O único detalhe que você tem que ficar atento é que você perde a interface do Vista para voz, então fique de olho para fazer a sua interface ’substitutiva’ para manter uma experiência intuitiva para o usuário.

Você pode baixar o código dessa dica clicando no link abaixo:

Código-fonte da dica

Abraço!

Roberto

Categories: .net, Dicas, WPF  

Comments»

1. mauro - 3/1/08

Boa noite uso C# vs 2003 e tenho um problema que indica que o agente não está escutando. como resolver para dar açoes ao agente?
desde já agradeço
mauro

2. Felipe - 16/1/08

sonnino qual versao do Speech SDK que voce esta usando e onde posso encontra-lo?
Obrigado e parabéns!

3. Roberto Sonnino - 16/1/08

Felipe,

No Vista em inglês, o Speech (SAPI 5.3) já está incluso. No Vista em português, não é possível usar (nem instalar) Speech. No XP, baixe o SAPI 5.1 em http://www.microsoft.com/downloads/details.aspx?FamilyID=5e86ec97-40a7-453f-b0ee-6583171b4530&displaylang=en

Abraço,

Roberto

4. Guilherme silva - 25/2/08

como instalo esse negoço
baixei o codigo fonte e agora o que faço?????

5. Carlos - 20/2/09

Opa, blz ..
Está dando um erro no momento em que rodo a aplicação..
na linha
SetInputToDefaultAudioDevice();
Erro:
“Nenhum reconhecedor instalado.”
Me ajuda por favor…
valeu

6. Roberto Sonnino - 20/2/09

Carlos,

O reconhecimento de voz só funciona no Vista em inglês ou XP com SAPI 5.1, e não no Vista em português. Veja a resposta para o Felipe acima para o link do XP.

Abraço!

Roberto

7. Felipe Carnevali - 21/9/09

Gente se caso alguem quiser a versao SAPI em portugues tera que instalar a versao 4.. Vc instalara a Raquel nesse link.. http://www.megaupload.com/pt/?d=O122HOFQ
Para utlizar o SAPI.SPVoice que é da API do windows é so trabalhar com um OleVariant.
Irei passar um exemplo em Delphi 7

var
Voz: CreateOleVariant;
begin
Voz := CreateOleVariant(‘SAPI.SpVoice’);
Voz.Speak(‘Esse é o texto que será falado com a voz de Raquel’);
end;

Obs: Não esquece de instalar o pacote que voce puxará no link que eu passei acima.. è bem simples, é so dar next, next e ja conclui..

Obrigado a todos e espere ter ajudado

Felipe Carnevali

8. Nildo' - 5/10/09

legal só que eu to buscando eu falar o o programa executar uma tarefa.
pode me ajuda? sou novo na ambiete

9. Virtual Dreams » Speech Recognition Engine in Portuguese (Brazil and Portugal) - 6/12/09

[...] my original posts about speech recognition, I’ve been getting lots of questions about speech in other languages, especially Portuguese. At [...]

10. Ilki Kitamura - 7/4/10

Boa tarde.
Estou analisando a possibilidade de desenvolver um software para interpretar comando de voz e executar determinados comandos.
Eu queria um ajuda para escolher a melhor linguagem para desenvolver esse software e saber se existe algo semelhante disponível para ser usado como referencia.
Obrigado.

11. Roberto Sonnino - 14/4/10

Ola Ilki,

Na minha opinião o jeito mais fácil de fazer isso é usar as APIs do .net do Windows Vista e Windows 7. A linguagem que eu recomendo é C#, que é a linguagem mais popular da plataforma .NET (mas você pode usar também VB.net, F#…).
O código-fonte desse post é um bom exemplo simples de reconhecimento de comandos com .NET. Se estiver precisando de mais alguma dica é só perguntar.