web-dev-qa-db-fra.com

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

J'ai besoin d'écrire une application qui utilise un moteur de reconnaissance vocale - intégré à Vista ou tiers - pouvant afficher un mot ou une phrase et reconnaître le moment où l'utilisateur le lit (ou une approximation ). Je dois aussi pouvoir basculer rapidement d'une langue à l'autre, sans changer la langue du système d'exploitation.

Les utilisateurs utiliseront le système pendant de très courtes périodes. L'application doit fonctionner sans qu'il soit nécessaire de former au préalable le moteur de reconnaissance aux voix des utilisateurs.

Il serait également fantastique que cela fonctionne sous Windows XP ou dans des versions moins récentes de Windows Vista.

En option, le système doit pouvoir lire les informations à l'écran à l'utilisateur, dans la langue sélectionnée 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?

53
RichieACC

Une question similaire a été posée il y a quelque temps à Joel on Software. Vous pouvez utiliser le System.Speech.Recognition namespace pour le faire ... avec certaines limitations. Ajoutez System.Speech (devrait être 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;
  }

Cela 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 choses différentes que l'utilisateur peut dire, cela fonctionne raisonnablement bien. Et c'est gratuit! (si vous avez Visual Studio)

Cela ne fonctionnera pas bien si vous utilisez des phrases très courtes; J'ai créé un programme pour que mon enfant puisse dire des lettres de l'alphabet et les voir à l'écran, mais cela ne va pas très bien, car beaucoup de lettres se ressemblent (surtout dans la bouche d'un enfant de quatre ans).

En ce qui concerne les options plus flexibles ... eh bien, il y a le susdit NaturallySpeaking, qui a un SDK. Mais vous devez contacter le service des ventes pour obtenir un accès quelconque, et aucun prix n’est indiqué, c’est donc l’une des réponses suivantes: «Combien cela coûte-t-il? Eh bien, combien avez-vous? genre de choses. Il ne semble pas y avoir d’option «télécharger et jouer avec». :(

En ce qui concerne la synthèse vocale, System.Speech.Synthesis le fait. C'est encore plus facile que la reconnaissance vocale. J'ai écrit un petit programme pour me laisser taper, appuyer sur Entrée et lire le texte à voix haute. Mon fils de quatre ans en est fasciné. :) ("Papa, je veux tawk da da wobot.")

58
Ryan Lundy

[Remarque: 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 et est donc disponible sous Vista et XP. Dans Vista, vous avez l’avantage supplémentaire de disposer d’un moteur de reconnaissance vocale préinstallé par le système d’exploitation. Sous XP, vous avez le choix: utilisez le SDK SAPI 5.1 avec un très vieux moteur (mais cela pourrait fonctionner assez bien pour votre scénario de commande et contrôle), installez Office 2003, qui installe une version plus récente du logiciel de reconnaissance. Quelques moteurs de reconnaissance de la parole compatibles SAPI 5 sont également disponibles.

Si vous devez changer de langue, vous souhaiterez 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 utilisent peut-être le même fichier binaire, échangeant uniquement des fichiers de données pour prendre en charge d'autres langues).

Commentez si vous avez besoin d'en savoir plus.

Philipp

16
Philipp Schmid

Avant cela, ajoutez la référence 'Speech'

System.Speech

Nous avons constaté que l’exemple de code publié par Kyralessa le 22 octobre ne me convenait pas, mais une version légèrement révisée. Lors de l'ajout de chaînes dans l'objet Choices, utilisez des mots anglais en texte intégral et non des nombres. Il semble que le moteur de reconnaissance vocale MS ne puisse pas reconnaître les numéros eux-mêmes.

J'ai marqué ces modifications avec quelques commentaires ajoutés à 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;
  }
10
Rob Segal

Si le moteur est ce que vous demandez, alors j'ai trouvé (attention, je ne fais que lister, je n'ai essayé aucun d'entre eux):

Moteur Lumenvox

vous avez également le 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 inclut également des moteurs de synthèse vocale (TTS) librement distribuables (en anglais américain et en chinois simplifié) et des moteurs de reconnaissance vocale (SR) (en anglais américain, en chinois simplifié et en japonais).

7
Jorge Córdoba

Soyez averti que vous n'obtiendrez pas de bons résultats si vous n'avez pas besoin de formation en premier. La reconnaissance vocale est une application statistique de la phonétique, un domaine assez franc sur le fait que le signal varie tellement que c'est presque un miracle que quiconque puisse comprendre ce que quelqu'un d'autre dit. Un moteur de reconnaissance vocale disponible dans le commerce aura tendance à adopter un accent anglais plus général, mais échouera lamentablement dans des domaines légèrement différents. 

C'est pourquoi la formation est si importante. Nous pouvons bien faire en sur-équipant avec facilité, surtout si nous réduisons l’espace problématique. Mais créer une solution d’apprentissage machine extensible? C'est là que réside toujours le problème.

Cela étant dit, considérons Sphinx-4. C'est une solution prête à l'emploi écrite en Java et disponible à l'adresse http://cmusphinx.sourceforge.net/sphinx4/

3
Robert Elwell
1
stephbu

Dragon Naturally Speaking SDK pourrait être intéressant de regarder . Ce projet semblait intéressant.

Je n'ai pas eu à jouer avec l'un d'eux cependant.

0
itsmatt

Text to speech est disponible avec Speech API . Personnellement, j'aurais probablement besoin de Vista et utiliserais les interfaces gérées par System.Speech.SpeechRecognition et System.Speech.Synthesis.TtsEngine , mais un P/Invoke devrait être possible dans les API non gérées vraiment besoin de XP.

0
Mark Brackett

Essayez Microsoft Speech Server , qui, je pense, fait maintenant partie de Office Communication Server 2007 . Il contient un moteur SR/TTS, une API C # et des outils qui s'intègrent à Visual Studio.

0
dbkk

Ceci est l'article du magazine MSDN qui a abordé l'utilisation des API System.Speech pour Vista. Certaines d'entre elles sont obsolètes car l'API a changé entre la version bêta (au moment de la rédaction de l'article) et la publication de Vista, mais il s'agit toujours de l'une des meilleures ressources que j'ai trouvées et couvre une bonne introduction à l'espace de noms System.Speech. . Voir http://msdn.Microsoft.com/en-us/magazine/cc163663.aspx

0
Michael Levy

Eh bien, cette question a déjà de nombreuses bonnes réponses, mais je pense qu'il est utile de mettre à jour avec les informations de la documentation de 2016 les réponses de Rob Segal et Philipp Schmid en pointant vers cet exemple de code de Nice:

https://msdn.Microsoft.com/en-us/library/office/system.speech.recognition.speechrecognitionengine.aspx

Il n'a pas utilisé la reconnaissance partagée de Windows (le petit micro Windows qui apparaît au milieu de l'écran), il utilise un Nice in app SpeechRecognitionEngine qui n'a pas besoin de repères visuels. L'interface utilisateur est entièrement sous votre contrôle. 

0
Fidel Orozco