Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida al Visual Basic .NET - Sintesi vocale

Guida al Visual Basic .NET

Capitolo 104° - Sintesi vocale

<< Precedente Prossimo >>
Questo capitolo è scritto per VB2008!

 

Installazione del software

Nonostante esistano già librerie appartenenti al .Net Framework 3.0 scritte apposta per questo argomento, esse si reggono a loro volta su altre librerie - le SAPI - che necessitano di installazione. Per questo capitolo, avremo bisogno delle SAPI 5.1 per Windows Xp. Recatevi a questo indirizzo e troverete un elenco di files da scaricare:

  1. msttss22L.exe : si tratta del Microsoft Text-To-Speech Engine. È l'insieme di librerie che permette di far leggere un testo al computer con una voce scelta. Se avete già installato Microsoft Agent non è necessario scaricare questo componente
  2. sapi.chm : documentazione completa delle SAPI 5.1. Se volete approfondire l'argomento scaricatela pure
  3. Sp5TTIntXP.exe : pacchetto autoestraente che contiene un Microsoft Merge Module da aggiungere all'installazione normale. Con questo componente aggiuntivo potrete due usare due nuove voci, oltre al mitico Sam: Microsoft Mike e Mary
  4. SpeechSDK51.exe : contiene tutti i files per l'installazione - download obbligatorio
  5. SpeechSDK51LangPack.exe : contiene il normale installer più alcuni moduli per aggiungere il riconocimento delle lingue Cinese e Giapponese. A meno che non siate appassionati dell'Oriente, non vi conviene scaricarlo, dato che sono più di 80MB
  6. speechsdk51msm.exe : questo è un pacchetto che contiene tutti gli altri files messi insieme

Per il codice che useremo è necessario scaricare il primo e il terzo componente, ossia il pacchetto di installazione minimo. Una volta scaricati, estraete il contenuto in una qualsiasi cartelle e avviate l'eseguibile "Setup.exe", che installerà tutti i componenti necessari sul computer.

Sintesi vocale

