Come ottenere un input vocale dall'app

di il
19 risposte

Come ottenere un input vocale dall'app

Ciao a tutti, premetto subito che sono nuovissssimo nel c# e in questi ultimi giorni mi sono cimentato in un progetto molto basico per cominciare ad apprendere e mettere in pratica le prime basi di questo linguaggio. Il progetto consiste in una console app con framework .net che funge da "assistente vocale" per l'utente. Dopo avere realizzato le prime funzioni che compie l'assistente, come aprire il browser in determinate schede per soddisfare le ricerche dell'utilizzatore e fornire l'ora all'utente. Ovviamente aggiungerò altre funzioni, ma il punto è che, dopo avere utilizzato System.Speech.Synthesis come sintetizzatore vocale, ho bisogno di un metodo per far comprendere al programma i comandi attraverso l'audio. Infatti fino ad ora i comandi a cui risponde l'assistente sono scritti in user input, con Console.WriteLine();. Cercando online però, a differenza di tutte le altre informazioni che ho trovato su atri forum o sul sito ufficiale Microsoft, ho trovato solo esempii di codice che se inseriti nella mia app provocano errori che non sono nemmeno in grado di comprendere, dato che come ho scritto, anche se sono più avanzato nella programmazione Python, per quanto riguarda C# sono in alto mare. Il succo di questa pergamena è che sto cercando un metodo con cui l'applicazione ascolti ciò che l'utente dice, per poi memorizzare il testo in una variabile. Lascio qui sotto il codice dell'app.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Speech.Synthesis;
using System.Threading;

namespace AssistenteVocale
{
    class Assistente
    {
        static void Main(string[] args)
        {
            string[] saluti_in = { "Ciao!", "Buongiorno!", "Benvenuto nel tuo assistente vocale!" };
            string[] saluti_in_seconda_rep = { "Cos'altro", "Adesso cosa", "Ora cosa", "Adesso cos'altro", "Ora cos'altro" };
            string[] saluti_out = { "Alla prossima!", "Arrivederci!", "Ciao ciao!", "Ci vediamo!" };

            SpeechSynthesizer sps = new SpeechSynthesizer();
            sps.SetOutputToDefaultAudioDevice();
            sps.Rate = 2;
            sps.SelectVoice("Microsoft Elsa Desktop");

            Random saluto_in = new Random();
            int saluto_in_numero = saluto_in.Next(saluti_in.Length);

            bool riprodotto = false;
            bool prima_riproduzione = true;

            while (riprodotto == false)
            {
                if (prima_riproduzione == true)
                {
                    sps.SpeakAsync($"\n{saluti_in[saluto_in_numero]} Cosa posso fare per te?");
                    Console.WriteLine($"\n{saluti_in[saluto_in_numero]} Cosa posso fare per te?");

                }
                else if (prima_riproduzione == false)
                {
                    Thread.Sleep(3000);
                    Random saluto_in_seconda_rep = new Random();
                    int saluto_in_seconda_rep_numero = saluto_in.Next(saluti_in_seconda_rep.Length);
                    sps.SpeakAsync($"\n{saluti_in_seconda_rep[saluto_in_seconda_rep_numero]} posso fare?");
                    Console.WriteLine($"\n{saluti_in_seconda_rep[saluto_in_seconda_rep_numero]} posso fare?");
                }

                string comando_maiusc = "";
                comando_maiusc = Console.ReadLine();
                string comando = comando_maiusc.ToLower();

                //   Verificare quali parole sono presenti nel comando
                bool riprodurre_brano1 = comando.Contains("riproduci");
                bool riprodurre_brano2 = comando.Contains("riprodurre");

                //  Richiesta dell'orario
                if ((comando.Contains("ore") || comando.Contains("ora") && comando.Contains("che")))
                {
                    string datetime = DateTime.Now.ToString("HH:mm");
                    sps.SpeakAsync($"\nSono le {datetime}!");
                    Console.WriteLine($"\nSono le {datetime}!");
                    prima_riproduzione = false;
                }

                //  Richieta di riproduzione di un brano
                string brano = "";
                if (riprodurre_brano1 == true || riprodurre_brano2 == true)
                {
                    if (riprodurre_brano1 == true)
                    {
                        brano = comando.Replace("riproduci ", "");
                        string cantante = brano.Replace(" ", "+");
                        string url_cantante = ($"https://www.youtube.com/results?search_query={cantante}");
                        try
                        {
                            System.Diagnostics.Process.Start(url_cantante);
                            sps.SpeakAsync($"\nEcco i risultati di '{brano}' su YouTube.");
                            Console.WriteLine($"\nEcco i risultati di '{brano}' su YouTube.");
                        }
                        catch
                        {
                            sps.SpeakAsync($"\n{brano}: risultato non trovato. Riprova.");
                            Console.WriteLine($"\n{brano}: risultato non trovato. Riprova.");
                            riprodotto = true;
                        }
                    }
                    if (riprodurre_brano2 == true)
                    {
                        brano = comando.Replace("riprodurre ", "");
                        Console.WriteLine($"{brano}");
                    }
                    prima_riproduzione = false;
                }

                //  Richiesta di chiusura dell'assistente
                if (comando.Contains("esci") || (comando.Contains("chiudi")))
                {
                    Random saluto_out = new Random();
                    int saluto_out_numero = saluto_in.Next(saluti_out.Length);
                    sps.SpeakAsync($"{saluti_out[saluto_out_numero]}");
                    Console.WriteLine($"\n{saluti_out[saluto_out_numero]}");
                    Thread.Sleep(2000);
                    Environment.Exit(0);
                }

                //  Richiesta di ricerca online
                string oggetto_ricerca = "";

                comando = "";
            }
            Console.ReadKey();
        }
    }
}
Spero che qualcuno mi dia una mano qui

