SpeechSynthesizer.SelectVoice() Fails with “No mat

2019-01-29 00:43发布

问题:

I am modifying Scott Hanselman's BabySmash code to support other languages.

  1. I installed the speech platform and a new language per these steps.
  2. The language now shows up in the registry:

  3. The language can now be selected and played by Windows:

  4. System.Speech.Synthesis.SpeechSynthesizer.GetInstalledVoices() now returns the voice.

  5. However SelectVoice() in the code below throws the error "System.ArgumentException: Cannot set voice. No matching voice is installed or the voice was disabled."
string phrase = null;
SpeechSynthesizer speech = new SpeechSynthesizer();
CultureInfo keyboardCulture = System.Windows.Forms.InputLanguage.CurrentInputLanguage.Culture;
InstalledVoice neededVoice = speech.GetInstalledVoices(keyboardCulture).FirstOrDefault();
if (neededVoice == null)
{
    phrase = "Unsupported Language";
}
else if (!neededVoice.Enabled)
{
    phrase = "Voice Disabled";
}
else
{
    speech.SelectVoice(neededVoice.VoiceInfo.Name);
}

speech.Speak(phrase);
  1. I've tried upgrading to C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Speech.dll.

  2. I've verified that the versions of Microsoft.Speech.dll and the language pack match.

  3. This code works for the default voices I've already had installed.

  4. In desperation, I've even tried invoking System.Speech.Internal.Synthesis.VoiceSynthesis.GetVoice() directly through reflection, but same exact error.

I would greatly appreciate any help you can provide! Thanks.

回答1:

ha ha I feel special: this post on Python actually solved my problem: build configuration platform needs to be x64, not Any CPU!



回答2:

Another solution is to install (x64) bits version of Microsoft Speech Platform SDK and Microsoft Server Speech Platform Runtime. I think that you had installed (x86) bits of both and the plataform try to read it in (x64) bits.

I had the same problem that you but on the contrary and this works to me!



回答3:

In my case Instead of the library System.Speech.Synthesis i need to use Microsoft.Speech.Synthesis. For that we need to go to Solution Explorer on VisualStudio --> References and Browse for Microsoft.Speech.dll

using Microsoft.Speech.Synthesis;

After that you will have other Runtime Languages available.

        SpeechSynthesizer synth = new SpeechSynthesizer();    

        // Output information about all of the installed voices. 
        foreach (InstalledVoice voice in synth.GetInstalledVoices())
        {
            VoiceInfo info = voice.VoiceInfo;

            Console.WriteLine(" Name:          " + info.Name);
            Console.WriteLine(" Culture:       " + info.Culture);
            Console.WriteLine(" Age:           " + info.Age);
            Console.WriteLine(" Gender:        " + info.Gender);
            Console.WriteLine(" Description:   " + info.Description);
            Console.WriteLine(" ID:            " + info.Id);
        }


回答4:

changing the user identity to Localsystem solve my problem !