System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта

197
30 мая 2018, 15:10

Есть программа, вот её код

    using System;
    using System.IO;
    using System.Threading;
    using System.Windows.Forms;
    using NAudio.Wave;
    using YandexAPI.SpeechKitCloud;
    using YandexAPI.SpeechKitCloud.ASR;
    using YandexAPI.SpeechKitCloud.TTS;
    using MySql.Data.MySqlClient;
    using System.Data;
    using System.Media;
    using System.Windows;
    using System.Threading.Tasks;
    using System.Net;
    using WMPLib;
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            static string name;
            WindowsMediaPlayer audio = new WindowsMediaPlayer();
            string connStr = "server=localhost;user=root;database=smarthome;port=3306;password=root;SslMode=none";
            YandexASR asr = new YandexASR("key");
 YandexTTS tts = new YandexTTS("key");
            private WaveIn waveIn;
            private ParserCommand parser;
            public Form1()
            {
                InitializeComponent();
                waveIn = new WaveIn();
                waveIn.DeviceNumber = 0;
                waveIn.DataAvailable += DataAvailable;
                waveIn.RecordingStopped += RecordingStopped;
                waveIn.WaveFormat = new WaveFormat(8000, 1);
                parser = new ParserCommand(waveIn.WaveFormat);
                waveIn.StartRecording();
            }
            private void DataAvailable(object sender, WaveInEventArgs e)
            {
                if (InvokeRequired)
                {
                    BeginInvoke(new EventHandler<WaveInEventArgs>(DataAvailable), sender, e);
                }
                else
                {
                    parser.ParseAudioSegment(e);
                    if (File.Exists("1.wav"))
                    {
                        byte[] voice = File.ReadAllBytes("1.wav");
                        AsrResponse response = asr.VoiceToText(voice, Topic.Queries, Lang.Ru, AudioFormat.WAV); //Получаем варианты текста из голоса
                        foreach (Variant variant in response.Variants)
                            textBox1.Text = variant.Text;
                        try { File.Delete("1.wav"); } catch { }
                        if (textBox1.TextLength > 1)
                        {
                            //создаем параметризированный запрос
                            MySqlConnection conn = new MySqlConnection(connStr);
                            // устанавливаем соединение с БД
                            conn.Open();
                            // запрос
                            string sql = "SELECT answer FROM wordbook WHERE question = \"" + textBox1.Text + "\"";
                            // объект для выполнения SQL-запроса
                            MySqlCommand command = new MySqlCommand(sql, conn);
                            // выполняем запрос и получаем ответ
                            try { name = command.ExecuteScalar().ToString(); } catch { Console.WriteLine("Я хз ,что ответить"); return; }
                            // выводим ответ в консоль
                            Console.WriteLine(name);
                            // закрываем соединение с БД
                            conn.Close();
                            byte[] answer = tts.GetVoice(name, Lang.Ru);
                            MemoryStream stream = new MemoryStream(answer);
                            Button2_Click(button2, null);
                            tts.SaveAudio(answer, "answer", "", Format.WAV);
                                audio.URL = "answer.wav";
                                audio.PlayStateChange += new _WMPOCXEvents_PlayStateChangeEventHandler(audio_PlayStateChange);
                                audio.controls.play();




                        }
                    }
                }
            }
            void audio_PlayStateChange(int NewState)
            {
                if (NewState == (int)WMPPlayState.wmppsMediaEnded)
                {
                    audio.close();
                    audio = null;
                    Button2_Click(button2, null);
                    try
                    {
                        System.Diagnostics.Process[] prc = System.Diagnostics.Process.GetProcessesByName("wmplayer");
                        if (prc.Length > 0)
                            prc[prc.Length - 1].Kill();
                        File.Delete("answer.wav");
                    }
                    catch (Exception)
                    {
                    }
                }
            }
            private void RecordingStopped(object sender, EventArgs e)
            {
                if (InvokeRequired)
                {
                    BeginInvoke(new EventHandler(RecordingStopped), sender, e);
                }
                else
                {
                    waveIn.Dispose();
                    waveIn = null;
                }
            }
            private void Button2_Click(object sender, EventArgs e)
            {
                if (waveIn == null)
                {
                    waveIn = new WaveIn();
                    waveIn.DeviceNumber = 0;
                    waveIn.DataAvailable += DataAvailable;
                    waveIn.RecordingStopped += RecordingStopped;
                    waveIn.WaveFormat = new WaveFormat(8000, 1);
                    waveIn.StartRecording();
                    button2.Text = "Стоп";
                }
                else 
                {
                    waveIn.StopRecording();
                    button2.Text = "Старт";
                } 
            }
        }
    }

Она распознаёт речь и отвечает, первый раз всё происходит отлично, но на второй раз вылетает ошибка "System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."" на строке audio.URL = "answer.wav"; Как я понял она возникает из-за того ,что после перезагрузки исходный класс не воспринимает метод, но как это исправить не знаю. В этот момент audio = null WMPLib.WindowsMediaPlayer

READ ALSO
Не работает макрос под SolidWorks на C#

Не работает макрос под SolidWorks на C#

Пытаюсь написать макрос на шарпе под SolidWorksНиже -- неработающий участок кода

297
C#: фильтрация ip-адресов

C#: фильтрация ip-адресов

В программе нужно получить свой ip адресДелаю это такой функцией:

193
Изменение данных в XML файле

Изменение данных в XML файле

Достаю из xml файла список учеников, хочу удалить одного из них и записать измененияВот так это выглядит:

177
c# проблема с подключением проекта

c# проблема с подключением проекта

У меня в solution имеется два проектаОдин textEdit, второй textEdit

171