Как использовать Windows System.Speech для TTS в PowerShell 7 (или есть альтернатива) - PullRequest
2 голосов
/ 18 апреля 2020

У меня один и тот же файл profile.ps1 в WindowsPowerShell и PowerShell. Он включает команды, которые вызывают Windows Text-To-Speech. Однако эти команды не выполняются при запуске в PowerShell 7.

Ошибки возникают, когда я пытаюсь использовать объект $ PomrptTTS, который я создаю со следующим кодом:

Add-Type -AssemblyName System.speech
$PromptTTS = New-Object System.Speech.Synthesis.SpeechSynthesizer

В PowerShell 7 любая попытка доступа или использования моего объекта $ PormptTTS приводит к следующему:

SetValueInvocationException: ....\profile.ps1:82
Line |
  82 |  $PromptTTS.Rate = 0 ; $PromptTTS.Speak("Time for the $((Get-Date).DayofWeek) shuffle")
     |  ~~~~~~~~~~~~~~~~~~~
     | Exception setting "Rate": "Object reference not set to an instance of an object."

MethodInvocationException: ....\profile.ps1:82
Line |
  82 |  … e = 0 ; $PromptTTS.Speak("Time for the $((Get-Date).DayofWeek) shuffle")
     |                                             ~~~~~~~~~~~~~~~~~~~~
     | Exception calling "Speak" with "1" argument(s): "Object reference not set to an instance of an object."

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Начиная с PowerShell 7.0 /. NET Core 3.1, System.Speech.Synthesis.SpeechSynthesizer считается . NET API только для фреймворка и поэтому не поддерживается в. NET Core.

  • Обсуждение этого вопроса продолжается в этой проблеме GitHub ; поскольку базовый API имеет значение , специфицирующее c до Windows, вопрос заключается в том, стоит ли его показывать через кроссплатформенную . NET базовую платформу.

Обходной путь заключается в использовании COM-объекта SAPI.SpVoice (на котором, я полагаю, в конечном итоге основана реализация. NET Framework):

$sp = New-Object -ComObject SAPI.SpVoice
$sp.Speak("Time for the $((Get-Date).DayOfWeek) shuffle")
0 голосов
/ 29 апреля 2020
Ответ

mklement0 лучше, но если вам нужна слегка хакерская опция Windows 10+, которая работает с версией 7 (но не с версией 5), вы можете использовать вместо нее Windows Media Foundation speech api .

Вот суть, которая использует эту опцию .

Приятная вещь при использовании Windows Media Foundation - вы можете использовать все "OneCore" "голоса , которые поддерживаются в Windows Narrator, тогда как SAPI поддерживает только три голоса по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...