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:
Abraço!
Roberto
Categories: .net, Dicas, WPF
Comments»
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
sonnino qual versao do Speech SDK que voce esta usando e onde posso encontra-lo?
Obrigado e parabéns!
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
como instalo esse negoço
baixei o codigo fonte e agora o que faço?????
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
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
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
legal só que eu to buscando eu falar o o programa executar uma tarefa.
pode me ajuda? sou novo na ambiete
[...] my original posts about speech recognition, I’ve been getting lots of questions about speech in other languages, especially Portuguese. At [...]
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.
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.