Deploying Web App - System.Speech.DLL object reference not set to instance of an object

seasiren
 
on Apr 13, 2015 12:17 AM
4584 Views

I have an ASP.NET web application that uses System.Speech to transform text to a WAV file.  It works fine locally but when I deploy it to the server, I get the below error message. This is using Windows Server 2012, ASP.NET 4.5, and IIS 8.5:

    Object reference not set to an instance of an object.
    System.Speech
       at System.Speech.Internal.ObjectTokens.RegistryDataKey..ctor(String fullPath, RegistryDataKey copyKey)
       at System.Speech.Internal.ObjectTokens.SAPICategories.DefaultDeviceOut()
       at System.Speech.Internal.Synthesis.VoiceSynthesis..ctor(WeakReference speechSynthesizer)
       at System.Speech.Synthesis.SpeechSynthesizer.get_VoiceSynthesizer()
       at QuinnSDS.handlerTransform.<>c__DisplayClass6.<ProcessRequest>b__1()


The code which is generating this error message runs on the server:

if (context.Request.ContentLength > 0)
    {
        string line = new StreamReader(context.Request.InputStream).ReadToEnd();
        // *********  generate wav file voicing the response *****************
        // Using Microsoft voices
        // initiate new instance of speech synthesizer
        Thread t = new Thread(() =>
        {
            try
            {
                // The object creation works fine
                System.Speech.Synthesis.SpeechSynthesizer synth = new System.Speech.Synthesis.SpeechSynthesizer();  
                if (synth != null)
                {
                    // The code breaks at synth.GetInstalledVoices() below. It will break any time I try to do anything with the synth object
                    foreach (System.Speech.Synthesis.InstalledVoice voice in synth.GetInstalledVoices())  
                    {
                                        System.Speech.Synthesis.VoiceInfo info = voice.VoiceInfo;
                                        string voiceName = info.Name;
                                        ws.WriteLine(voiceName);
                     }
                 }
             }
             catch (Exception e)
             {
                 ws.WriteLine(e.Message);
                 ws.WriteLine(e.Source);
                 ws.WriteLine(e.StackTrace);
             }
             //... code continues...


It does not break when the Speech Synthesis object is created; it breaks whenever I try to use that object in any way.

I'm not sure if it's an access issue but I'm pretty new to ASP.NET and IIS and I can't figure out how to give the web app access to the GAC or if that's even what the problem is. I tried changing the property Local Copy for the System.Speech reference to True in Visual Studio, before I deploy the app, but that hasn't worked. I searched online and while the "object reference not set to an instance of an object" seems fairly common, I cannot find any similar issues where it is because of a .NET framework class library...I have run the text-to-speech code locally on the server and it ran fine. I have not run the entire app locally on the server because the web app requires speech input and there is not a microphone on the server.

Download FREE API for Word, Excel and PDF in ASP.Net: Download
Mudassar
 
on Apr 13, 2015 12:45 AM

You need to check whether Speech API is available on the Windows Server OS.

Or you might have to install

https://msdn.microsoft.com/en-us/library/hh362873%28v=office.14%29.aspx