domenica 29 settembre 2019

.Net sintesi vocale tramite VB.Net e C#

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/programmazione/art_net-sintesi-vocale-tramite-vbnet-e-c_1645.aspx

In questo articolo vedremo come utilizzare la sintesi vocale, ossia rendere le nostre applicazioni particolari, inserendo una voce che legge del testo da noi impostato.
Questo utilizzo può essere abbinato anche alla novità del momento, ossia all’intelligenza artificiale, con il quale si possono creare progetti nel quale interagire con l’utente.
In questo articolo il lettore acquisirà le basi per applicare nelle proprie applicazioni di tipo “Windows Application” la sintesi vocale e le classi per il raggiungimento di tale scopo.
Vedremo come tramite i linguaggi di programmazione Visual Basic Net e C#, possiamo dotare le nostre applicazioni della funzionalità vocale.

Creazione del progetto

Terminata la parte introduttiva, iniziamo a creare il progetto di esempio per questo articolo.
Si crea un nuovo progetto di tipo “Windows Application” con il quale faremo vari esempi di codice per conoscere l’utilizzo della classe per la gestione della sintesi vocale.
Dopo aver creato il progetto, dobbiamo aggiungere il riferimento al Namespace per la gestione della sintesi vocale, nel quale ci fornisce le classi per utilizzare la voce.
In esplora soluzione, facciamo click con il tasto destro sul nome del progetto e poi tramite il menu di scelta rapida, selezioniamo “Aggiungi” e nel sottomenu la voce “Riferimento” in questo modo verrà aperta una finestra.
Andiamo nella paginetta denominata “Assembly” e mettiamo la spunta sulla voce “System.Speech” come riportato in figura 1.

Figura 1 – l’inserimento dello spazio dei nomi per la gestione della voce.

In questo modo abbiamo dotato il nostro progetto dell’utilizzo delle classi per la gestione della voce.
Nella finestra inseriamo 6 controlli di tipo “Button” con il quale per ogni pulsante faremo delle prove e verranno illustrati fari esempi di codice, il tutto come riportato in figura 2

Figura 2 – La form con i pulsanti posizionati

Ora che abbiamo predisposto il nostro progetto non ci resta che scrivere il codice.

Stesura del codice

Passiamo in visualizzazione codice, e nella parte in alto, sopra alla dichiarazione di classe della form, inseriamo il namespace per gestire le classi per la sintesi vocale.
Qui di seguito si riporta l’esempio per entrambi i linguaggi.



 

VB.Net

Imports System.Speech.Synthesis

 

C#

using System.Speech.Synthesis;

Ora ritorniamo in visualizzazione grafica della nostra form, e facciamo click sul primo pulsante, quello relativo all’etichetta “Voce” in questo modo si passa in visualizzazione codice per l’evento click del pulsante.
In questo evento, dobbiamo scrivere il codice per far parlare il nostro programma, tramite la classe “SpeechSynthsizer”, con il metodo “Speak” che accetta una stringa riguardante la frase da dire, permette di parlare. Il metodo “SetOutputToDefaultAudioDevice “invece imposta la voce di default.
Si riporta il frammento di codice delle suddette operazioni per entrambi i linguaggi.



VB.Net

 

Private Sub BtnVoce_Click(sender As Object, e As EventArgs) Handles BtnVoce.Click

        Try

            Dim SintesiVocale = New SpeechSynthesizer()

            SintesiVocale.SetOutputToDefaultAudioDevice()

            SintesiVocale.Speak("Buongiorno da Iprogrammatori")

        Catch ex As Exception

            MessageBox.Show("Errore: " & ex.Message)

        End Try

    End Sub

C#

