DotNetToscana
User Group Toscano su .NET

riconoscimento vocale e lingua grammatica

rated by 0 users
This post has 4 Replies | 2 Followers

Top 10 Contributor
Male
Posts 69
luigi Posted: 01-22-2010 20.50

Salve, prendento spunto da questo articolo :

http://blogs.ugidotnet.org/marcom/archive/2008/04/22/92310.aspx

 

Mi aiutereste ad risolvere ad questo programma.

http://blogs.msdn.com/robertbrown/archive/2005/06/14/speech-sample-in-vb-net.aspx

 

Imports System.Speech
Imports System.Speech.Recognition.SrgsGrammar

Public Class Form1

Dim WithEvents reco As New Recognition.SpeechRecognizer

Private Sub SetColor(ByVal color As System.Drawing.Color)

Dim synth As New Synthesis.SpeechSynthesizer

synth.SpeakAsync("setting the back color to " + color.ToString)

Me.BackColor = color

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim gram As New SrgsDocument

Dim colorRule As New SrgsRule("color")

Dim colorsList As New SrgsOneOf("red", "green")

colorRule.Add(colorsList)

gram.Rules.Add(colorRule)

gram.Root = colorRule

reco.LoadGrammar(New Recognition.Grammar(gram))

End Sub

Private Sub reco_SpeechRecognized(ByVal sender As Object, ByVal e As System.Speech.Recognition.RecognitionEventArgs) Handles reco.SpeechRecognized

Select Case e.Result.Text

Case "red"

SetColor(Color.Red)

Case "green"

SetColor(Color.Green)
MessageBox.Show("Scelto Green")

End Select

End Sub

End Class

 

Grazie mille.

Top 10 Contributor
Male
Posts 297

Ciao!

Il tuo problema è modificare l'esempio che hai riportato perché sia possibile impostare la lingua della grammatica? Qual è il punto che ti crea problemi?

Top 10 Contributor
Male
Posts 69

Ciao, ora, con questo codice:

 

using System;
using System.Speech;
using System.Speech.Recognition;
using System.Threading;
using System.Diagnostics;
using System.Globalization;

namespace SpeechTest
{
    class Program
    {

        static void Main(string[] args)
        {
            EnumerateEngines();
            args = CheckArguments(args);

            CommandListener listener = new CommandListener();
            listener.SetCommands(args);
            listener.Run();
        }

        private static string[] CheckArguments(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Setting up default words. Enter your own words via command line arguments");
                args = new string[] { "music", "word" };
            }

            Console.Write("Now listening for...");
            foreach (string word in args)
            {
                Console.Write(String.Format("'{0}', ", word));
            }
            Console.WriteLine("\r\n(Press a key to stop listening)");
            return args;
        }

