Reconocimiento de voz y texto en c#

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:

Snap28

En la ventana del WPF dibujaremos esto.

Snap29

Solo hemos colocado un listbox y un botón, el XAML que da así:.

XAML
  1. <Window x:Class="ReconocimientoDeVoz.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot;
  4.         Title="MainWindow" Height="350" Width="525">
  5.     <Grid>
  6.         <ListBox HorizontalAlignment="Left" Name="lbPalabra" Height="267"
  7.                  Margin="10,10,0,0" VerticalAlignment="Top" Width="497"/>
  8.         <Button Content="Escuchar" Name="btEscuchar" HorizontalAlignment="Left"
  9.                 Margin="420,288,0,0" VerticalAlignment="Top" Width="75"
  10.                 Click="btEscuchar_Click"/>
  11.     </Grid>
  12. </Window>

Ahora tendremos que hacer referencia al espacio de nombre System.speech.

Snap30

Echo esto solo tenemos que agregar la referencia con using.

Snap31

Ahora eremos una instancia a SpeechRecognitionEngine que me permitirá hacer uso de todas las funcionalidades del espacio de nombres System.Speech.Recognition.

SpeechRecognitionEngine
  1. namespace ReconocimientoDeVoz
  2. {
  3.     public partial class MainWindow : Window
  4.     {
  5.         SpeechRecognitionEngine _Recognition = new SpeechRecognitionEngine();
  6.         public MainWindow()
  7.         {
  8.             InitializeComponent();
  9.         }
  10.  
  11.         private void btEscuchar_Click(object sender, RoutedEventArgs e)
  12.         {
  13.  
  14.         }
  15.     }
  16. }

 

Hecho esto en el evento clic del botón programaríamos esto:

btEscuchar_Click
  1. private void btEscuchar_Click(object sender, RoutedEventArgs e)
  2.         {
  3.             _Recognition.SetInputToDefaultAudioDevice();
  4.             _Recognition.LoadGrammar(new DictationGrammar());
  5.             _Recognition.SpeechRecognized += _Recognition_SpeechRecognized;
  6.             _Recognition.RecognizeAsync(RecognizeMode.Multiple);
  7.         }

 

  1. 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.
  2. 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.
  3. 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)

_Recognition_SpeechRecognized
  1. void _Recognition_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
  2. {
  3.     throw new NotImplementedException();
  4. }

 

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:

_Recognition_SpeechRecognized
  1. void _Recognition_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
  2. {
  3.     foreach (RecognizedWordUnit word in e.Result.Words)
  4.     {
  5.         lbPalabra.Items.Add(word.Text);
  6.     }
  7. }

 

Si lo corremos nos daría este resultado:

Snap32 

Como yo tengo instalado las voces de loquendo por eso reconoce el español.

2.  System.Speech.Synthesis.

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:

Snap33 

Nuestro proyecto quedara así:

Snap34

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:

Snap35

El XAML quedaría de esta forma:

Codigo
  1. <Window x:Class="ReconocimientoDeVoz.Window1"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot;
  4.         Title="Window1" Height="352" Width="556">
  5.     <Grid>
  6.         <Button Content="Leer" Name="btLeer" HorizontalAlignment="Left"
  7.                 Margin="10,142,0,0" VerticalAlignment="Top" Width="75"
  8.                 Click="btLeer_Click"/>
  9.         <ComboBox HorizontalAlignment="Left"
  10.                   Name="cbVoz" Margin="10,19,0,0"
  11.                   VerticalAlignment="Top" Width="120"/>
  12.         <TextBox HorizontalAlignment="Left" Height="91"
  13.                  Margin="10,46,0,0" TextWrapping="Wrap"
  14.                  Text="" Name="txtTextoLeer"
  15.                  VerticalAlignment="Top" Width="528"
  16.                  ScrollViewer.CanContentScroll="True"/>
  17.         <Expander Header="Expander" HorizontalAlignment="Left"
  18.                   Margin="10,179,0,0" VerticalAlignment="Top"
  19.                   Width="528" Height="133">
  20.             <Grid Background="#FFE5E5E5">
  21.                 <Grid.ColumnDefinitions>
  22.                     <ColumnDefinition Width="0*"/>
  23.                     <ColumnDefinition/>
  24.                 </Grid.ColumnDefinitions>
  25.                 <Slider Grid.ColumnSpan="2" Name="RateSlider"
  26.                         HorizontalAlignment="Left"
  27.                         Margin="158,25,0,0"
  28.                         VerticalAlignment="Top" Width="313" SmallChange="1"
  29.                         Maximum="10"/>
  30.                 <Slider Grid.ColumnSpan="2" Name="VolumenSlider"
  31.                         HorizontalAlignment="Left"
  32.                         Margin="158,68,0,0"
  33.                         VerticalAlignment="Top" Width="313"
  34.                         SmallChange="1" Maximum="100" Value="50"/>
  35.                 <Label Grid.ColumnSpan="2" Content="Rate"
  36.                        HorizontalAlignment="Left" Margin="42,25,0,0"
  37.                        VerticalAlignment="Top"/>
  38.                 <Label Grid.ColumnSpan="2" Content="Volumen"
  39.                        HorizontalAlignment="Left" Margin="42,64,0,0"
  40.                        VerticalAlignment="Top"/>
  41.             </Grid>
  42.         </Expander>
  43.  
  44.     </Grid>
  45. </Window>

como ya Hicimos la referencia al System.Speech, ya no tenemos que hacerlo, solo tenemos que colocar el using System.Speech.Synthesis.

Snap36

Ahora solo hay que instanciar esto:

Codigo
  1. namespace ReconocimientoDeVoz
  2. {
  3.     public partial class Window1 : Window
  4.     {
  5.         SpeechSynthesizer _synthesizer = new SpeechSynthesizer();
  6.         List<VoiceInfo> _vocesInfo = new List<VoiceInfo>();
  7.         public Window1()
  8.         {
  9.             InitializeComponent();
  10.         }
  11.         private void btLeer_Click(object sender, RoutedEventArgs e)
  12.         {
  13.  
  14.         }
  15.     }
  16. }

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:

Codigo
  1. public Window1()
  2. {
  3.     InitializeComponent();
  4.     foreach (InstalledVoice voice in _synthesizer.GetInstalledVoices())
  5.     {
  6.         _vocesInfo.Add(voice.VoiceInfo);
  7.        cbVoz.Items.Add(voice.VoiceInfo.Name);
  8.     }
  9. }

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:

btLeer_Click
  1. private void btLeer_Click(object sender, RoutedEventArgs e)
  2. {
  3.     int indice;
  4.  
  5.     double Volumen = VolumenSlider.Value;
  6.     double Rate = RateSlider.Value;
  7.  
  8.     indice = cbVoz.SelectedIndex;
  9.     String nombre = _vocesInfo.ElementAt(indice).Name;
  10.     _synthesizer.SelectVoice(nombre);
  11.  
  12.     _synthesizer.Volume = (int)Volumen;
  13.     _synthesizer.Rate = (int)Rate;
  14.     _synthesizer.Speak(txtTextoLeer.Text);
  15. }

 

Antes de Correr nuestro proyecto tenemos que  cambiar la ventana que se ejecutara por defecto en el App.xaml de esta forma:

App.xaml
  1. <Application x:Class="ReconocimientoDeVoz.App"
  2.              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
  3.              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot;
  4.              StartupUri="Window1.xaml">
  5.     <Application.Resources>
  6.          
  7.     </Application.Resources>
  8. </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:

Snap37

Snap38

Bueno espero que te sirva de algo…

44 comentarios en “Reconocimiento de voz y texto en c#

  1. 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

  2. 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?

    1. 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…

    1. 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….

  3. 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

    1. 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…

  4. 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.

  5. 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 😀

  6. Amigo muchas gracias por tu aporte, infinitamente agradecido, me gusto mucho la aplicación, Dios te bendiga por compartir tus conocimientos.

  7. 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?

  8. 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.

    1. 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

    2. 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.

  9. 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

  10. 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?

  11. 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

  12. 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

Deja un comentario