2008-10-22 6 views
53

J'ai besoin d'écrire une application qui utilise un moteur de reconnaissance vocale - soit le vista intégré, soit un 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 basculer rapidement entre les langues, sans changer la langue du système d'exploitation.C# Reconnaissance vocale - Est-ce ce que l'utilisateur a dit?

Les utilisateurs utiliseront le système pendant de très courtes périodes. L'application doit fonctionner sans l'obligation de former d'abord le moteur de reconnaissance aux voix des utilisateurs.

Ce serait également fantastique si cela pouvait fonctionner sur Windows XP ou les versions inférieures de Windows Vista.

Facultativement, le système doit pouvoir lire les informations sur 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 recommander quelque chose pour moi?

+0

Veuillez clarifier ... Que voulez-vous dire? Voulez-vous dire un moteur de reconnaissance? Une structure pour l'application? Si vous devriez même essayer de le faire? –

+2

Je cherche principalement un moteur à utiliser. Je dois pouvoir dire à mes gestionnaires si l'idée est faisable 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 est de brancher le moteur. – RichieACC

Répondre

7

Si le moteur est ce que vous demandez au sujet alors j'ai trouvé (méfiez-vous, je suis juste la liste, je n'ai pas essayé l'un d'entre eux):

Lumenvox engine

vous avez également la SAPI SDK de Microsoft lui-même, je n'ai essayé pour le texte à la parole, mais selon sa définition:

le SDK inclut également les moteurs librement du texte de synthèse vocale (TTS) distribuable (en chinois anglais américain et simplifié) et moteurs de reconnaissance vocale (SR) (en anglais américain, Simp chinois simplifié et japonais).

+1

Le moteur Lumenvox a l'air de faire l'affaire! Je vais devoir jouer un peu avec ça pour être certain. Aussi besoin de discuter des prix avec les gestionnaires. Merci Jorge! – RichieACC

0

Dragon Naturally Speaking SDK pourrait être utile de regarder. This project semblait intéressant.

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

+0

Lien mort et le "Ce projet" est sur la parole à la parole, pas de reconnaissance vocale – Levitikon

+0

@Levitikon Avez-vous lu la dernière partie de la question avant que vous m'avez voté? Il cherchait à la fois une pièce de reconnaissance vocale ** et ** une synthèse vocale. Pas de surprise ici qu'un lien vieux de 3 ans soit mort. Je l'ai mis à jour. – itsmatt

+0

supporte-t-il le grec? –

3

Soyez averti que vous n'obtiendrez pas de bons résultats si vous n'avez pas besoin d'entraînement en premier. La reconnaissance de la parole est une application statistique de la phonétique, un domaine qui est assez franc sur le fait qu'il y a tellement de variations dans le signal que c'est presque un miracle que tout le monde puisse comprendre ce que quelqu'un d'autre dit. Un moteur de reconnaissance vocale prêt à l'emploi tendra vraisemblablement vers un accent plus général de l'anglais, mais échouera lamentablement à quelque chose de légèrement différent.

C'est pourquoi l'entraînement est si important. Nous pouvons bien faire en surimposant avec facilité, surtout si nous réduisons l'espace problème. Mais créer une solution d'apprentissage automatique extensible? Là réside toujours le frottement.

Cela étant dit, considérons Sphinx-4. Il est une solution impromptu écrit en Java disponible à http://cmusphinx.sourceforge.net/sphinx4/

+2

+1 pour l'avertissement de ne pas apprendre, je souhaite juste qu'il y avait un port .NET pour Sphinx-4. – nemesisfixx

57

Une question similaire a été posée sur Joel on Software un certain temps. Vous pouvez utiliser l'espace de noms System.Speech.Recognition pour ce faire ... avec certaines limitations. Ajoutez System.Speech (devrait être dans le GAC) à votre projet. Voici quelques exemples 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; 
    } 

On reconnaît les nombres de 1 à 100, et affiche le numéro résultant de la forme. Vous aurez besoin d'un formulaire avec une étiquette appelée lblLetter dessus.

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 matière de polyvalence ou de qualité de reconnaissance. Mais vous n'avez pas besoin de le former à la voix de l'utilisateur, et si vous n'avez que quelques petites choses 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 fait un programme pour que mon enfant dise des lettres de l'alphabet et les voit à l'écran, mais ça ne marche pas très bien puisque beaucoup de lettres se ressemblent (surtout de la bouche d'un enfant de quatre ans). En ce qui concerne les options plus flexibles ... eh bien, il y a le NaturallySpeaking mentionné ci-dessus, qui a un SDK. Mais vous devez contacter les ventes pour obtenir n'importe quel type d'accès, et aucun prix n'est répertorié, donc il apparaît comme l'un de ceux "Combien cela coûte-t-il? genre de choses. Il ne semble pas y avoir d'option "télécharger et jouer avec". Pour ce qui est de la synthèse vocale, System.Speech.Synthesis est encore plus simple que la reconnaissance vocale: j'ai écrit un petit programme pour me laisser taper, appuyer sur Entrée et lire le texte à haute voix. vieux se hypnotisé par elle :) ("papa, je veux Tawk à da Wobot.")

