Ciao a tutti,
sto provando a fare una piccola applicazione per il riconoscimento vocale utilizzando le librerie System.Speech.Recognition.
Premesso che il linguaggio del computer è Italiano (e quindi non posso attivare le funzionalità integrate di riconoscimento vocale da pannello di controllo), ho trovato, scartabellando per internet, questo codice:
Codice PHP:
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 senderAudioSignalProblemOccurredEventArgs e)
        {
            
NotifyEvent("Audio problem {0}"e.AudioSignalProblem.ToString("G"));
        }

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

        
void _speechRecogniser_SpeechRecognized(object senderSpeechRecognizedEventArgs e)
        {
            
NotifyEvent("Recognized '{0}' at {1} seconds"e.Result.Texte.Result.Audio.AudioPosition);
        }

        
void _speechRecogniser_SpeechRecognitionRejected(object senderSpeechRecognitionRejectedEventArgs e)
        {
            
NotifyEvent("RecognitionRejected '{0}' at {1} seconds"e.Result.Texte.Result.Audio.AudioPosition);
        }

        
void _speechRecogniser_SpeechHypothesized(object senderSpeechHypothesizedEventArgs e)
        {

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

        
void _speechRecogniser_SpeechDetected(object senderSpeechDetectedEventArgs 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 formatparams object[] args)
        {
            
Console.WriteLine(string.Format(formatargs));
        }
    }

Ok, il problema è, dopo aver aggiunto il riferimento del progetto a System.speech, compilando mi da questo errore su questa linea:
Codice PHP:
_speechRecogniser.SetInputToDefaultAudioDevice(); 
Errore HRESULT E_FAIL restituito da una chiamata a un componente COM.

Non ne so moltissimo di C#, preferisco altri linguaggi, ma sembra che il problema sia il "defaultAudioDevice". Controllando tra le periferiche,il mio microfono è abilitato e funzionante.
Provando a cambiare la suddetta riga così:
Codice PHP:
_speechRecogniser.SetInputToNull(); 
Il risutalto è uguale. Il problema quindi non è il microfono.

Cosa diavolo può essere?
Grazie a tutti!