While setting up a lab environment today I had some time to kill and thought I would check out more recent methods for speech automation from within PowerShell. Some of the interesting aspects involved in this script are:
Get-Random - Used to select random members from the object
ArrayList object type - Used to allow the removal of array members
Get-Random - Used to select random members from the object
ArrayList object type - Used to allow the removal of array members
if ($VerbosePreferenceOrig.length -eq 0) {$VerbosePreferenceOrig = $VerbosePreference;} $VerbosePreference = "Continue"; Add-Type -AssemblyName System.Speech $Speech = New-Object -TypeName System.Speech.Synthesis.SpeechSynthesizer $Speech.Volume = 100; #create temp copies to work with $Voices = New-Object System.Collections.ArrayList; $Words = New-Object System.Collections.ArrayList; #fill the arrays which will be static Foreach ($Item in $Speech.GetInstalledVoices().VoiceInfo.Name) { $Idx = $Voices.Add($Item); } $Idx = $Words.Add("Hello, welcome to PowerShell 4.0 Part 1"); $Idx = $Words.Add("Did you know PowerShell rocks!"); $Idx = $Words.Add("What you are hearing, is written in PowerShell"); $Idx = $Words.Add("We are going to have some fun this week"); $Idx = $Words.Add("With dot net we can do a great deal"); $Idx = $Words.Add("Don't worry, use Get-Help"); #create temp copies to work with $TmpVoices = New-Object System.Collections.ArrayList; $TmpWords = New-Object System.Collections.ArrayList; #fill the temporary arrays foreach ($item in $Voices) {$Idx = $TmpVoices.Add($item);} foreach ($item in $Words) {$Idx = $TmpWords.Add($item);} For ($loop=0; $loop -lt 10; $loop++) { Write-Verbose "Starting loop $loop"; #make sure we don't completely empty the arrays if ($TmpVoices.Count -le 0) {foreach ($item in $Voices) {$Idx = $TmpVoices.Add($item);};} if ($TmpWords.Count -le 0) {foreach ($item in $Words) {$Idx = $TmpWords.Add($item);};} #randomly get the voice and words to say $Voice = Get-Random -InputObject $TmpVoices; $Word = Get-Random -InputObject $TmpWords; #remove these from the selection for less repetition ( $TmpVoices.Remove($Voice); $TmpWords.Remove($Word); Write-Verbose "Voice: $($Voice)"; Write-Verbose "Words: $($Word)"; $Speech.SelectVoice($Voice); $Speech.Speak($Word); Start-Sleep -Seconds 3; } Write-Host "Script Done!"; $VerbosePreference = $VerbosePreferenceOrig;