【问题标题】:How to interrupt and stop the TTS engine in PowerShell ahead of its completion?如何在完成之前在 PowerShell 中中断和停止 TTS 引擎?
【发布时间】:2026-01-12 14:30:01
【问题描述】:

在 PowerShell 5.1.18362.752 中,当我尝试执行以下操作时:

Add-Type -AssemblyName System.Speech; $x = New-Object System.Speech.Synthesis.SpeechSynthesizer; $x.Speak('Hello. This is a sentence.')

我似乎无法在它说话的时候用 Ctrl+C 打断它。整个输入被大声读出。有没有办法在它自己完成之前阻止它?我知道我可以关闭 PowerShell 立即停止语音,但我正在寻找更优雅的东西,特别是因为我的 PS 需要一秒或多秒才能重新启动——对于我的用例,我需要能够快速中断语音无需用户等待几秒钟即可启动另一个。

【问题讨论】:

  • 顺便说一句:无法使用 Ctrl-C 适用于 PowerShell 中的任何(长时间运行的、同步的).NET 方法调用,从 7.0 开始 - 请参阅 this answer
  • 另一边:这就是您通过SAPI.SpVoice 执行此操作的方式(这是您必须在PowerShell Core 中使用的,而System.Speech.Synthesis.SpeechSynthesizer 不是支持):$tts = New-Object -ComObject SAPI.SpVoice; $tts.speak('Hello. This is a sentence.', 1); Start-Sleep -Milliseconds 300; $tts.Speak('', 2)

标签: powershell powershell-5.0


【解决方案1】:

您应该调用SpeakAsync() 异步方法而不是阻塞的Speak()

然后你可以用SpeakAsyncCancelAll()轻松停止演讲

Add-Type -AssemblyName System.Speech;
$x = New-Object System.Speech.Synthesis.SpeechSynthesizer;
$x.SpeakAsync('Hello. This is a very very very very long sentence.')
Start-Sleep 1
$x.SpeakAsyncCancelAll()

很多有用的信息可以在microsoft docs找到。

【讨论】:

    最近更新 更多