Come ottenere un input vocale dall'app

di il
19 risposte

19 Risposte - Pagina 2

  • Re: Come ottenere un input vocale dall'app

    Guarda, la cosa mi ha incuriosito un po ed ho fatto qualche test:
    1) usa Microsoft.Speech e non system
    2) compila solo con x64 se hai scaricato il SDK 11 per x64, diversamente usa quello che hai ma non usare any cpu
    3) devi avere un buon microfono configurato
    4) la lingua di sistema deve essere impostata correttamente in italiano se hai scaricato il runtime in italiano e vuoi usare quello

    Ti garantisco che funziona anche in italiano perché ho appena provato.
    L'unica cosa è che devi farti anche un piccolo file grammaticale, io ad esempio ho usato il classico "prova" senza altre opzioni, però funziona alla grande.


    EDIT:
    se non sai dove reperire SDK 11, dovrebbe essere qui (sia x86 che x64), dopo l'installazione trovi tutto dentro la cartella: *programmi*(x64 o x86)/Microsoft SDKs/Speech
  • Re: Come ottenere un input vocale dall'app

    JacopoBiondi ha scritto:


    gian82 ha scritto:


    Forse non hai installato l'engine "en-US" , guarda questa discussione https://www.iprogrammatori.it/forum-programmazione/vbnet/speechrecognitionengine-installedrecognizers-non-trova-tutti-moduli-presenti-t49465.html
    nada... a questo punto proverò Microsoft.Speech anche se probabilmente incontrerò errori anche lì.. su questa pagina (https://docs.microsoft.com/it-it/azure/cognitive-services/speech-service/get-started-speech-to-text?tabs=terminal&pivots=programming-language-csharp) posso trovare una guida abbastanza completa o comunque conforme alle mie esigenze per la mia app?
    Ad occhio direi che stanno spingendo verso i servizi online di Azure, giustamente anche Microsoft deve mangiare, non sono stato li a leggere, ti dico la verità, però l'idea che mi sono fatto è quella... di solito quando si tratta di chiamate verso le risorse online stiamo parlando di costi aggiuntivi.
    Comunque effettivamente non sono mai stati molto generosi con la documentazione della speech.recognition, neanche prima dell'avvento di Azure, ma ora vedo "censure" da tutte le parti.

    In ogni caso credo che su Azure sia tutto più facile, quindi dipende anche dal tempo che vuoi dedicare. Ovviamente meno fai tu con le tue manine e più paghi... almeno in genere è così.
  • Re: Come ottenere un input vocale dall'app

    Sinceramente ricordo di aver fatto tutto con System.Speech (quindi non Microsoft.Speech).

    Ti giro un piccolo pezzo di codice, però tieni conto che non lo uso da 5 anni, quindi non ricordo bene quale runtime ho installato per l'italiano (qualcosa però avevo installato).

    Occhio che l'ho un po' cambiato perchè il codice che ho è troppo specifico per il mio scopo, quindi potrei aver fatto qualche errore:
    
    
        class Program
        {
    
            static void Main(string[] args)
            {
    	    using (var engine = SetupListenEngine())
                using (var synth = SetupTalkEngine())
                {
                    engine.SpeechRecognized += (o, e) =>
                    {
                        if (e.Result.Text.EndsWith("rossi", StringComparison.InvariantCultureIgnoreCase))
                        {
                            synth.SpeakAsync("Buongiorno signor Rossi!");
                        }
                    };
                    Console.ReadLine();
                }
            }
    
    
            #region Ascolto
    
            private static SpeechRecognitionEngine SetupListenEngine()
            {
                var engine = new SpeechRecognitionEngine();
                engine.SetInputToDefaultAudioDevice();
    
                // Nome delle persone da salutare
                var people = new Choices(new string[] { "rossi", "bianchi" });
                var peopleGrammar = new GrammarBuilder(people);
    
                // Frasi da impostare come ascolto
                var greetingsGrammar = new GrammarBuilder("Ciao, sono il signor  ");
                greetingsGrammar.Append(peopleGrammar);
    
                // Mettiamo assieme il tutto, in pratica ora vengono "rilevate" solo le frasi:
                // - Ciao, sono il signor rossi
                // - Ciao, sono il signor bianchi
                var choice = new Choices(new GrammarBuilder[] { greetingsGrammar });
                var grammar = new Grammar(choice)
                {
                    Name = "Saluti"
                };
    
                engine.LoadGrammar(grammar);
                engine.RecognizeAsync(RecognizeMode.Multiple);
                return engine;
            }
    
    
            private static void Engine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
                Console.WriteLine(e.Result.Text);
            }
    
    
            #endregion
    
    
    
    
            #region Parlato
    
    
            private static SpeechSynthesizer SetupTalkEngine()
            {
                var synth = new SpeechSynthesizer();
                synth.SetOutputToDefaultAudioDevice();
    
                // Imposto italiano
                var italianVoice = synth.GetInstalledVoices()
                                        .FirstOrDefault(x => x.VoiceInfo
                                                              .Culture
                                                              .TwoLetterISOLanguageName
                                                              .Equals("it", StringComparison.InvariantCultureIgnoreCase));
                if (italianVoice != null)
                {
                    synth.SelectVoice(italianVoice.VoiceInfo.Name);
                }
                return synth;
            }
    
            #endregion
    }
    
    
  • Re: Come ottenere un input vocale dall'app

    Tra le altre differenze che possono essere discutibili su cosa sia meglio (probabilmente non c’è una migliore in assoluto) tra la System.Speech e la Microsoft.Speech, quella che in questo caso fa la differenza sta nel fatto che la System non supporta l’italiano (8 lingue), mentre la Microsoft supporta 26 (mi sembra) lingue scaricabili singolarmente, tra cui l’italiano. Poi in molti casi seppure si possa usare un altra lingua per riconoscere l’italiano, alcune parole non verranno riconosciute, altre invece, probabilmente con un livello “confidence” più basso, possono essere riconosciute, ma in maniera più incerta.
  • Re: Come ottenere un input vocale dall'app

    A questo punto farei un riassunto del necessario per poter far funzionare la Microsoft.Speech:

    Scaricare ed installare Microsoft Speech SDK 11 (versione x86 o x64)
    Scaricare ed installare il Language Pack in lingua italiano MSSpeech_SR_it-IT_TELE.msi e nel caso si voglia anche il tts "Lucia" (MSSpeech_TTS_it-IT_Lucia.msi) per far "parlare" il pc
    Andare in *programmi*(x86 o x64 in base a che SDK 11 si è scelto)\Micosoft SDKs\Speech\v11.0\Redist e far girare il runtime SpeechPlatformRuntime.msi (più che altro utile quando si distribuisce il programma)
    creare un nuovo progetto console (net framework 4.8 ), aggiungere il riferimento alla dll Microsoft.Speech.dll che si trova in *programmi*(x86 o x64 in base a che SDK 11 si è scelto)\Microsoft SDKs\Speech\v11.0\Assembly
    copiare il codice di esempio :
    using System;
    using Microsoft.Speech.Recognition;
    
    namespace SpeechRecognition
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (
                SpeechRecognitionEngine recognizer =
                  new SpeechRecognitionEngine(
                    new System.Globalization.CultureInfo("it-IT")))
                {
                    GrammarBuilder test = new GrammarBuilder("prova");
                    Grammar testGrammar = new Grammar(test);
                    testGrammar.Name = "Prova";
                    recognizer.LoadGrammarAsync(testGrammar);
    
                    // Add a handler for the speech recognized event.  
                    recognizer.SpeechRecognized +=
                      new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
    
                    // Configure input to the speech recognizer.  
                    recognizer.SetInputToDefaultAudioDevice();
    
                    // Start asynchronous, continuous speech recognition.  
                    recognizer.RecognizeAsync(RecognizeMode.Multiple);
    
                    // Keep the console window open.  
                    while (true)
                    {
                        Console.ReadLine();
                    }
                }
            }
    
            // Handle the SpeechRecognized event.  
            static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
                Console.WriteLine($"Recognized text: {e.Result.Text} confidence: {e.Result.Confidence}");
            }
        }
    }
    Avviare e dire al microfono "prova", il programma risponderà scrivendo in console "Recognized text: prova confidence: XXXXXX", questo perché è l'unica cosa che è istruito a fare. Per dettati e altri comandi ovviamente va predisposto.

    In caso di problemi controllare se la lingua di sistema corrisponde all'italiano, per altri problemi meglio chiedere, avolte ci si può dimenticare qualche passaggio...
Devi accedere o registrarti per scrivere nel forum
19 risposte