Per la sintesi vocale il codice è molto semplice e basta un solo oggetto. Sto parlando della classe System.Speech.Synthesis.SpeechSynthesizer. Ecco una rapida panoramica dei suoi membri:

  • GetCurrentlySpokenPrompt : restituisce un oggetto Prompt (appartenente alla classe System.Speech.Synthesis) che rappresenta la frase che il sintetizzatore sta leggendo. Prompt ha solo un membro, la proprietà booleana IsCompleted, che comunica quando la lettura è terminata
  • GetInstalledVoice : restituisce una collezione di VoiceInfo che rappresentano le voci installate. Ogni oggetto della collezione espone anche delle proprietà che comunicano informazioni sulla voce
  • Pause : fa una pausa nella lettura
  • Resume : riprende a leggere. Utilizzato per riprendere dopo una chiamata a Pause()
  • SelectVoice(N As String) : seleziona la voce N come voce del sintetizzatore. La più diffusa è senza subbio "Microsoft Sam", poiché è installata di default su tutti i sistemi operativi Windows. Come dicevo prima, però, se ne possono scaricare altre dal sito Microsoft
  • SelectVoiceByHints(G As VoiceGener, A As VoiceAge) : ogni voce installata ha delle proprie caratteristiche, proprio come una voce normale. Può essere di uomo, di donna o di bambino, e in queste categorie, può avere una differente età. Questo metodo serve a selezionare una voce in base a questi criteri: la prima voce installata con i requisiti richiesti verrà presa e attivata. Sia G che A sono semplici enumeratori
  • SetOutputToAudioStream(S As Stream, F As AudioFormat.SpeechAudioFormatInfo) : imposta l'output del sintetizzatore su un flusso di dati, in un dato formato. Questo è un modo complesso di dire "registra la voce su un file audio": infatti se l'output non sono le casse audio ma un file (stream), la voce verrà "registrata" in quel file. Lo stream deve essere aperto, altrimenti il sintetizzatore non ci può scrivere dentro, mentre il formato deve essere creato come oggetto a se stante in precedenza, ad esempio:
    Dim Format As New AudioFormat.SpeechAudioFormatInfo( _ 
        44100, AudioFormat.AudioBitsPerSample.Sixteen, _ 
        AudioFormat.AudioChannel.Stereo)
    Dim Stream As New IO.FileStream("Voce.wav", IO.FileMode.Create)
    Synt.SetOutputToAudioStream(Stream, Format)
    Synt.Speak("Hello!")
    Synt.Dispose()
    Stream.Close() 
    Resta ancora da capire in che formato vengano salvati i dati, dato che con *.wav non funziona... Tuttavia la documentazione Microsoft non presenta nessun tipo di spiegazione, né esempi al riguardo
  • SetOutputToDefaultAudioDevice : imposta l'output del sintetizzatore sul dispositivo standard di output, ossia le casse del computer
  • SetOutputToNull : annulla l'output
  • SetOutputToWaveFile(F As String) : registra l'output del sintetizzatore sul file wave il cui percorso è specificato in F. Sicuramente, questo metodo è molto più utile di SetOutputToAudioStream. Un piccolo esempio, sempre ammettendo che Synt sia il nostro SpeechSynthesizer:
    Synt.SetOutputToWaveFile("Voce.wav")
    Synt.Speak("Hello!")
    Synt.Dispose() 
    Questo metodo registra efficacemente la frase "Hello!" sul file Voce.wav
  • SetOutputToWaveStream(S As Stream) : esattamente come il metodo precedente, solo che il parametro passato è di tipo Stream
  • Speak(S As String) : legge tutto il testo contenuto in S. Il codice non proseguirà finché non sia stato letto tutto il testo dato
  • SpeakAsync(S As String) : come sopra, solo che questo metodo continua su un thread differente e perciò non blocca l'esecuzione del codice
  • SpeakAsyncCancel : annulla la lettura di un testo
  • SpeakSsml(S As String) / SpeakSsmlAsync(S As String) : come i metodi precedenti, solo che il testo è formattato in un modo particolare. Ssml significa "Speech Synthesis Markup Language": è un linguaggio di contrassegno derivato dall'Xml che indica non solo le frasi da leggere, ma specifica anche le pronuncie, permette di mettere enfasi in una parola o di simulare un qualche stato d'animo attraverso la voce
  • State : determina lo stato del sintetizzatore (fermo, in pausa, in lettura)
  • Voice : oggetto VoiceInfo che designa la voce in uso
  • Volume : volume della voce. Penso che i valori validi siano da -10000 a 0, come per Audio e Video

Ora, far parlare il computer non è da esorcisti, infatti bastano poche linee di codice:

Imports System.Speech
Imports System.Speech.Recognition
Imports System.Speech.Synthesis

'Ricordatevi anche di importare la libreria System.Speech nel progetto,
'con Add Reference
Module Module1
    Sub Main()
        'Inizializza il nuovo sintetizzatore
        Dim Synt As New SpeechSynthesizer
        
        'Sceglie la classica voce di Microsoft Sam
        Synt.SelectVoice("Microsoft Sam")
        
        'Imposta l'output sulle casse del computer
        'In questo passaggio è obbligatorio usare un thread.
        'La ragione non è ben chiara, ma se non si fa in questo
        'modo, risulta sempre un errore di tipo ArgumentException
        Dim T As Threading.Thread
        'Imposta il nuovo thread: il suo compito principale sarà
        'di eseguire il metodo Synt.SetOutputToDefaultAudioDevice
        T = New Threading.Thread(AddressOf _ 
            Synt.SetOutputToDefaultAudioDevice)
        'Inizia il nuovo thread
        T.Start()
        'Aspetta che abbia finito per continuare
        T.Join()
        
        Dim Text As String
        Do
            Console.WriteLine("Inserisci una frase:")
            Text = Console.ReadLine
            
            'Fa leggere la frase a MS Sam
            Synt.Speak(Text)
        Loop Until Text = ""
        
        'Rilascia le risorse
        Synt.Dispose()
    End Sub
End Module 
<< Precedente Prossimo >>
A proposito dell'autore

C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...