Esta semana me preguntaron como hacer una aplicación que me reconozca la voz y me escriba el resultado en este caso en un listBox. En este Post haremos una aplicación que me permita hablarle a la PC, y esta me escriba la palabra que le dicte. Y como algo extra que escriba un texto y sea capaz de leerlo.
Para este ejemplo hay que utilizar la librería; System.Speech con ella podremos realizar lo que nos proponemos hablar y que nos lea un texto, gracias a estos espacios de nombres System.Speech.Synthesis y System.Speech.Recognition. El primero me permitirá la inicialización y configuración del motor de síntesis de voz de Windows en esta caso me puede servir para mandar un mensaje de aviso o petición al usuario; el segundo me servirá para el reconocimiento de voz el cual me permitirá digitalizar las señales acústicas y recuperar las palabras.
Comenzaremos con el reconocimiento de voz y por ultimo el reconocimiento de texto:
Comenzaremos creando un proyecto, para este ejemplo usaremos un WPF y le pondremos ReconociminetoDeVoz:
En la ventana del WPF dibujaremos esto.
Solo hemos colocado un listbox y un botón, el XAML que da así:.
- <Window x:Class="ReconocimientoDeVoz.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="MainWindow" Height="350" Width="525">
- <Grid>
- <ListBox HorizontalAlignment="Left" Name="lbPalabra" Height="267"
- Margin="10,10,0,0" VerticalAlignment="Top" Width="497"/>
- <Button Content="Escuchar" Name="btEscuchar" HorizontalAlignment="Left"
- Margin="420,288,0,0" VerticalAlignment="Top" Width="75"
- Click="btEscuchar_Click"/>
- </Grid>
- </Window>
Ahora tendremos que hacer referencia al espacio de nombre System.speech.
Echo esto solo tenemos que agregar la referencia con using.
Ahora eremos una instancia a SpeechRecognitionEngine que me permitirá hacer uso de todas las funcionalidades del espacio de nombres System.Speech.Recognition.
- namespace ReconocimientoDeVoz
- {
- public partial class MainWindow : Window
- {
- SpeechRecognitionEngine _Recognition = new SpeechRecognitionEngine();
- public MainWindow()
- {
- InitializeComponent();
- }
- private void btEscuchar_Click(object sender, RoutedEventArgs e)
- {
- }
- }
- }
Hecho esto en el evento clic del botón programaríamos esto:
- private void btEscuchar_Click(object sender, RoutedEventArgs e)
- {
- _Recognition.SetInputToDefaultAudioDevice();
- _Recognition.LoadGrammar(new DictationGrammar());
- _Recognition.SpeechRecognized += _Recognition_SpeechRecognized;
- _Recognition.RecognizeAsync(RecognizeMode.Multiple);
- }
-
La primera línea le tenemos que especificar el dispositivo de audio por defecto en esta caso el que tenga por defecto el sistema operativo.
-
La segunda línea le especificaremos la gramática que se utilizara para reconocer las palabras que se le dicten a la PC, dependiendo en que idioma este tu sistema operativo o si tienes instalado alguna voz en español este reconocerá este idioma.
-
La tercera línea se ejecutara cuando se haya reconocido la palabra que se dicta para esta línea después de colocar el += solo hay que presionar la tecla tab dos veces y el generará el evento por defecto _Recognition_SpeechRecognized, en mi caso como estoy utilizando el visual estudio 2012 me saldrá diferente que con el 2010, este evento lo tendremos que modificar para agregarle nuestra funcionalidad nos generaría esto:(pero las dos formas hacen lo mismo)
- void _Recognition_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
- {
- throw new NotImplementedException();
- }
4. Y por ultimo hay que comenzar a reconocer la voz con la cuarta línea lo haremos en modo múltiple.
El método que nos generó automáticamente quedaría de esta forma, ya que le hemos especificado que la palabra reconocida la coloque o agregue al listbox:
- void _Recognition_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
- {
- foreach (RecognizedWordUnit word in e.Result.Words)
- {
- lbPalabra.Items.Add(word.Text);
- }
- }
Si lo corremos nos daría este resultado:
Como yo tengo instalado las voces de loquendo por eso reconoce el español.
Ya que logramos que la PC me reconozca lo que le Estoy dictando, hagamos que me lea un texto que le introduzca en en TextBox. Crearemos otra ventana en el proyecto que acabamos de crear:
Nuestro proyecto quedara así:
Para este ejemplo haremos lo siguiente; como yo tengo instalada varias voces haremos que las reconozca para poder utilizar voces en español y ingles, segundo haremos que pueda definir el volumen y la velocidad de lectura. Así que dibujaremos en nuestra ventana algo como esto:
El XAML quedaría de esta forma:
- <Window x:Class="ReconocimientoDeVoz.Window1"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="Window1" Height="352" Width="556">
- <Grid>
- <Button Content="Leer" Name="btLeer" HorizontalAlignment="Left"
- Margin="10,142,0,0" VerticalAlignment="Top" Width="75"
- Click="btLeer_Click"/>
- <ComboBox HorizontalAlignment="Left"
- Name="cbVoz" Margin="10,19,0,0"
- VerticalAlignment="Top" Width="120"/>
- <TextBox HorizontalAlignment="Left" Height="91"
- Margin="10,46,0,0" TextWrapping="Wrap"
- Text="" Name="txtTextoLeer"
- VerticalAlignment="Top" Width="528"
- ScrollViewer.CanContentScroll="True"/>
- <Expander Header="Expander" HorizontalAlignment="Left"
- Margin="10,179,0,0" VerticalAlignment="Top"
- Width="528" Height="133">
- <Grid Background="#FFE5E5E5">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="0*"/>
- <ColumnDefinition/>
- </Grid.ColumnDefinitions>
- <Slider Grid.ColumnSpan="2" Name="RateSlider"
- HorizontalAlignment="Left"
- Margin="158,25,0,0"
- VerticalAlignment="Top" Width="313" SmallChange="1"
- Maximum="10"/>
- <Slider Grid.ColumnSpan="2" Name="VolumenSlider"
- HorizontalAlignment="Left"
- Margin="158,68,0,0"
- VerticalAlignment="Top" Width="313"
- SmallChange="1" Maximum="100" Value="50"/>
- <Label Grid.ColumnSpan="2" Content="Rate"
- HorizontalAlignment="Left" Margin="42,25,0,0"
- VerticalAlignment="Top"/>
- <Label Grid.ColumnSpan="2" Content="Volumen"
- HorizontalAlignment="Left" Margin="42,64,0,0"
- VerticalAlignment="Top"/>
- </Grid>
- </Expander>
- </Grid>
- </Window>
como ya Hicimos la referencia al System.Speech, ya no tenemos que hacerlo, solo tenemos que colocar el using System.Speech.Synthesis.
Ahora solo hay que instanciar esto:
- namespace ReconocimientoDeVoz
- {
- public partial class Window1 : Window
- {
- SpeechSynthesizer _synthesizer = new SpeechSynthesizer();
- List<VoiceInfo> _vocesInfo = new List<VoiceInfo>();
- public Window1()
- {
- InitializeComponent();
- }
- private void btLeer_Click(object sender, RoutedEventArgs e)
- {
- }
- }
- }
Con esto seremos capaces de, uno obtener toda la funcionalidad del System.Speech.Synthesis y dos reconocer todas los idiomas o voces que tenemos instalados. Primero carguemos al combo las voces que tenemos instaladas:
- public Window1()
- {
- InitializeComponent();
- foreach (InstalledVoice voice in _synthesizer.GetInstalledVoices())
- {
- _vocesInfo.Add(voice.VoiceInfo);
- cbVoz.Items.Add(voice.VoiceInfo.Name);
- }
- }
Primero recorreremos la información de cuales voces tenemos instaladas y luego se las agregaremos al combo. hoy solo tendremos que programar el evento clic del botón:
- private void btLeer_Click(object sender, RoutedEventArgs e)
- {
- int indice;
- double Volumen = VolumenSlider.Value;
- double Rate = RateSlider.Value;
- indice = cbVoz.SelectedIndex;
- String nombre = _vocesInfo.ElementAt(indice).Name;
- _synthesizer.SelectVoice(nombre);
- _synthesizer.Volume = (int)Volumen;
- _synthesizer.Rate = (int)Rate;
- _synthesizer.Speak(txtTextoLeer.Text);
- }
Antes de Correr nuestro proyecto tenemos que cambiar la ventana que se ejecutara por defecto en el App.xaml de esta forma:
- <Application x:Class="ReconocimientoDeVoz.App"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- StartupUri="Window1.xaml">
- <Application.Resources>
- </Application.Resources>
- </Application>
Hoy si corremos esta aplicación y introducimos un texto seria capas de leer el texto introducido. Primero escogeremos la voz que me leerá el texto y por ultimo el volumen con que me lo lea:
Bueno espero que te sirva de algo…
interesante , muchas gracias por el aporte
mi visual es el 2010 esta en ingles y no encuento el adminstrador de tareas para poner la referencia
le das clic derecho sobre el nombre del proyecto y le das clic a agregar referencia y la buscas
En el cuarto paso, del reconocimiento de voz, me da un problema, porque hay dos metodos que se llaman igual
vale no, perdon, he encontrado ya el problema, ahora el problema me lo da:
Error 1 ‘PruebaReconocimientoVoz.MainWindow’ no contiene una definición de ‘lbPalabra_SelectionChanged’ ni se encontró ningún método de extensión ‘lbPalabra_SelectionChanged’ que acepte un primer argumento de tipo ‘PruebaReconocimientoVoz.MainWindow’ (¿falta una directiva using o una referencia de ensamblado?) C:\Users\Raul\Dropbox\DAM\Programación\C#\PruebaReconocimientoVoz\PruebaReconocimientoVoz\MainWindow.xaml 6 110 PruebaReconocimientoVoz
como arreglaste este problema?
Ami tambien me sale ese problema y no lo eh podido areglar
lo siento por parecer spam, pero esque me interesa mucho el tema, he conseguido que funcione, pero ahora no para de escuchar, como puedo hacer para que deje de escuchar cuando quiera?
Gracias por leer el post. tal vez la forma mas fácil seria pegar un botón que detuviera el proceso de reconocimiento para eso solo tendríamos que hacer esto
private void btnStop_Click(object sender, EventArgs e)
{
_Recognition.RecognizeAsyncStop();
}
espero te funcione…
Cómo se instalan más voces, en Spanish?, por defecto sólo aparece Microsoft Anna (English)
hola gracias por leer el post, si solo tienes que descargar una voz en particular la que te puedo recomendar por que es la que tengo instalada es Interactive TTS Demo – Loquendo, solo búsquela en google….
Muy interesante y muy bien explicado. Muchas gracias, es un gran aporte.
hola, gracias por compartir tus conocimientos, son de gran utilidad.
Te comento que he corrido el programa funcionando ok, pero al cambiar de versión de loquendo de la 6.5 a la 7 me da un error. al poner leer, en la linea _synthesizer.SelectVoice(nombre); me sale el dialogo que No se encontró NullReferenceException y dice que Referencia a objeto no encontrada como instancia de un objeto. como podre solucionar esto. saludos y gracias nuevamente por el codigo
gracias por leer el post la verdad que no he actualizado la versión que tengo de loquendo lo descargo y hago algunas pruebas y te aviso. por otra parte también puedes probar con otro proveedor de voz inténtalo…
hola otra vez, efectivamente es la versión de loquendo la 7,esta dando problemas, la he bajado de nuevo a la 6.5 y volvió a funcionar, lo único que lamento de esto es la voz de leonor, ademas de poder hacer los comando de expresión.
bueno si puedes probar esta falla, favor de comunicarla para poder corregirla igual, que estés bien y gracias por la rapidez en que contestaste el mensaje.
Dónde bajaste la versión de Loquendo 6.5? Saludos
Un amigo me la paso creo que la descargo de taringa no se..
buen tutorial, una pregunta y si esas palabras que digo en ves de que se agreguen a un textbox o a un comboBox como le puedo hacer para agegarlas a un documento de word. esa seria mi duda saludos 😀
gracias por leer el port, suena interesante tratare de hallar una forma y lo subo…
ok gracias por responder 😀 esperare la solucion saludos 😀
Amigo muchas gracias por tu aporte, infinitamente agradecido, me gusto mucho la aplicación, Dios te bendiga por compartir tus conocimientos.
muy bueno el programa. Pero me esta volviendo loco un error, nose si alguien me puede ayudar? Cuando corro el programa me tira este error: No se controlo XamlParseExeption ‘La invocación del constructor del tipo ‘ReconocimientoDeVoz.Window1′ que coincide con las restricciones de enlace especificadas produjo una excepción.’ (número de línea: ‘3’; posición de línea: ‘9’).
Que podra ser?
Me podrías ayudar con el software para implementar el sistema?? Para que lo pueda realizar claro, un saldo que estés muy bien.
ES URGENTE,DISCULPA, TENGO UNA DUDA, NECESITO VER LAS FRECUENCIAS QUE EMITE LO QUE DIGO PARA HACER COMOPARACIÓN DE TONOS DE VOZ, QUE LE AGREGARIA AL PROGRAMA QUE NOS COMPARTISTE.
Niche esa pregunta esta muy buena yo tambien estoy mirando para ver las frecuencias ya que tuve una idea que mejoraria el reconocimiento de voz , si ya lo encontraste enviame un emal o responder este comentario para charlar, gracias saludos desde colombia
Me urge resolver el tema de frecuencias. por favor si encontraron algo me dan una mano.
Hola Cesar, Niche.
Queria saber si pudieron hacer algo para el reconocimiento de la frecuencia de voz, para saber si corresponde a una persona especifica. Les agradeceria que me dieran su punto de vista.
Gracias.
Tendras el codigo para descargarlo?
Me sirvió mucho, aunque yo lo apliqué en un WinForms y no en un WPF. Thanks!.
Amigo esta interesante pero en visual basic 2008 podrias mandrme la informacion porfa
Viejo podrias dejar un Ejemplo para Windows Store app 8.1
Que diferencia tiene este programa de reconocimiento de voz a el que ya viene instalo en windows?, hasta ahora lo unico que veo diferente es que lee los textos , si alguien sabe la diferencia porfavor responder
Estimado, realmente lo felicito por sus conocimientos, yo necesito algo asi pero necesito tomar las voces de los niños para identificar los problemas de lenguaje es decir necesito que la voz que tome no la corrija sino que la escriba tal cual como puedo desarrollarlo?
muchas grazias po la informacion
Como puedo aser para instalar voses en en español???
me puede ayudar ha saber cual es el codigo del volumen para que se mueva el volumen?? por favor me urge
lo tiene en vb
gracias muy buen ejercicio quisiera pedirte un afavor podrias decirme como configurar la voz de loquendo para que reconosca mejor el esáñol es que el que sale por defecto no reconoce bien gracias
El tema tiene mucho interés. Añadiría la manera de instalar Loquendo.
La forma de conseguirlo es otro tema claro.
Excelente info!
Cuando le doy compilar me sale un erró diciendo «no se encuentra el tipo System.MarshalByRefObject en el módulo mscorlib.dll» que hago??
Gracias
Como puedo hacer para usar el reconocimiento de voz de google?
¿Podrías hacer lo mismo pero en JavaScript? Sería genial. Un saludo.
¿Podrías hacer lo mismo pero en código JavaScript? Por favor, sería genial. Un saludo.