nakamurakko’s blog

仕事で覚えたこと、勉強したことを自分のメモ代わりに書いていこうかなと。

テキスト情報を読み上げるWindows Formsアプリケーションを作成する

前回の、テキスト情報を読み上げるUWPアプリケーションを作成するに続き、Windows Forms版を作ってみる。Windows Formsだと音声処理に別のクラスを使用する。

環境

  • Windows 10
  • Visual Studio 2019

プロジェクト作成

Windows フォーム アプリケーション(.NET Framework)のプロジェクトを作成する。

メインフォーム修正

コントロールはUWPと同じように、

  • ①読み上げボタン
  • ②音声選択コンボボックス
  • ③読み上げたいテキストを入れるテキストボックス

を、用意して、入力されたテキストを選択した音声で読み上げるようにした。 (クラス名をForm1 → MainFormに変更してから修正している。)

コンストラクターでコンボボックス用プロパティを初期化する。

/// <summary>
/// コンストラクター。
/// </summary>
public MainForm()
{
    InitializeComponent();

    // ①音声の一覧を取得する。
    using (var synth = new SpeechSynthesizer())
    {
        foreach (var item in synth.GetInstalledVoices())
        {
            VoiceComboBox.Items.Add(item.VoiceInfo);
        }
    }

    // ②使用出来る音声がある場合、音声情報の1つ目を選択する。
    if (VoiceComboBox.Items.Count > 0)
    {
        VoiceComboBox.SelectedIndex = 0;
    }

    // ③音声の名前をコンボボックスに表示する。
    VoiceComboBox.DisplayMember = nameof(VoiceInfo.Name);
}

①で音声の一覧を取得する。取得元はSystem.Speech.Synthesis.GetInstalledVoices。(UWPの場合は、Windows.Media.SpeechSynthesis.AllVoicesを使用。) 日本語以外の音声を使いたい場合は、Windowsの設定の「時刻と言語」-「音声認識」-「音声を追加」で追加する。

②で取得出来た音声情報の1番目を選択。

③で音声の名前をコンボボックスに表示する。

今回重要な、入力したテキストと選択した音声情報を読み上げる処理を作成については、サンプルがSystem.Speech.Synthesis.Speakメソッドのサイトに載っている。

サンプルを参考に、下記ボタンクリックイベントに実装した。

/// <summary>
/// 読み上げボタンクリックイベント。
/// </summary>
/// <param name="sender">呼び出し元のオブジェクト。</param>
/// <param name="e">イベントデータ。</param>
private void ReadTextButton_Click(object sender, EventArgs e)
{
    if (string.IsNullOrEmpty(ReadTextButton.Text) || VoiceComboBox.SelectedIndex < 0)
    {
        return;
    }

    try
    {
        ReadTextButton.Enabled = false;

        using (var synth = new SpeechSynthesizer())
        {
            synth.SelectVoice((VoiceComboBox.SelectedItem as VoiceInfo).Name);
            synth.SetOutputToDefaultAudioDevice();
            synth.Speak(TargeTextBox.Text);
        }
    }
    finally
    {
        ReadTextButton.Enabled = true;
    }
}

実行してみる

読み上げボタンをクリックしてテキストを読んでくれれば確認完了。

System.Speech.Synthesis.GetInstalledVoicesは、Windows.Media.SpeechSynthesis.VoiceInformationよりも取得できる音声の種類が少ないので、UWP版を使った方がいいと思う。