        private static void EnumerateEngines()
        {
            Console.WriteLine("The following engines are available");
            foreach (RecognizerInfo config in SpeechRecognitionEngine.InstalledRecognizers())
            {
                Console.WriteLine(config.Name + " " + config.Description);
            }
        }
    }

    class CommandListener
    {
        SpeechRecognitionEngine _speechRecogniser;
        public CommandListener()
        {
            _speechRecogniser = new SpeechRecognitionEngine();
            _speechRecogniser.SetInputToDefaultAudioDevice();

            _speechRecogniser.SpeechDetected += new EventHandler<SpeechDetectedEventArgs>(_speechRecogniser_SpeechDetected);
            _speechRecogniser.SpeechHypothesized += new EventHandler<SpeechHypothesizedEventArgs>(_speechRecogniser_SpeechHypothesized);
            _speechRecogniser.SpeechRecognitionRejected += new EventHandler<SpeechRecognitionRejectedEventArgs>(_speechRecogniser_SpeechRecognitionRejected);
            _speechRecogniser.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(_speechRecogniser_SpeechRecognized);
            _speechRecogniser.AudioStateChanged += new EventHandler<AudioStateChangedEventArgs>(_speechRecogniser_AudioStateChanged);
            _speechRecogniser.AudioSignalProblemOccurred += new EventHandler<AudioSignalProblemOccurredEventArgs>(_speechRecogniser_AudioSignalProblemOccurred);

            NotifyEvent("Loaded default engine - {0}", _speechRecogniser.RecognizerInfo.Name);
        }

        #region Event Handlers
        void _speechRecogniser_AudioSignalProblemOccurred(object sender, AudioSignalProblemOccurredEventArgs e)
        {
            NotifyEvent("Audio problem {0}", e.AudioSignalProblem.ToString("G"));
        }

        void _speechRecogniser_AudioStateChanged(object sender, AudioStateChangedEventArgs e)
        {
            NotifyEvent("Audio state now {0}", e.AudioState.ToString("G"));
        }

        void _speechRecogniser_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            NotifyEvent("Recognized '{0}' at {1} seconds", e.Result.Text, e.Result.Audio.AudioPosition);
        }

        void _speechRecogniser_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
        {
            NotifyEvent("RecognitionRejected '{0}' at {1} seconds", e.Result.Text, e.Result.Audio.AudioPosition);
        }

        void _speechRecogniser_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
        {

            NotifyEvent("Hypothesized '{0}' at seconds", e.Result.Text);
        }

        void _speechRecogniser_SpeechDetected(object sender, SpeechDetectedEventArgs e)
        {
            NotifyEvent("Detected speech at {0} seconds", e.AudioPosition.TotalSeconds);
        }
        #endregion

        public void SetCommands(string[] commands)
        {
            GrammarBuilder grammarBuilder = new GrammarBuilder();

            grammarBuilder.Culture = _speechRecogniser.RecognizerInfo.Culture;
            grammarBuilder.Append(new Choices(commands));
            Grammar grammar = new Grammar(grammarBuilder);

            _speechRecogniser.UnloadAllGrammars();
            _speechRecogniser.LoadGrammar(grammar);

            _speechRecogniser.RecognizeAsync(RecognizeMode.Multiple);
        }

        public void Run()
        {
            while (!Console.KeyAvailable)
            {
                Thread.Sleep(100);
            }

            _speechRecogniser.Dispose();
        }

        private static void NotifyEvent(string format, params object[] args)
        {
            Console.WriteLine(string.Format(format, args));
        }
    }
}

 

Ecco l'errore:

 

The following engines are available
Setting up default words. Enter your own words via command line arguments
Now listening for...'music', 'word',
(Press a key to stop listening)

Eccezione non gestita: System.PlatformNotSupportedException: Nessun riconoscimen
to installato.
   in System.Speech.Recognition.RecognizerBase.Initialize(SapiRecognizer recogni
zer, Boolean inproc)
   in System.Speech.Recognition.SpeechRecognitionEngine.get_RecoBase()
   in System.Speech.Recognition.SpeechRecognitionEngine.SetInputToDefaultAudioDe
vice()
   in SpeechTest.CommandListener..ctor() in C:\Users\luigi\AppData\Local\Tempora
ry Projects\SpeechTest\Program.cs:riga 56
   in SpeechTest.Program.Main(String[] args) in C:\Users\luigi\AppData\Local\Tem
porary Projects\SpeechTest\Program.cs:riga 18
Premere un tasto per continuare . . .

 

---------------------

 

Sono su windows vista ita 32bit home premium.

Top 10 Contributor
Male
Posts 60

Io credo che il problema sia legato alla lingua del sistema operativo in quanto la Speech Recognition di Windows funziona solo per la lingua inglese.

Di fatto non hai nessun SpeechRecognitionEngine installato, come dimostra la chiamata al metodo EnumerateEngines.

Un consiglio che ti posso dare è quello di installare l'ultima versione del Windows SDK il quale contiene numerosi esempi di utilizzo delle Speech API.

Top 10 Contributor
Male
Posts 297

Confermo: il riconoscimento vocale è incluso solo nelle inglese, francese, tedesco, spagnolo, cinese e giapponese di Windows Vista.

Page 1 of 1 (5 items) | RSS
Powered by Community Server (Commercial Edition), by Telligent Systems