Можно ли использовать поле со списком, чтобы изменить голос моего синтезатора речи на один из системных голосов TTS?

Я хотел бы иметь поле со списком в моей форме, которая позволяет пользователю выбрать голос, который он хотел бы использовать. Как я могу реализовать такую ​​функцию?

В настоящее время моя форма состоит из четырех кнопок и поля со списком. Код за кнопками и синтезатором выглядит следующим образом:

private void button1_Click(object sender, EventArgs e)
        {
            reader.Dispose();
            if (Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text != "")
            {
                reader = new SpeechSynthesizer();
                reader.SpeakAsync(Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text)
                button2.Enabled = true;
                button4.Enabled = true;
                reader.SpeakCompleted += new EventHandler<SpeakCompletedEventArgs>(reader_SpeakCompleted);
            }
            else
            {
                MessageBox.Show("Please insert text before launching Text to Speech.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        void reader_SpeakCompleted(object sender, SpeakCompletedEventArgs e)
        {
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
        }
 private void button2_Click(object sender, EventArgs e)
        {
            if (reader != null)
            {
                if (reader.State == SynthesizerState.Speaking)
                {
                    reader.Pause();
                    button3.Enabled = true;
                }
private void button3_Click(object sender, EventArgs e)
        {
            if (reader != null)
            {
                if (reader.State == SynthesizerState.Paused)
                {
                    reader.Resume();
                }
                button3.Enabled = false;
            }
            }


        private void button4_Click(object sender, EventArgs e)
        {
            if (reader != null)
            {
                reader.Dispose();
                button2.Enabled = false;
                button3.Enabled = false;
                button4.Enabled = false;
            }

Я хотел бы заполнить поле со списком установленных в данный момент голосов, который, когда пользователь нажимает один, читает текст из richTextBoxPrintCtrl1 выбранным голосом. В настоящее время синтезатор работает, но я хотел бы добавить эту функцию в мою функцию Text to Speech.

Благодарю.

1 ответ

Этот код должен делать примерно то, что вы после (если вы все еще заинтересованы:). Вам нужно будет перетащить новый comboxbox под названием "comboBox1" на вашу форму

    private SpeechSynthesizer reader = new SpeechSynthesizer();

    private void PopulateInstalledVoices()
    {
        foreach (InstalledVoice voice in
          reader.GetInstalledVoices(new CultureInfo("en-US")))
        {
            VoiceInfo info = voice.VoiceInfo;
            comboBox1.Items.Add(info.Name);
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        PopulateInstalledVoices();
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
       var voice = comboBox1.SelectedItem as String;
       if (voice != null)
       {
           reader.SelectVoice(voice);
       }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        reader.SpeakAsync("this is a test message");
    }
Другие вопросы по тегам