19 Risposte

  • Re: Come ottenere un input vocale dall'app

    Ciao

    Dipende molto da quello che vuoi ottenere.

    L'utente deve poter dire solo certe frasi specifiche, oppure l'utente deve poter parlare nel suo linguaggio naturale e il sistema capire cosa sta chiedendo?

    In base alla risposta ci possono essere soluzioni diverse.

    Tanto per capirci... Supponi che l'utente voglia sapere la strada per Milano.

    Se il tuo scopo è (o può essere) obbligare l'utente a dire "Qual è la strada per Milano?", allora ti basta System.Speach.
    Se invece l'utente deve poter dire anche "Come arrivo a Milano?" oppure "Come vado a Milano?", allora ti conviene usare un supporto per AI (ormai molti provider cloud li offrono, se lavori in C# forse viene più comodo Azure, però anche AWS sicuramente ce l'ha)
  • Re: Come ottenere un input vocale dall'app

    In effetti con la speech Recognition e i file grammaticali si riesce ad ottenere degli ottimi risultati, ma è chiaro che farsi tutto a mano non è facile, ma sicuramente la strada migliore per rimanere offline. Poi ci sono i vari sdk degli assistenti vocali (Cortana ormai credo che abbia maturato e sia pure caduta dall’albero rispetto agli albori) e i vari servizi online, ma appunto il problema è che necessitano di connessioni attive. O almeno era così quando ci ho lavorato diversi anni fa (credo fosse il 15 o il 16).
    Anche a livello di risorse non era esagerata la speech Recognition, io facevo girare i comandi vocali della domotica in un raspberry seconda versione (mi pare), comunque con una frequenza di 900 MHz e 1 gb di ram con w10 iot. Purtroppo Cortana non riusciva a girare li (credo per via della ram), quindi usai la Recognition. Comunque molto impegnativo fare la grammatica… ma da molta soddisfazione poi, sopratutto quando si incomincia ad usare lingue e dialetti strani o parole tipiche del posto XD per comunicare.
  • Re: Come ottenere un input vocale dall'app

    PiGi78 ha scritto:


    Ciao

    Dipende molto da quello che vuoi ottenere.

    L'utente deve poter dire solo certe frasi specifiche, oppure l'utente deve poter parlare nel suo linguaggio naturale e il sistema capire cosa sta chiedendo?

    In base alla risposta ci possono essere soluzioni diverse.

    Tanto per capirci... Supponi che l'utente voglia sapere la strada per Milano.

    Se il tuo scopo è (o può essere) obbligare l'utente a dire "Qual è la strada per Milano?", allora ti basta System.Speach.
    Se invece l'utente deve poter dire anche "Come arrivo a Milano?" oppure "Come vado a Milano?", allora ti conviene usare un supporto per AI (ormai molti provider cloud li offrono, se lavori in C# forse viene più comodo Azure, però anche AWS sicuramente ce l'ha)
    Il mio scopo sarebbe la tua seconda opzione: l'utente può dire qualsiasi cosa, e l'app compie determinate opzioni a seconda di ciò che dice.. proverò System.Speech ma credevo si usasse solo per far parlare l'app, non per ricevere input vocali Adesso cerco online ma ti faccio sapere
  • Re: Come ottenere un input vocale dall'app

    Https://docs.microsoft.com/it-it/dotnet/api/system.speech.recognition.speechrecognitionengine?view=netframework-4.8
  • Re: Come ottenere un input vocale dall'app

    best1904 ha scritto:


    Https://docs.microsoft.com/it-it/dotnet/api/system.speech.recognition.speechrecognitionengine?view=netframework-4.8
    ho già provato, sia questa che altre soluzioni online, ma ricevo un errore nella riga
    SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("it-IT"));
    l'errore è
    System.ArgumentException: 'Impossibile trovare un riconoscimento con l'ID richiesto.
    Nome parametro: culture'. Eliminando il contenuto delle parentesi tonde come pevisto riscontro invece errori nelle righe successive..
  • Re: Come ottenere un input vocale dall'app

    JacopoBiondi ha scritto:


    best1904 ha scritto:


    Https://docs.microsoft.com/it-it/dotnet/api/system.speech.recognition.speechrecognitionengine?view=netframework-4.8
    ho già provato, sia questa che altre soluzioni online, ma ricevo un errore nella riga
    SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("it-IT"));
    l'errore è
    System.ArgumentException: 'Impossibile trovare un riconoscimento con l'ID richiesto.
    Nome parametro: culture'. Eliminando il contenuto delle parentesi tonde come pevisto riscontro invece errori nelle righe successive..
    E ti arrendi per questo senza provare a combattere?
    Ok, sono passati molti anni da quando usavo questa roba, ma non mi sembra che tu abbia fatto il necessario per farlo funzionare. Anche se ammetto che non so quanto sia ancora supportato.
    Ad esempio hai scaricato il Language pack in italiano per il riconoscimento vocale (non per la sintesi, è un altra cosa....)? se no puoi provare a scaricare il Runtime qui segui i passaggi e seleziona MSSpeech_SR_it-IT_TELE.msi (L'errore che riscontri dovrebbe essere dovuto a questa mancanza)
    Hai scaricato gli SDK? allora non esisteva Nuget (diciamo che non ricordo se c'era già la bozza, comunque non si usava tanto), si scaricavano gli sdk per lavorare. In questo download dovresti trovare anche degli esempi da compilare e provare.
    trovi un primo indice della documentazione.
    Come per tutte le cose c'è da studiare... ricorda che anche chi insegna ha dovuto studiare e lavorare sul campo!
    Sicuramente Windows 10 è supportato (sia IOT per ARM; Mobile; versione completa per pc), così come Windows 7, ma immagino lo sia anche Windows 11 e se non ricordo male addirittura XP.
  • Re: Come ottenere un input vocale dall'app

    best1904 ha scritto:


    JacopoBiondi ha scritto:


    best1904 ha scritto:


    Https://docs.microsoft.com/it-it/dotnet/api/system.speech.recognition.speechrecognitionengine?view=netframework-4.8
    ho già provato, sia questa che altre soluzioni online, ma ricevo un errore nella riga
    SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("it-IT"));
    l'errore è
    System.ArgumentException: 'Impossibile trovare un riconoscimento con l'ID richiesto.
    Nome parametro: culture'. Eliminando il contenuto delle parentesi tonde come pevisto riscontro invece errori nelle righe successive..
    E ti arrendi per questo senza provare a combattere?
    Ok, sono passati molti anni da quando usavo questa roba, ma non mi sembra che tu abbia fatto il necessario per farlo funzionare. Anche se ammetto che non so quanto sia ancora supportato.
    Ad esempio hai scaricato il Language pack in italiano per il riconoscimento vocale (non per la sintesi, è un altra cosa....)? se no puoi provare a scaricare il Runtime qui segui i passaggi e seleziona MSSpeech_SR_it-IT_TELE.msi (L'errore che riscontri dovrebbe essere dovuto a questa mancanza)
    Hai scaricato gli SDK? allora non esisteva Nuget (diciamo che non ricordo se c'era già la bozza, comunque non si usava tanto), si scaricavano gli sdk per lavorare. In questo download dovresti trovare anche degli esempi da compilare e provare.
    trovi un primo indice della documentazione.
    Come per tutte le cose c'è da studiare... ricorda che anche chi insegna ha dovuto studiare e lavorare sul campo!
    Sicuramente Windows 10 è supportato (sia IOT per ARM; Mobile; versione completa per pc), così come Windows 7, ma immagino lo sia anche Windows 11 e se non ricordo male addirittura XP.
    enniente, ho fatto tutto ciò che mi hai detto ma non vuole saperne di funzionare.. continuerò a cercare anche se ormai ho spulciato mezzo internet italiano e inglese
  • Re: Come ottenere un input vocale dall'app

    Che errore da?
  • Re: Come ottenere un input vocale dall'app

    best1904 ha scritto:


    Che errore da?
    Nella riga
    SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("it-it"));
    da l'errore System.ArgumentException: 'Impossibile trovare un riconoscimento con l'ID richiesto.
    Nome parametro: culture'. Anche se originariamente al posto di "it-it" c'era "en-US" non cambia niente se lo sostituisco, l'errore è sempre quello.
  • Re: Come ottenere un input vocale dall'app

    E il parametro CultureInfo viene pure riconosciuto, perchè viene scritto in verde, quindi non capisco proprio quale sia l'errore, in rete non trovo niente di specifico che riguarda questo preciso errore..
  • Re: Come ottenere un input vocale dall'app

    Prova a vedere il secondo elemento puntato https://support.microsoft.com/en-gb/windows/windows-speech-recognition-commands-9d25ef36-994d-f367-a81a-a326160128c7
    "Speech Recognition is available only for the following languages: English (United States, United Kingdom, Canada, India, and Australia), French, German, Japanese, Mandarin (Chinese Simplified and Chinese Traditional), and Spanish."
  • Re: Come ottenere un input vocale dall'app

    gian82 ha scritto:


    Prova a vedere il secondo elemento puntato https://support.microsoft.com/en-gb/windows/windows-speech-recognition-commands-9d25ef36-994d-f367-a81a-a326160128c7
    "Speech Recognition is available only for the following languages: English (United States, United Kingdom, Canada, India, and Australia), French, German, Japanese, Mandarin (Chinese Simplified and Chinese Traditional), and Spanish."
    interessante.. però allora perchè se scrivo "en-US" al posto di "it-it", come scritto nell'esempio sul sito di Microsoft, l'errore persiste?
  • Re: Come ottenere un input vocale dall'app

    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
  • Re: Come ottenere un input vocale dall'app

    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?
Devi accedere o registrarti per scrivere nel forum
19 risposte