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 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));
}
}
}
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!