colinardo
Goto Top

Powershell - Text-to-Speech (Text zu Sprache)

Für alle die in Powershell ein Text-To-Speech benötigen, hier ein Code-Beispiel wie dies damit realisiert werden kann:
back-to-topBeispiel mit Auswahlmöglichkeit des Sprachsynthesizers (Stimme)
Add-Type -AssemblyName "System.Speech"  
$speaker = new-object System.Speech.Synthesis.SpeechSynthesizer
$speaker.SetOutputToDefaultAudioDevice()

write-host "Folgende Sprachsynthesizer sind auf dem System installiert:`r`n" -ForegroundColor Yellow -BackgroundColor Black  
$cntr = 0;
$voices = $speaker.GetInstalledVoices() | ?{$_.Enabled} | %{$_.VoiceInfo}
$voices | %{$cntr++;write-host "[$cntr] $($_.Name) ($($_.Culture))" -ForegroundColor Green}  
$choice = Read-Host "`r`nWählen sie einen Namen für die Sprachausgabe aus [1-9]"  
if ($choice -gt 0 -and $choice -le $voices.length){
    $voice = $voices[$choice -1].Name
    $speaker.SelectVoice($voice)
    $text = Read-Host "`r`nGeben Sie den Text ein der vorgelesen werden soll"  
    write-host "`r`nAusgabe erfolgt jetzt !" -BackgroundColor DarkCyan -ForegroundColor White  
    $speaker.Speak($text)
}else{
    write-host "Keine gültige Auswahl" -ForegroundColor Red  
}
oder als einfache Funktion umgesetzt
function speak([string]$text,[string]$voice = ""){  
    Add-Type -AssemblyName "System.Speech"  
    $speaker = new-object System.Speech.Synthesis.SpeechSynthesizer
    $speaker.SetOutputToDefaultAudioDevice()
    if ($voice -ne ""){  
        $speaker.SelectVoice($voice)
    }
    $speaker.Speak($text)
}
mit der dann so z.B. ein Text vorgelesen werden kann:
speak "Das ist ein Test"
Wenn Ihr wollt das die Sprachausgabe Asynchron erfolgt, also im Script nicht auf das Ende der Ausgabe gewartet werden soll, könnt Ihr das mit der SpeakAsync() Methode im obigen Code machen:
$speaker.SpeakAsync("Euer Text")
Weitere verfügbare Eigenschaften und Methoden die das SpeechSynthesizer-Objekt bietet, könnt Ihr hier nachlesen.

Grüße @colinardo

Content-Key: 231466

Url: https://administrator.de/contentid/231466

Printed on: June 22, 2024 at 23:06 o'clock

Member: AnkhMorpork
AnkhMorpork Mar 04, 2014 at 07:23:13 (UTC)
Goto Top
Hallo colinardo,

schöne Funktion und hilfreicher Link.

Folgende Variante wirkt etwas kürzer:
$Talk=New-Object -com "SAPI.spvoice"  
$Talk.Speak("Euer Text")  

Da frage ich mich: Gibts vielleicht einen elementaren Nachteil? Vielleicht zu langsam bei längeren Textpassagen?

Gruß

ANKH
Member: colinardo
colinardo Mar 04, 2014 updated at 14:05:18 (UTC)
Goto Top
Hi Ankh,
glaub ich nicht so sehr, aber ich bleibe, wenn möglich, immer bei den nativen .NET Funktionen - wenn's nicht anders geht weiche ich auf COM-Objekte aus.
Wenn ich bei .NET bleibe bin ich auch sicher das die Funktion auch auf anderen Rechnern mit installiert .NET verfügbar ist.
Aber ansonsten ist es Geschmackssache. Manchmal müssen bei COM-Objekten bestimmte Objekttypen für Powershell umgewandelt werden.

Grüße Uwe

p.s. der obige Code bietet ja mehr Optionen zu Konfiguration an (Auswahl der Stimme) deshalb ist er länger face-wink
Member: AnkhMorpork
AnkhMorpork Mar 04, 2014 at 08:05:07 (UTC)
Goto Top
Danke fürs Statement - läßt sich gut nachvollziehen.


Gruß

ANKH