Говорящий скрипт на PowerShell

 

PowerShellсниппет

Используя PowerShell, вы можете заставить компьютер не просто выполнять нужные вам действия, но и озвучивать их голосом.

Синтезировать речь из переданного текста поможет класс платформы .NET Framework System.Speech.Synthesis::SpeechSynthesizer. Реализованные методы и свойства класса описаны в официальной документации MSDN, доступной по приведённой ссылке, поэтому я рекомендую познакомиться с ними перед тем, как перейти к рассмотрению практического использования этого класса в PowerShell скрипте.

Для начала следует подготовить текст, который будет прочитан компьютером. Это может быть введённая пользователем строка, результат выполнения команды или текст, прочитанный из файла. Для упрощения примера скрипта текст для озвучивания задан в переменной $phrase, кроме того, каждая строка скрипта снабжена комментарием для понимания происходящего.

$phrase = "I'm sorry, Dave. I'm afraid I can't do that."
# Добавление класса .NET Framework System.Speech в сеанс Windows PowerShell
Add-Type -AssemblyName System.Speech
# Создание экземпляра объекта .NET Framework
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
# Вызов метода Speak
$synth.Speak($phrase)

Этого фрагмента кода достаточно для того, чтобы начать синтезировать речь, используя стандартные настройки синтезатора. Однако класс System.Speech.Synthesis::SpeechSynthesizer реализует методы и свойства, позволяющие изменить характер синтезируемой речи. Как это сделать показано в следующем примере.

$phrase = "I'm glad to speak with you, User!"
Add-Type -AssemblyName System.Speech
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
# Выбор голоса по характеристикам
$synth.SelectVoiceByHints("Female")
# Задание скорости синтезирумой речи
$synth.Rate = "-2"
# Задание уровня громкости синтезируемой речи
$synth.Volume = "80"
$synth.Speak($phrase)

Приведённые примеры показывают, как работать с синтезатором речи в общем случае. В следующем примере показан вариант озвучивания результата проверки существования файла, что ближе к выполнению реальных задач в PowerShell.

Add-Type -AssemblyName System.Speech
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
$filename = "speak.wav"
$fullFilename = [Environment]::GetFolderPath("MyDocuments") + "\" + $filename
If (Test-Path -Path $fullFilename) {
    $phrase = "File " + $filename + " exists"
} Else {
    $phrase = "File " + $filename + " doesn't exists"
}
$synth.Speak($phrase)

Во всех примерах для вывода синтезированной речи используется аудио устройство, заданное в настройках операционной системы по умолчанию. Но вы можете не только услышать, но и сохранить озвученный текст в wav файл. Как это сделать показано в следующем примере.

$phrase = "I'm sorry, Dave. I'm afraid I can't do that."
Add-Type -AssemblyName System.Speech
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
$filename = [Environment]::GetFolderPath("MyDocuments") + "\speak.wav"
# Задание вывода в заданный Waveform аудио файл
$synth.Rate = "-3"
$synth.SetOutputToWaveFile($filename)
$synth.Speak($phrase)
# Задание вывода на аудиоустройство по умолчанию
$synth.SetOutputToDefaultAudioDevice()

Послушайте результат выполнения приведённого фрагмента кода.

Как и в каких случаях использовать синтезатор речи – решать вам, но теперь вы знаете, как заставить компьютер разговаривать, не покидая PowerShell.