音声発生をシステムに組み込むためのサンプル

人工知能

 Windowsパソコンで、音声発生するシステムを開発するためのツールを開発しました。これを使えば、簡単に自社システムに音声発生の機能を組み込むことができます。

 サンプルプログラムでは、Microsoft社のコンポーネント(部品)である「TextToSpeech」コントロールを使います。

このTextToSpeechコントロール、Visual Basic 6.0全盛期の頃からすでに存在し、実はそのころからたどたどしいしゃべり方は一切変わっていません。(あまり技術の進化が見られません)

 TextToSpeechコントロールは、漢字をたまに読み間違えます。ネットワーク接続は不要です。指定したテキストをただ黙々と読み続けるコントロールなのですが、読み続けている間、処理を呼び出し元に返すことができません。そのため、このサンプルプログラムでは読み上げ部分のプログラムを別EXE化し、必要に応じてそのEXEのプロセスごと切断することで、読み上げを中断させています。

テキストを読み上げるプログラム

 以下のプログラムは、テキストを読み上げるためのプログラムです。これを別EXE化することで、文章の読み上げを中断したい時、EXEのプロセスを強制的に終了させます。

using System;
using System.Speech.Synthesis;

namespace TextToSpeech
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            string[] cmds = System.Environment.GetCommandLineArgs();
            string tts = System.Environment.CommandLine.Replace(cmds[0], "");

            SpeechSynthesizer ss = new SpeechSynthesizer();
            ss.SetOutputToDefaultAudioDevice();
            ss.Speak(tts);
        }
    }
}

テキストを読み上げるプログラムを制御するプログラム

 以下のプログラムは、テキストを読み上げるプログラムを制御するためのプログラムです。テキストボックスに記述されている文章を読み上げたり、指定したWebサイトを読み上げることができます。

using System;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Collections;
namespace TextToSpeechSample
{
    public partial class frmMain : Form
    {
        /// <summary>
        /// デフォルト コンストラクタです。
        /// </summary>
        public frmMain()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 「下の内容をしゃべらせる」ボタンのClickイベントです。
        /// </summary>
        private void btnSpeech_Click(object sender, EventArgs e)
        {
            //TextBoxの内容をしゃべらせます。
            TextToSpeech();
        }

        /// <summary>
        /// 「Webページをしゃべらせる」ボタンのClickイベントです。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnIguchiHP_Click(object sender, EventArgs e)
        {
            //Internet Explorerでikachi HPを起動します。
            SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
            ie.Navigate(txtURL.Text);
            ie.Visible = true;

            //HPが表示されきるまで待機します。
            do
            {
                Task.Delay(1000);
            } while (ie.Busy);

            //HPからテキストを取得し、TextBoxに反映します。
            txtContent.Text = ie.Document.Body.InnerText;

            //TextBoxの内容をしゃべらせます。
            TextToSpeech();
        }
        /// <summary>
        /// TextBoxの内容をしゃべらせます。
        /// </summary>
        private void TextToSpeech()
        {
            //TextBoxの内容を起動パラメータとして、TextToSpeech.exeを起動します。
            string toolPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            Process process = Process.Start(toolPath + @"\TextToSpeech.exe", txtContent.Text);
        }

        /// <summary>
        /// 「中断」ボタンのClickイベントです。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancel_Click(object sender, EventArgs e)
        {
            //TextToSpeechのすべてのインスタンスを破棄します。
            StopSpeech();
        }

        /// <summary>
        /// このフォームのFormClosingイベントです。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            //TextToSpeechのすべてのインスタンスを破棄します。
            StopSpeech();
        }

        /// <summary>
        /// TextToSpeechのすべてのインスタンスを破棄します。
        /// </summary>
        private void StopSpeech()
        {
            //カーソルを処理中にします。
            Cursor.Current = Cursors.WaitCursor;

            //TextToSpeech.exeというファイル名のプロセスをすべて取得します。
            Process[] ps = GetProcessesByFileName("TextToSpeech.exe");

            //取得したプロセスをすべて破棄します。
            foreach (Process p in ps)
            {
                p.Kill();
                p.Dispose();
            }

            //カーソルを通常に戻します。
            Cursor.Current = Cursors.Default;
        }

        /// <summary>
        /// 指定されたファイル名のインスタンスをすべて取得し、配列型で返します。
        /// </summary>
        /// <param name="searchFileName"></param>
        /// <returns></returns>
        private static Process[] GetProcessesByFileName(string searchFileName)
        {
            //すべてのプロセスを取得します。
            searchFileName = searchFileName.ToLower();
            ArrayList list = new ArrayList();

            //取得したプロセスのファイル名と、このメソッドのパラメータに指定されたファイル名を比較します。
            foreach (Process p in Process.GetProcesses())
            {
                string fileName;
                try
                {
                    fileName = p.MainModule.FileName;
                }
                catch (System.ComponentModel.Win32Exception)
                {
                    fileName = "";
                }
                if (0 < fileName.Length)
                {
                    fileName = Path.GetFileName(fileName);
                    if (searchFileName.Equals(fileName.ToLower()))
                    {
                        list.Add(p);
                    }
                }
            }

            //取得したプロセスの一覧をこのメソッドの戻り値にセットします。
            return (Process[])list.ToArray(typeof(Process));
        }
    }
}

コメント

タイトルとURLをコピーしました