ebbene si sono qui perchè sto creando un'applicazione che dovrà interfacciarsi con arduino e controllare entrate e uscite (nei vari modi con programmazione unica lato arduino) tramite un programma in C# ed ovviamente questo programma sarà interattivo con la voce.
per rendermi le cose più difficili ho deciso di non usare il kinect, questo perchè voglio rendere il codice open source e mentre quasi tutti avranno un microfono per il pc non tutti hanno un kinect e non voglio far comprare hardware aggiuntivo (e poi non ho il kinect quindi..
)
sto usando le sapi di microsoft (speech api insomma) che mi permettono di fare il tts (text to speech) e l'stt (speech to text).
naturalmente la lingua italiana non è supportata, ho studiato un po' e dopo 2 o 3 prove (windows settato in inglese) ho notato che impostando i grammar giusti è possibile arrivare a distinguere i comandi in italiano anche se sotto il profilo inglese.
mi sono detto "perfetto, è ora di tornare con windows in italiano!".
per non aver problemi di riconoscimenti errati dal punto di vista del "controllo vocale" di windows integrato sto usando la classe SpeechRecognitionEngine invece che la SpeechRecognizer che mi permette anche quindi di avere una grammatica più rigida.
ricordate però? il riconoscimento vocale in italiano non c'è, tuttavia ho pensato che ci fosse un modo per forzare il motore inglese (ho i pacchetti per la lingua inglese installati ovviamente) e farlo funzionare anche in italiano.
beh probabilmente sbagliavo...
questo è il mio codice attuale quindi:
using SpeechLib;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Speech;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
// inizializzo voce e riconoscimento
SpeechRecognitionEngine reco = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));
SpeechSynthesizer voice = new SpeechSynthesizer();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
reco.Dispose();
//setto l'input
reco.SetInputToDefaultAudioDevice();
//creo la grammatica
Choices comandi = new Choices();
comandi.Add("a");
comandi.Add("lorenzo");
comandi.Add("due");
comandi.Add("tre");
comandi.Add("mamma");
comandi.Add("diciassei");
comandi.Add("venticinque");
// scarico eventuali grammar e poi carico i comandi
reco.UnloadAllGrammars();
reco.LoadGrammar(new Grammar(new GrammarBuilder(comandi)));
// attivo l'evento sul riconoscimento
reco.SpeechRecognized +=
new EventHandler<SpeechRecognizedEventArgs>(
SpeechRecognizedHandler);
// faccio partire il riconoscimento in tutte le modalità
reco.RecognizeAsync(RecognizeMode.Multiple);
}
// funzione al riconoscimento
void SpeechRecognizedHandler(object sender, SpeechRecognizedEventArgs e)
{
SetText(e.Result.Text.ToString());
}
// parte per evitare l'errore dei thread
delegate void SetTextCallback(string text);
private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}
}
}
(sono un hobbysta siate clementi dai è il mio primo codice in C# che diventerà una figata
)
se la lingua del sistema è in inglese funziona, mentre se in italiano no, ma in teoria con
SpeechRecognitionEngine reco = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));
dovrei appunto "forzare" il recognition engine inglese e quindi dovrebbe andare giusto?
qualcuno di voi ha esperienze in merito?
grazie a tutti, alla fine il codice sarà 100% open source!