Pagine

domenica 11 aprile 2021

PowerShell: Sintesi vocale

La sintesi vocale è un buon modo per attirare l'attenzione dell'utente e fornire istruzioni utili in una modalità alternativa rispetto ad una finestra pop-up che appare a video. Tramite PowerShell è possibile sfruttare il sintetizzatore vocale fornito dal sistema operativo Windows per realizzare una funzione Text To Speech. L'implementazione di tale funzione tramite PowerShell è molto semplice e basterebbero le seguenti tre righe di codice
Add-Type -AssemblyName System.speech
$SpeechSynthesizer = New-Object System.Speech.Synthesis.SpeechSynthesizer
$SpeechSynthesizer.Speak('Hello..')
PowerShell - Sintetizzatore vocale
FIG 1 - PowerShell - Sintetizzatore vocale
Come è noto, Powershell è basato sulla programmazione ad oggetti e sul .NET Framework. Questo ci consente di richiamare direttamente la classe System.Speech.Synthesis.SpeechSynthesizer che fornisce l'accesso alle funzionalità del motore di sintesi vocale installato. 


Per visualizzare l'elenco dei metodi supportati e le proprietà, dopo aver eseguito le istruzioni sopra riportate, è possibile utilizzare l'istruzione
$SpeechSynthesizer | Get-Member
Metodi e Proprietà dell'oggetto System.Speech.Synthesis.SpeechSynthesizer
FIG 2 - Metodi e Proprietà dell'oggetto System.Speech.Synthesis.SpeechSynthesizer


Proprietà

Le proprietà dell'oggetto SpeechSynthesizer sono:

Rate
Ottiene o imposta la velocità di pronuncia dell'oggetto SpeechSynthesizer. I valori accettati vanno da -10 a 10.

State
Ottiene lo stato di pronuncia dell'oggetto SpeechSynthesizer.

Voice
Ottiene informazioni sulla voce corrente dell'oggetto SpeechSynthesizer.

Volume
Ottiene o imposta il volume di output dell'oggetto SpeechSynthesizer. Il volume può essere impostato passando valori da 0 a 100.

Ad esempio per rallentare la pronuncia possiamo utilizzare l'istruzione
$SpeechSynthesizer.Rate   = -5  
I valori assegnabili a Rate vanno da -10 a 10. Con il valore -10 la pronuncia è più lenta, aumentando il valore la pronuncia diventa sempre più veloce fino alla massima velocità ottenibile con il valore 10.

Metodi

AddLexicon(Uri, String)
Aggiunge un lessico all'oggetto SpeechSynthesizer.

Dispose()
Elimina l'oggetto SpeechSynthesizer e rilascia le risorse usate durante la sessione.

Equals(Object)
Determina se l'oggetto specificato è uguale all'oggetto corrente.(Ereditato da Object)

GetCurrentlySpokenPrompt()
Ottiene il prompt che SpeechSynthesizer sta parlando.

GetHashCode()
Funge da funzione hash predefinita.(Ereditato da Object)

GetInstalledVoices()
Restituisce tutte le voci di sintesi vocale installate.

GetType()
Ottiene l'oggetto Type dell'istanza corrente.(Ereditato da Object).

Pause()
Mette in pausa l'oggetto SpeechSynthesizer.

RemoveLexicon(Uri)
Rimuove un lessico dall'oggetto SpeechSynthesizer.

Resume()
Riprende l'oggetto SpeechSynthesizer dopo che è stato messo in pausa.

SelectVoice(String)
Seleziona una voce specifica per nome.

SelectVoiceByHints(VoiceGender)
Seleziona una voce con genere specifico.

SelectVoiceByHints(VoiceGender, VoiceAge)
Seleziona una voce con genere ed età specifici.

SelectVoiceByHints(VoiceGender, VoiceAge, Int32)
Seleziona una voce con genere ed età specifici, in base alla posizione in cui le voci sono ordinate.

SelectVoiceByHints(VoiceGender, VoiceAge, Int32, CultureInfo)
Seleziona una voce con genere, età e impostazioni locali specifici, in base alla posizione in cui le voci sono ordinate.

SetOutputToAudioStream(Stream, SpeechAudioFormatInfo)
Configura l'oggetto SpeechSynthesizer per aggiungere l'output a un flusso audio.

SetOutputToDefaultAudioDevice()
Configura l'oggetto SpeechSynthesizer per inviare l'output al dispositivo audio predefinito.

SetOutputToNull()
Configura l'oggetto SpeechSynthesizer per non inviare l'output dalle operazioni di sintesi di un dispositivo, file o flusso.

