Powershell och ljud

Visst hade det varit kul att spela ljud eller kanske använda talsyntes för få skript att prata eller på annat sätt ge användbar feedback i form av ljud? Det är faktiskt ganska enkelt att göra detta.

Det finns inget färdigt kommando för att generera ljud. Enklaste sättet är att använda metoden Beep från den den statiska .NET-klassen System.Console.

#Standard-anrop spelar 800 Hz i 200 ms
[System.Console]::Beep()
#Spelar 500 Hz i 300 ms
[System.Console]::Beep(500,300)

Tittar vi i dokumentationen för metoden så ser vi att denna metod fungerar enbart på Windows-maskiner, både i Windows Powershell och Powershell 7. Dock ej på övriga plattformer.

En lite roligare variant är att använda talsyntes, d.v.s. att kunna omvandla textsträngar till tal. Detta kan tyckas vara ganska avancerat men faktum är att en enkel talsyntes kräver väldigt lite beräkningar, ju enklare talsyntes desto mer ”robot-röst” låter det (tänk Stephen Hawking), det fanns till och med ett litet medföljande program ”Say” i Amiga OS en gång i tiden. Kul notis är att även om talsyntesen utvecklats mycket och låter väldigt mänsklig nu så behöll Stephen Hawking sin gamla ”röst” eftersom han vant sig vid sin gamla talsyntes även om han enkelt kunde använda en röst som lät betydligt mer mänsklig.

För att använda talsyntes i Powershell så måste vi återigen använda oss av .NET objekt. Det finns flera olika klasser som skulle kunna användas, enklast är nog Microsoft Speech API (följ länken för mer dokumentation).

#Skapa ett voice-objekt
$voice = New-Object -Comobject Sapi.spvoice
#Anropa metoden Speak
$voice.Speak("Do you want to play a game?")
#Ändra hastigheten, mer än 1 snabbare, mindre än 0 långsammare
$voice.Rate = 2
#Ändra volymen 0-100, dvs nedanstående exempel sänker volymen
$voice.Volume = 70

Det går även att ändra vilken typ av röst man vill använda sig av, men vilka röster som finns kan variera beroende på OS version mm. så bäst att använda standard i ett skript.

En annan variant är att spela egna ljudfiler. Vilken klass man använder beror lite på vilket format av ljudfil man vill använda sig av. Ska man spela enkla WAV-filer då fungerar klassen SoundPlayer.

#Skapar objektet
$SPlayer=New-Object System.Media.SoundPlayer
#Anger sökväg till ljudfilen
$SPlayer.SoundLocation='C:\Sounds\Soundfile.wav'
#Spelar ljudfilen (synkront, läs om skillnaden i dokumentationen) 
$SPlayer.playsync()

Vill man spela MP3-filer så blir vi tvungna att använda en annan klass, MediaPlayer. Följande exempel skapar ett MediaPlayer-Object och spelar en MP3-fil.

Add-Type -AssemblyName presentationCore
$mediaPlayer = New-Object system.windows.media.mediaplayer
$mediaPlayer.open('C:\sounds\bike.mp3')
$mediaPlayer.Play()

Sist men inte minst så kan vi enkelt spela några av systemljuden i Windows via klassen SystemSounds nedan följer lite exempel på detta.

[System.Media.SystemSounds]::Asterisk.Play()
[System.Media.SystemSounds]::Beep.Play()
[System.Media.SystemSounds]::Exclamation.Play()
[System.Media.SystemSounds]::Hand.Play()
[System.Media.SystemSounds]::Question.Play()

Det var allt för denna gång. Ha det bra!

Jesper Nilsson

Om: Uppskattad och erfaren utbildare med bred kompetens inom flera områden och passion för lärande. Författare och skapare av itlararen.se. Microsoft Certified Trainer (MCT), CompTIA-utbildare och CISCO-instruktör sedan flera år.
Flertalet certifieringar inom relevanta områden: MCSE, MCSA, Network+, A+, Linux+, LPIC m.fl.