55 votes

Reconnaissance vocale C# - Est-ce bien ce que l'utilisateur a dit ?

J'ai besoin d'écrire une application qui utilise un moteur de reconnaissance vocale - soit celui intégré dans vista, soit un moteur tiers - qui peut afficher un mot ou une phrase, et reconnaître quand l'utilisateur le lit (ou une approximation de celui-ci). Je dois également pouvoir passer rapidement d'une langue à l'autre, sans changer la langue du système d'exploitation.

Les utilisateurs se serviront du système pendant de très courtes périodes. L'application doit fonctionner sans qu'il soit nécessaire d'entraîner au préalable le moteur de reconnaissance à la voix des utilisateurs.

Il serait également fantastique que cela fonctionne sur Windows XP ou sur les versions inférieures de Windows Vista.

En option, le système doit être capable de lire à l'utilisateur les informations affichées à l'écran, dans la langue choisie par l'utilisateur. Je peux contourner cette spécification en utilisant des voix off préenregistrées, mais la méthode préférée serait d'utiliser un moteur de synthèse vocale.

Quelqu'un peut-il me recommander quelque chose ?

0 votes

Veuillez préciser... Que voulez-vous dire par là ? Un moteur de reconnaissance ? Une structure pour l'application ? Si vous devez même essayer de le faire ?

2 votes

Je cherche surtout un moteur à utiliser. Je dois pouvoir dire à mes responsables si l'idée est réalisable ou non. J'ai déjà une idée approximative de la façon de structurer l'application autour du moteur, tout ce dont j'ai besoin c'est de brancher le moteur.

59voto

Kyralessa Points 76456

Une question similaire a été posée il y a quelque temps sur Joel on Software. Vous pouvez utiliser l'outil Reconnaissance vocale pour le faire... avec quelques limitations. Ajoutez System.Speech (qui devrait se trouver dans le GAC) à votre projet. Voici un exemple de code pour une application WinForms :

public partial class Form1 : Form
{
  SpeechRecognizer rec = new SpeechRecognizer();

  public Form1()
  {
    InitializeComponent();
    rec.SpeechRecognized += rec_SpeechRecognized;
  }

  void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
  {
    lblLetter.Text = e.Result.Text;
  }

  void Form1_Load(object sender, EventArgs e)
  {
    var c = new Choices();
    for (var i = 0; i <= 100; i++)
      c.Add(i.ToString());
    var gb = new GrammarBuilder(c);
    var g = new Grammar(gb);
    rec.LoadGrammar(g);
    rec.Enabled = true;
  }

Il reconnaît les nombres de 1 à 100 et affiche le nombre obtenu sur le formulaire. Vous aurez besoin d'un formulaire avec une étiquette appelée lblLetter.

System.Speech ne fonctionne qu'avec une liste prédéfinie de mots ou de phrases ; ce n'est pas exactement NaturallySpeaking, que ce soit en termes de polyvalence ou de qualité de reconnaissance. Mais vous n'avez pas besoin de l'entraîner à la voix de l'utilisateur, et si vous n'avez que quelques mots différents que l'utilisateur peut dire, il fonctionne raisonnablement bien. Et c'est gratuit ! (si vous avez Visual Studio)

Il ne fonctionnera pas bien si vous utilisez des phrases très courtes ; j'ai créé un programme pour que mon enfant dise les lettres de l'alphabet et les voie à l'écran, mais il ne fonctionne pas très bien car de nombreuses lettres se ressemblent (surtout dans la bouche d'un enfant de quatre ans).

Pour ce qui est des options plus souples, il y a NaturallySpeaking, déjà mentionné, qui dispose d'un kit de développement logiciel (SDK). Mais il faut contacter le service commercial pour y avoir accès, et aucun prix n'est indiqué, ce qui donne l'impression d'un "Combien ça coûte ? Et bien, combien avez-vous ?". Il ne semble pas y avoir d'option "télécharger et jouer avec" :(

Quant à la synthèse vocale, System.Speech.Synthesis fait ceci. C'est même plus facile que la reconnaissance vocale. J'ai écrit un petit programme qui me permet de taper, d'appuyer sur Entrée et de lire le texte à haute voix. Mon fils de quatre ans est fasciné par ce programme :) ("Papa, je veux parler à da wobot.")

0 votes

Comment adapter ce code pour reconnaître les chiffres 1 à 100 en français ou en allemand sans avoir à modifier la langue d'affichage du système d'exploitation ?

1 votes

La seule langue possible est celle de votre système d'exploitation. Je viens de le lire sur MSDN.

4 votes

Je pense que votre commentaire "ne fonctionne qu'avec une liste prédéfinie de mots ou de phrases" n'est pas vrai. Le logiciel de reconnaissance de bureau de Vista et des versions ultérieures comprend une grammaire de dictée que vous pouvez charger. Voir msdn.microsoft.com/en-us/library/

16voto

Philipp Schmid Points 3940

[Note : j'étais le responsable du développement de l'API de reconnaissance vocale gérée dans .NET 3.0].

System.Speech fait partie de .NET 3.0, il est donc disponible sur Vista et XP. Dans Vista, vous avez l'avantage supplémentaire d'avoir un moteur de reconnaissance vocale préinstallé par le système d'exploitation. Sous XP, vous avez le choix entre : utiliser le SDK SAPI 5.1 avec un moteur très ancien (mais qui peut fonctionner assez bien pour votre scénario de commande et de contrôle), installer Office 2003 qui installe une version plus récente du moteur de reconnaissance. Il existe également quelques moteurs de reconnaissance vocale compatibles avec SAPI 5.