private void BtnVoce_Click(object sender, EventArgs e)

        {

            try

            {

                var SintesiVocale = new SpeechSynthesizer();

                SintesiVocale.SetOutputToDefaultAudioDevice();

                SintesiVocale.Speak("Buongiorno da Iprogrammatori");

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

        }





Ritorniamo in visualizzazione grafica e facciamo doppio click sul pulsante “Elenco voci” in modo che passiamo in visualizzazione codice.
Nell’evento andremo a scrivere il codice per elencare le lingue installate sul pc. Per sapere il tipo di lingua che si possono installare e quella da aggiungere in futuro (richiede diversa memoria per ogni voce) qui https://support.microsoft.com/it-it/help/22805/windows-10-supported-narrator-languages-voices trovate le varie lingue supportate.




VB.Net

Private Sub BtnElencoVociInstallate_Click(sender As Object, e As EventArgs) Handles BtnElencoVociInstallate.Click

        Try

            Dim SintesiVocale = New SpeechSynthesizer()

 

            For Each VociInstallate In SintesiVocale.GetInstalledVoices()

                Dim infoVociInstallate = VociInstallate.VoiceInfo

MessageBox.Show("Descrizione: " & infoVociInstallate.Description & " Id: " + infoVociInstallate.Id & " Nome: " + infoVociInstallate.Name & " età: " + infoVociInstallate.Age.ToString() & " Genere Voce: " + infoVociInstallate.Gender.ToString() & " Paese: " + infoVociInstallate.Culture.Name)            Next

 

        Catch ex As Exception

            MessageBox.Show("Errore: " & ex.Message)

        End Try

    End Sub

C#

private void BtnElencoVociInstallate_Click(object sender, EventArgs e)

        {

            try

            {

 

 

                var SintesiVocale = new SpeechSynthesizer();

                foreach (var VociInstallate in SintesiVocale.GetInstalledVoices())

                {

                    var infoVociInstallate = VociInstallate.VoiceInfo;

                    MessageBox.Show("Descrizione: " + infoVociInstallate.Description + " Id: " + infoVociInstallate.Id + " Nome: " + infoVociInstallate.Name + " età: " + infoVociInstallate.Age + " Genere Voce: " + infoVociInstallate.Gender + " Paese: " + infoVociInstallate.Culture);

 

 

                }

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

        }



Ritorniamo sempre in visualizzazione codice, per fare doppio click sul pulsante denominato “Imposta voce”, in questo esempio, vedremo come possiamo impostare una voce e cultura diversa da quella impostata di default nel caso che sul nostro computer Windows 10, ne abbiamo installate.




VB.Net

 

Private Sub BtnImpostaVoce_Click(sender As Object, e As EventArgs) Handles BtnImpostaVoce.Click

        Try

            Dim SintesiVocale = New SpeechSynthesizer()

            SintesiVocale.SelectVoice("Microsoft Zira Desktop")

            SintesiVocale.Speak("Good Morning Iprogrammatori")

        Catch ex As Exception

            MessageBox.Show("Errore: " & ex.Message)

        End Try

    End Sub

 

C#

private void BtnImpostaVoce_Click(object sender, EventArgs e)

        {

            try

            {

                var SintesiVocale = new SpeechSynthesizer();

 

                SintesiVocale.SelectVoice("Microsoft Zira Desktop");

                SintesiVocale.Speak("Good Morning Iprogrammatori");

 

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

        }



Come si è visto dal frammento di codice precedente, tramite il metodo “SelectionVoice” vado ad impostare il nome della lingua installata, in questo caso è l’inglese.
Ritorniamo in visualizzazione codice, e facciamo doppio click per il pulsante “VelocitàVoce”, in questo frammento di codice, tramite la proprietà “Rate” si va impostare i tempi per la pronuncia.
Qui di seguito il frammento di codice per entrambi i linguaggi.



VB.Net

Private Sub BtnVelocitaVoce_Click(sender As Object, e As EventArgs) Handles BtnVelocitaVoce.Click

        Try

            Dim SintesiVocale = New SpeechSynthesizer()

            SintesiVocale.SetOutputToDefaultAudioDevice()

            SintesiVocale.Speak("Buongiorno da Iprogrammatori")

            SintesiVocale.Rate = 10

            SintesiVocale.Speak("Buongiorno da Iprogrammatori")

            SintesiVocale.Rate = -10

            SintesiVocale.Speak("Buongiorno da Iprogrammatori")

        Catch ex As Exception

            MessageBox.Show("Errore: " & ex.Message)

        End Try

    End Sub

 

C#

private void BtnVelocitaVoce_Click(object sender, EventArgs e)

        {

            try

            {

                //Normale

                var SintesiVocale = new SpeechSynthesizer();

                SintesiVocale.SetOutputToDefaultAudioDevice();

                SintesiVocale.Speak("Buongiorno da Iprogrammatori");

                //Veloce

                SintesiVocale.Rate = 10;

                SintesiVocale.Speak("Buongiorno da Iprogrammatori");

                //lento

                SintesiVocale.Rate = -10;

 

                SintesiVocale.Speak("Buongiorno da Iprogrammatori");

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

        }


Ora passiamo in visualizzazione grafica e facciamo doppio click sul pulsante con la dicitura “Volume” in questo modo scoprire come tramite la proprietà “Volume” si andrà ad abbassare la voce.
Nell’evento click per entrambi i linguaggi scriviamo il codice qui riportato.



VB.Net

Private Sub BtnVolume_Click(sender As Object, e As EventArgs) Handles BtnVolume.Click

        Try

            Dim SintesiVocale = New SpeechSynthesizer()

            SintesiVocale.SetOutputToDefaultAudioDevice()

            SintesiVocale.Speak("Buongiorno da Iprogrammatori")

            SintesiVocale.Volume = 10

            SintesiVocale.Speak("Buongiorno da Iprogrammatori")

        Catch ex As Exception

            MessageBox.Show("Errore: " & ex.Message)

        End Try

    End Sub

 

C#

private void BtnVolume_Click(object sender, EventArgs e)

        {

            try

            {

                //Normale

                var SintesiVocale = new SpeechSynthesizer();

                SintesiVocale.SetOutputToDefaultAudioDevice();

                SintesiVocale.Speak("Buongiorno da Iprogrammatori");

                //Molto basso

                SintesiVocale.Volume = 10;

                SintesiVocale.Speak("Buongiorno da Iprogrammatori");

 

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

        }


Siamo giunti quasi al termine della stesura del codice, l’ultimo esempio di codice, riguarda la possibilità di capire quando ha terminato di parlare, l’evento “SpeakCompleted” si utilizza con il metodo “SpeakAsync” per sollevare l’evento.

Qui di seguito il frammento di codice per entrambi i linguaggi di programmazione.


VB.Net

  Private Sub BtnEvento_Click(sender As Object, e As EventArgs) Handles BtnEvento.Click

        Try

            Dim SintesiVocale = New SpeechSynthesizer()

            AddHandler SintesiVocale.SpeakCompleted, AddressOf SintesiVocale_SpeakCompleted

            SintesiVocale.SetOutputToDefaultAudioDevice()

            SintesiVocale.SpeakAsync("Buongiorno da Iprogrammatori")

        Catch ex As Exception

            MessageBox.Show("Errore: " & ex.Message)

        End Try

    End Sub

 

    Private Sub SintesiVocale_SpeakCompleted(ByVal sender As Object, ByVal e As SpeakCompletedEventArgs)

        Try

            MessageBox.Show("Terminato ")

        Catch ex As Exception

            MessageBox.Show("Errore: " & ex.Message)

        End Try

    End Sub

C#

   private void BtnEvento_Click(object sender, EventArgs e)

        {

            try

            {

                

                var SintesiVocale = new SpeechSynthesizer();

                SintesiVocale.SpeakCompleted += SintesiVocale_SpeakCompleted;

                SintesiVocale.SetOutputToDefaultAudioDevice();

                SintesiVocale.SpeakAsync("Buongiorno da Iprogrammatori");

 

               

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

        }

   void SintesiVocale_SpeakCompleted(object sender, SpeakCompletedEventArgs e)

        {

            try

            {

               

 

                MessageBox.Show("Terminato " );

 

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

        }




Conclusioni

Ora non ci resta che testare il nostro programma e fare le varie prove con i vari pulsanti.
L’articolo ha voluto fornire al lettore le basi di programmazione per dotare le proprie applicazioni di una voce, ma le potenzialità offerte da questa classe possono tornate utili anche nei progetti di tipo “Intelligenza Artificiale” come attualmente si sente molto parlare. Uno spazio dei nomi, che offre ampie possibilità al programmatore e soprattutto facilità di utilizzo. Applicazioni che possono essere utilizzati nei settori, della gestione dei clienti, sanitario, finanziario ed altri.

Nessun commento: