I'm testing text-to-speech with this script:
Add-Type -AssemblyName System.Speech
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
$synth.SelectVoice("Gabi")
$synth.Speak("Text goes here")
The downloaded voice named "Gabi" works when I run the script in the PowerShell ISE, but regular PowerShell throws an exception saying the voice cannot be selected because it is not installed or is disabled. The built-in Microsoft voices work in both environments. Both hosts are running as administrator and in 64-bit mode, and the voice is enabled. Why can the ISE see the voice while regular PowerShell cannot?
2 Answers
First compare the voices that the Speech API actually detects in each host. Run this in both the ISE and the regular console:
$synth.GetInstalledVoices().VoiceInfo | Format-Table Name, Culture, Enabled, Id
The name passed to SelectVoice must match the detected voice name exactly; the friendly name shown in the operating system is not always the same string exposed through System.Speech. Also check the Enabled property, since a voice can be installed but unavailable to the API.
ISE and the normal console can load assemblies differently, so check the actual PowerShell and .NET host being used rather than only whether the windows are 64-bit. Compare `$PSVersionTable`, `[Environment]::Is64BitProcess`, and the output of `Get-Command powershell`. A downloaded speech voice may also register only for a particular architecture or runtime. If the voice appears in `GetInstalledVoices()` but SelectVoice still rejects it, try selecting it by the exact `VoiceInfo.Name` returned by that command instead of using a manually entered name.
Both processes report 64-bit and the standard voices behave normally. The remaining difference may be how the third-party voice registered itself with the speech engine, rather than an administrator-permission problem.

I ran that command in both environments and the lists look identical. The voice appears to be installed and enabled, so the issue does not seem to be a simple spelling mismatch.