Si vous devez changer de langue, vous devrez utiliser la classe System.Speech.Recognition.SpeechRecognitionEngine qui vous permet de choisir le moteur SR pour la langue que vous devez prendre en charge. Notez que les moteurs sont définis par un ensemble de langues qu'ils prennent en charge (ils peuvent utiliser le même binaire, en échangeant seulement des fichiers de données pour prendre en charge des langues supplémentaires).

Commentez si vous avez besoin d'en savoir plus.

Philipp

0 votes

Phillip, si je veux utiliser le moteur et l'entraîner à apprendre et à reconnaître le croate parlé, comme moyen de transcrire différents locuteurs, est-ce possible, et si oui, par où commencer ?

0 votes

Un système de reconnaissance vocale se compose de deux parties : les modèles acoustiques et les modèles de langage. Vous pouvez utiliser le kit de ressources Vista Dictation (ou quelque chose comme cela) pour construire un modèle de langage de dictée qui fait référence aux mots croates. Il n'existe actuellement aucun outil pour entraîner les modèles acoustiques, ce que vous souhaiteriez faire s'il existe des sons en croate qui ne sont pas présents en anglais (ou dans n'importe quelle langue SR existante que vous utilisez). Vous pouvez spécifier des prononciations personnalisées pour vos mots croates afin d'améliorer la précision de la reconnaissance.

0 votes

Phillip, j'ai joué avec les bibliothèques que vous avez suggérées, mais j'ai eu beaucoup de mal à les faire reconnaître ce que j'ai dit. J'ai un petit accent, mais je n'ai pas eu cette expérience avec d'autres appareils, comme la Kinect, etc. Est-ce que je dois considérer que mon micro n'est pas assez bon, ou est-ce que je fais quelque chose de mal ? Vous avez des suggestions ? J'utilise l'exemple de la documentation MSDN.

10voto

Rob Segal Points 2451

Avant cela, ajoutez la référence "Discours".

System.Speech

J'ai constaté que l'exemple de code posté par Kyralessa le 22 octobre ne fonctionnait pas pour moi, mais qu'une version légèrement révisée fonctionnait. Lorsque vous ajoutez des chaînes de caractères dans l'objet Choix, utilisez des mots anglais en texte intégral et non des chiffres. Il semble que le moteur de reconnaissance vocale de MS ne puisse pas reconnaître les chiffres en eux-mêmes.

J'ai indiqué ces modifications en ajoutant quelques commentaires à l'exemple précédent.

public partial class Form1 : Form
{
  SpeechRecognizer rec = new SpeechRecognizer();

  public Form1()
  {
    InitializeComponent();
    rec.SpeechRecognized += rec_SpeechRecognized;
  }

  void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
  {
    lblLetter.Text = e.Result.Text;
  }

  void Form1_Load(object sender, EventArgs e)
  {
    var c = new Choices();

    // Doens't work must use English words to add to Choices and
    // populate grammar.
    //
    //for (var i = 0; i <= 100; i++)
    //  c.Add(i.ToString());

    c.Add("one");
    c.Add("two");
    c.Add("three");
    c.Add("four");
    // etc...

    var gb = new GrammarBuilder(c);
    var g = new Grammar(gb);
    rec.LoadGrammar(g);
    rec.Enabled = true;
  }

0 votes

Je ne sais pas trop pourquoi cela n'a pas fonctionné pour vous ; le code que j'ai posté provient directement d'un programme que j'ai écrit et utilisé, et il a fonctionné pour moi. Peut-être est-ce lié aux paramètres culturels de votre système ?

0 votes

Cela pourrait être le cas. Je n'ai pas étudié la question de manière très approfondie.

7voto

Jorge Córdoba Points 18919

Si c'est le moteur qui vous intéresse, j'ai trouvé (attention, je ne fais qu'énumérer, je n'ai essayé aucun d'entre eux) :

Moteur Lumenvox

vous disposez également de la SAPI SDK de Microsoft lui-même, je ne l'ai essayé que pour la synthèse vocale, mais selon sa définition :

Le SDK comprend également des moteurs de synthèse vocale (TTS) distribuables gratuitement (en anglais américain et en chinois simplifié). et les moteurs de reconnaissance vocale (SR) (en anglais américain, chinois simplifié et japonais).

1 votes

Le moteur Lumenvox semble faire l'affaire ! Je vais devoir jouer un peu avec pour en être certain. Je dois aussi discuter des prix avec les responsables. Merci Jorge !

3voto

Robert Elwell Points 4431

Sachez que vous n'obtiendrez pas de bons résultats si vous n'avez pas d'abord besoin d'une formation. La reconnaissance vocale est une application statistique de la phonétique, un domaine qui ne cache pas qu'il y a tellement de variations dans le signal que c'est presque un miracle que quelqu'un puisse comprendre ce que dit quelqu'un d'autre. Un moteur de reconnaissance vocale standard tendra très probablement vers un accent anglais plus général, mais échouera lamentablement pour tout ce qui est légèrement différent.

C'est pourquoi la formation est si importante. Nous pouvons facilement obtenir de bons résultats en procédant à un surajustement, surtout si nous réduisons l'espace du problème. Mais créer une solution d'apprentissage automatique extensible ? C'est là que le bât blesse.

Ceci étant dit, pensez à Sphinx-4. Il s'agit d'une solution standard écrite en Java, disponible à l'adresse suivante http://cmusphinx.sourceforge.net/sphinx4/

2 votes

+1 pour l'avertissement sur le fait de ne pas apprendre, j'aimerais juste qu'il y ait un portage .NET pour Sphinx-4.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X