+0

Comment est-ce que j'adapterais ce code pour reconnaître 1 - 100 en français ou en allemand sans avoir besoin de changer la langue d'affichage du système d'exploitation? – RichieACC

+1

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

+4

Je pense que votre commentaire qui "ne fonctionne qu'avec une liste prédéfinie de mots ou de phrases" n'est pas vrai. Le reconnaisseur de bureau dans Vista et plus tard inclut une grammaire de dictée que vous pouvez charger. Voir http://msdn.microsoft.com/en-us/library/system.speech.recognition.dictationgrammar.aspx –

16

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

System. La parole fait partie de .NET 3.0, elle 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. Sur XP, vous avez le choix entre: utiliser le SDK SAPI 5.1 avec un moteur très ancien (mais cela pourrait marcher assez bien pour votre scénario de commande et de contrôle), installez Office 2003 qui installe une version plus récente du logiciel de reconnaissance. Il existe également quelques moteurs de reconnaissance de la parole compatibles SAPI 5.

Si vous devez changer de langue, vous devez 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, en remplaçant uniquement les fichiers de données pour prendre en charge d'autres langues).

Donnez votre avis si vous avez besoin d'en savoir plus.

Philipp

+0

Phillip, si je veux utiliser le moteur et le former pour apprendre et reconnaître le croate parlé, comme un moyen de transcrire différents orateurs, est-ce possible, et si oui, par où commencer? –

+0

Il existe deux parties d'un reconnaissance de la parole: les modèles acoustiques et le modèle de langage. Vous pouvez utiliser le Vista Dictation Resource Kit (ou quelque chose comme ça) pour construire un modèle de langage de dictée qui fait référence à des mots croates. Il n'y a actuellement aucun outil pour former les modèles acoustiques que vous voudriez faire s'il y a des sons en croate qui ne sont pas présents en anglais (ou n'importe quel langage SR existant que vous utilisez). Vous pouvez spécifier des prononciations personnalisées pour vos mots croates afin d'améliorer votre précision de reconnaissance. –

+0

Phillip, j'ai joué avec les bibliothèques que vous avez suggérées, mais j'ai eu beaucoup de mal à comprendre ce que j'ai dit. J'ai un peu d'accent, mais je n'ai pas eu cette expérience dans d'autres appareils, comme Kinect et ainsi de suite. Est-ce que je devrais juste considérer que mon micro n'est pas assez bon, ou est-ce que je fais quelque chose de mal? Donc vous avez des suggestions? Ps. J'utilise l'exemple dans la documentation MSDN. – Oakcool

10

Avant ce module de référence « Discours »

System.Speech

Constaté que l'exemple de code publié par Kyralessa le 22 octobre ne fonctionne pas pour moi, mais une version légèrement révisée a fait. Lorsque vous ajoutez des chaînes dans l'objet Choices, utilisez des mots anglais en texte intégral et non des nombres. Semble que le moteur de reconnaissance vocale MS ne peut pas reconnaître les nombres par 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; 
    } 
+0

Je ne sais pas 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 cela a fonctionné pour moi. Peut-être que c'est lié aux paramètres de culture sur votre système? –

+0

Pourrait être. Je n'ai pas examiné cela en profondeur. –

0

Ceci est l'article du magazine MSDN qui a d'abord abordé l'utilisation des API System.Speech pour Vista. Certains d'entre eux sont obsolètes car l'API a changé entre la version bêta (lorsque l'article a été écrit) et la version de Vista, mais c'est toujours 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

Eh bien, cette question a déjà beaucoup de bonnes réponses, mais je pense qu'il est important de mettre à jour avec quelques informations de la documentation 2016 les réponses de Rob Segal et Philipp Schmid pointant vers ce bel exemple de code:

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

Il n'a pas utilisé le logiciel de reconnaissance partagé de Windows (Le petit Windows Mic qui apparaît au milieu de l'écran), il utilise une belle application SpeechRecognitionEngine qui n'a pas besoin de repères visuels. L'interface utilisateur est complètement à votre contrôle.

Questions connexes