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-ID: 231466

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

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

AnkhMorpork
AnkhMorpork 04.03.2014 um 08:23:13 Uhr
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
colinardo
colinardo 04.03.2014 aktualisiert um 15:05:18 Uhr
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
AnkhMorpork
AnkhMorpork 04.03.2014 um 09:05:07 Uhr
Goto Top
Danke fürs Statement - läßt sich gut nachvollziehen.


Gruß

ANKH