SetOutputToWaveFile(String)
Configura l'oggetto SpeechSynthesizer per aggiungere l'output a un file che contiene l'audio in formato Waveform.

SetOutputToWaveFile(String, SpeechAudioFormatInfo)
Configura l'oggetto SpeechSynthesizer per aggiungere l'output a un file in formato audio Waveform in un formato specificato.

SetOutputToWaveStream(Stream)
Configura l'oggetto SpeechSynthesizer per aggiungere l'output a un flusso che contiene l'audio in formato Waveform.

Speak(Prompt)
In modo sincrono sul contenuto di un oggetto di Prompt.

Speak(PromptBuilder)
In modo sincrono sul contenuto di un oggetto di PromptBuilder.

Speak(String)
In modo sincrono legge il contenuto di una stringa.

SpeakAsync(Prompt)
In modo asincrono legge il contenuto di un oggetto di Prompt.

SpeakAsync(PromptBuilder)
In modo asincrono legge il contenuto di un oggetto di PromptBuilder.

SpeakAsync(String)
In modo asincrono legge il contenuto di una stringa.

SpeakAsyncCancel(Prompt)
Annulla l'operazione asincrona di sintesi per una richiesta in coda.

SpeakAsyncCancelAll()
Annulla tutte le operazioni asincrone di sintesi vocale in coda.

SpeakSsml(String)
In modo sincrono legge un oggetto String che contiene il markup SSML.

SpeakSsmlAsync(String)
In modo asincrono legge un String che contiene il markup SSML.

ToString()
Restituisce una stringa che rappresenta l'oggetto corrente.(Ereditato da Object)


L'oggetto SpeechSynthesizer creato utilizza la voce di sistema predefinita. Per configurare l'oggetto SpeechSynthesizer per l'utilizzo di una delle voci di sintesi vocale installate è possibile utilizzare il metodo SelectVoice oppure SelectVoiceByHints

Per visualizzare l'elenco delle voci installate nel sistema è possibile utilizzare la seguente istruzione
Foreach ($voice in $SpeechSynthesizer.GetInstalledVoices()){
    $Voice.VoiceInfo | Select-Object Gender, Name, Culture, Description
}
Sintetizzatore vocale, voci installate nel sistema
FIG 3 - Sintetizzatore vocale, voci installate nel sistema


Esempi

Esempio 1
Add-Type -AssemblyName System.speech
$SpeechSynthesizer = New-Object System.Speech.Synthesis.SpeechSynthesizer
$SpeechSynthesizer.SelectVoice('Microsoft Zira Desktop')
Modifica la voce utilizzata selezionando Microsoft Zira Desktop

Esempio 2
Add-Type -AssemblyName System.speech
$SpeechSynthesizer = New-Object System.Speech.Synthesis.SpeechSynthesizer
$SpeechSynthesizer.Speak("La data e l'ora corrente è $(Get-Date)")
Il sintetizzatore legge la data e l'ora corrente.

Esempio 3
Add-Type -AssemblyName System.speech
$SpeechSynthesizer = New-Object System.Speech.Synthesis.SpeechSynthesizer
$SpeechSynthesizer.SetOutputToWaveFile("$($PWD)\Voice.wav")
$SpeechSynthesizer.Speak('Ciao! Giovanni')
L'output viene salvato all'interno del file audio Voice.wav, ciò consente di creare un file audio contenente tutto quello che viene letto dal sintetizzatore vocale.

Esempio 4
Add-Type -AssemblyName System.speech
$SpeechSynthesizer = New-Object System.Speech.Synthesis.SpeechSynthesizer
$SpeechSynthesizer.Rate   = -5  
$Frasi = "C:\Temp\ElencoFrasi.csv"
$FraseRandom (Get-Content $Frasi) | Get-Random
$SpeechSynthesizer.Speak($FraseRandom)
Dal file ElencoFrasi.csv contenente un elenco di frasi viene prelevata una frase casuale e fatta leggere al sintetizzatore.

Esempio 5
Add-Type -AssemblyName System.speech
$SpeechSynthesizer = New-Object System.Speech.Synthesis.SpeechSynthesizer
$SpeechSynthesizer.Rate   = -3  
$FraseRandom = @("Ciao.", "Come posso aiutarti?", "Cosa stai facendo $env:USERNAME ?") | Get-Random
$SpeechSynthesizer.Speak($FraseRandom)
Analogo all'Esempio 4 ma questa volta la frase random viene selezionata da un array



Nessun commento:

Posta un commento

I messaggi sono soggetti a moderazione da parte dell'amministratore prima della loro pubblicazione.