棒読みちゃんプラグインの作成法 01

棒読みちゃん
棒読みちゃんは、テキストを音声で読み上げてくれるソフトです。プラグインによる機能拡張に対応しており、クリップボードや、Twitterのタイムライン、ニコニコ生放送のコメント等を読み上げさせることができます。
 
今回は、棒読みちゃんのプラグイン作成方法をご紹介します。
⇒2012/03/11 続編を執筆しました 棒読みちゃんプラグインの作成法 02


開発環境


Visual Studio

お持ちでない方はこちらから無料版(Express Edition)をインストールして下さい。
言語により Visual C++ 2010 Express 、Visual C# 2010 Express、Visual Basic 2010 Expressがありますので、
お好みのものを選択して下さい。
  
本記事ではVisualC# 2010 Professional Editionで説明しますが、他の言語でも実装方法は同じです。
 

棒読みちゃん

公式サイトにダウンロードリンクがありますのでそちらから入手します。
zip形式になっていますので、お好きなディレクトリに解凍して下さい。
なお、本記事執筆時点での最新版は、Ver0.1.10.0 です。
既にお持ちの方も、最新版かどうか確認し、最新版に更新しておいたほうが良いでしょう。
 

ドキュメント

棒読みちゃんインストールディレクトリのSampleSrcフォルダにあるSampleSrc.txtに目を通しておくとよいでしょう。
また、同フォルダに「プラグインのサンプル(時報を読み上げる)」がありますので参考になります。
 
SampleSrc.txtから要点を抜き出すと

  • 棒読みちゃんプラグインの作成=IPluginインターフェースを実装したクラスを実装すること
  • プロジェクトでIPluginインターフェースを使用するには、棒読みちゃん本体をプロジェクトの参照に追加すれば良い
  • プラグインのファイル名は「Plugin_*.dll」とする。

といったところかと思います。
 

プロジェクトの作成



VisualStudioを起動し、.NETのクラスライブラリを作成するプロジェクト(ソリューション)を新規作成します。
(C#の場合、ファイル->新規作成->プロジェクト->Windows->クラスライブラリを選択します。)
例として、プロジェクト名はPlugin_Sampleとします。
 


 

参照設定



ソリューションエクスプローラのプロジェクト名を右クリックし、参照の追加ダイアログを表示します。
参照タブで、棒読みちゃん本体(BouyomiChan.exe)のあるディレクトリに移動し、BouyomiChan.exeを選択してOKを押下します。
またはBouyomiChan.exeのコピーをプロジェクトのフォルダに格納し、それを指定してもよいでしょう。
 
 



参照設定に、BouyomiChanが追加されていればOKです。
 


 

IPluginインターフェースの実装


クラス名をPlugin_Sampleとし、IPluginインタフェースを実装するため、クラス名の後に : IPluginと記述します。
また、IPluginインタフェースの名前空間 FNF.BouyomiChanApp を追加します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FNF.BouyomiChanApp;

namespace Plugin_Sample
{
    public class Plugin_Sample : IPlugin
    {
    }
}

 
 
この状態でIPluginにマウスを合わせると、小さな三角形が出現し、「インタフェース’IPlugin’を実装します」という選択肢が出るのでクリックすると、実装するべきメンバが自動的に追加されます。
追加された全てのメンバが throw new NotImplementedException(); となっていると思いますので、その部分を書き換えて具体的な機能を実装していきます。
 
以下は、何もしないプラグインのサンプルコードです。
githubリポジトリ:https://github.com/loftkun/BouyomiChan_Plugin_Sample
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FNF.BouyomiChanApp;

namespace Plugin_Sample
{
    public class Plugin_Sample : IPlugin
    {

        #region IPlugin メンバー の実装

        /// <summary>
        /// 棒読みちゃん本体の起動時か、
        /// プラグインを有効にしたタイミングで呼ばれる
        /// </summary>
        public void Begin()
        {
            //このプラグインの設定ファイルから設定値を読み込み
            //⇒まだ実装していません。

            //棒読みちゃん本体の画面にこのプラグインのボタンを追加
            //⇒まだ実装していません。

            return;
        }

        /// <summary>
        /// プラグインの備考
        /// </summary>
        public string Caption
        {
            get { return "何もしないプラグインです。"; }
        }

        /// <summary>
        /// 棒読みちゃん本体の終了時か、
        /// プラグインを無効にしたタイミングで呼ばれる
        /// </summary>
        public void End()
        {
            //設定値をこのプラグインの設定フィルに書き込み
            //⇒まだ実装していません。

            //棒読みちゃん本体の画面からこのプラグインのボタンを削除
            //⇒まだ実装していません。

            return;
        }

        /// <summary>
        /// プラグインの名称
        /// </summary>
        public string Name
        {
            get { return "サンプルプラグイン"; }
        }

        /// <summary>
        /// プラグインの設定画面管理クラス
        /// </summary>
        public FNF.XmlSerializerSetting.ISettingFormData SettingFormData
        {
            //⇒まだ実装していません。
            get { return null; }
        }

        /// <summary>
        /// プラグインのバージョン
        /// </summary>
        public string Version
        {
            //公式プラグイン(クリップボード監視、Skype読み上げetc)の
            //バージョン表記に合わせて、
            //"西暦/月/日付版"としておくと統一感がでるでしょう。
            get { return "2012/02/26版"; }
        }
        #endregion
    }
}

 
 

動作確認


ビルドすると、Plugin_Sample.dll というファイルが生成されます。これが棒読みちゃんプラグインのファイルです。
このファイルを棒読みちゃんインストールディレクトリに格納し、棒読みちゃんを起動します。
 
 

初回起動時は右のようなダイアログが表示されます。実装したName、Captionが棒読みちゃん本体から取得できていることが分かります。まよわず はい を押します。
 


 

その他 タブに サンプルプラグイン が表示されていることを確認します。まだ設定画面は作成していないので設定ボタンは有効になりません。



以上で何もしないプラグインが作成出来ました。
続編では、RSS読み上げプラグインの作成を題材として、設定画面の実装、読み上げ機能の実装方法をご紹介します。
⇒2012/03/11 続編を執筆しました 棒読みちゃんプラグインの作成法 02

26件のコメント

  1. ピンバック:棒読みちゃんプラグインの作成法 02 | 夏研ブログ

  2. サンプルプログラムを打ち込みまして、エラーもはかず、ビルド完了して、
    棒読みちゃんに組み込んで起動してみたんですが、何も起きません。
    VS2013Professinalです。x86に指定してFremework3.5に指定したのですが。

  3. ロフトくん

    >BURIさん
    こんにちは。
    初回起動時のダイアログは出ましたでしょうか?
    よろしければVisualStudioのソリューション一式をどこかのうpろだに上げて頂けたら解析します。
    (使用した棒読みちゃん本体も添付お願いします。)

  4. ありがとうございます。
    初回起動時のダイアログも出ませんし、一覧にもありません。
    ソリューション一式はこちらです。パス2525
    http://ux.getuploader.com/blister55/download/6/Plagin_Sample.zip
    使用した棒読みちゃんはこちら
    http://ux.getuploader.com/blister55/download/7/%E6%A3%92%E8%AA%AD%E3%81%BF%E3%81%A1%E3%82%83%E3%82%93.zip

    • ロフトくん

      >BURIさん
      ソリューション名をのつづりをPlagin_Sampleにしているため、
      Plagin_Sample.dllができています。
      Plugin_Sampleで作成してみてください。

  5. ありがとうございます。スペルミスでしたね。
    外部連携で棒読みちゃんがよみあげるのではなく、棒読みちゃんの文字列を取得して、外部のプログラムで発声させたいのですが、どのような方法が考えられますでしょうか?
    外部発声プログラムはコンソールアプリでつくりました。

    • ロフトくん

      >BURIさん

      1 棒読みちゃんの文字列を取得
      2 取得した文字列を外部発声プログラムに渡す
      のような流れにするのが一例かと思います。

      1は、私が見つけた情報によると、
      以下のようにTalkTaskStartedイベントハンドラの引数eveに
      棒読みちゃんが読み上げようとしている文字列情報が入っているようです。
      (他にも使える情報があるかもしれません。)

      eve.ReplaceWord.ToString()等が使えそうです。
      VisualStudioのインテリセンス等で覗いて見て下さい。

      2は、最も簡単なのは以下のように外部プログラムを起動させて、
      コマンドライン引数で読み上げる文字列を渡すことです。
      これでとりあえず連携可能です。
      (より本格的に作りこんでいくには、外部プログラムと”プロセス間通信”により読み上げる文字列を渡す方法もあります。)

      public void Begin()
      {
          //読み上げ開始イベントハンドラの登録
          Pub.FormMain.BC.TalkTaskStarted += new EventHandler<BouyomiChan.TalkTaskStartedEventArgs>(BC_TalkTaskStarted);
          return;
      }
      
      void BC_TalkTaskStarted(object obj, BouyomiChan.TalkTaskStartedEventArgs eve)
      {
          string path = "C:\\hoge\\hoge\\コンソールアプリ.exe";
      
          //起動サンプル(非同期)
          Process.Start(path, eve.ReplaceWord.ToString());
      
          //起動サンプル(同期)
          //Process p = Process.Start(path, eve.ReplaceWord.ToString());
          //p.WaitForExit(10 * 1000);//最大10秒待つ
      
          return;
      }
      

      (追記)
      ブログのソースコード装飾機能の弊害により、
      上記サンプルのstring pathの表記が乱れることがあります。以下をお使い下さい。
      string path = “C:\\hoge\\hoge\\コンソールアプリ.exe”;

  6. 以上のソースを動作したサンプルソースの後にかけば動作するかと思い、実行してみましたが、エラーが出ます。Beginはすでに定義されているというのと
    Boyomichanの参照不足とProcessがないというエラーのようです。

    引数で発生するプログラムは書いたので、後は棒読みちゃん側だけなのですが。

    • ロフトくん

      >BURIさん
      こんばんは。
      1 Beginメソッドはブログ本文のサンプルコードのBeginメソッドと同一です。
       すでに定義済みのBeginメソッドの中に
       ”読み上げ開始イベントハンドラの登録”を実装してください。
       ( C#の文法上、同じメソッドを2つ実装することはできません。 )

      2 Boyomichanの参照不足
       using FNF.BouyomiChanApp;を追加してください
       手書きで追加する手順の他、マウスでBoyomichanを選択すると
       ポップアップで小さなアイコンが出現します。
       そのアイコンを選ぶと”using FNF.BouyomiChanApp”という項目が出ます。
       (VisualStudioで参照不足が発生した場合はまずこの手順を試すとよいです。)

      3 Processがない
       using System.Diagnostics;を追加してください。
       2と同じ手順で追加できます。

  7. Boyomichanの参照不測ですが、動作したサンプルプログラムに
    書き足したので、usingはなってます。

    あとはこのエラーだけなんですが。

  8. ロフトくん

    using FNF.Utility;でした。
    (前述の方法で、VisualStudioが自動で追加してくれるのでそちらを利用することをおすすめします。。)

  9. エラーがひとつだけつぶせません。
    エラー 1 型 ‘System.Windows.Forms.Form’ が参照されていないアセンブリで定義されています。アセンブリ ‘System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’ への参照を追加してください。
    なんですが、pubのところで出ているので、選択してみましたが変化なし、
    using System.Windows.Forms.Form
    を追加するとさらにWindowsという名前空間がないとエラーが出ます。

    • ロフトくん

      >BURIさん
      こんばんは。
      ・pubではなくPubです。
      ・Pubは using FNF.BouyomiChanApp; (既に追加済みだと思います) で使用可能になります。

  10. すみません全く記事の内容と関係ないコメントになるのですが、棒読みちゃんを起動しようとするとエラーが起きて起動が出来ません。
    エラー画面をずっと見ていたのですが、これはプログラムのコードが破損しているのでしょうか。

    お手数ですがもしよろしければご教授お願いできないでしょうか。

    • ロフトくん

      >しじみさん
      こんにちは。何かエラーのメッセージ(ダイアログとか)は表示されますか?
      その内容を教えて下さい、私に分かることがあればお答え致します。

      • お返事ありがとう御座います。
        http://gyazo.com/b3f130564e69280bd2947a2db94f0ec1

        棒読みちゃんを起動すると上記のようなエラーが出てきて応答なしになってしまいます。
        このようなエラーが起きたのがブルスクが発生したあとでした。

        • ロフトくん

          >しじみさん
          こんにちは。
          .NET Frameworkのファイルが見つからないというエラーのようですね。.NET Frameworkがインストールされていないか、インストールしてるけどファイルが足りない・壊れた・削除されたなどの症状だと思います。

          (Windows7の場合は、)コントロールパネル→プログラムのアンインストールまたは変更で、一覧にMicrosoft .NET Framwork○○○(バリエーションはいろいろある)が表示されたらインストールされていることが確認できますので見てみて下さい。

  11. ロフトくん

    >しじみさん
    こんにちは。
    http://gyazo.com/b3f130564e69280bd2947a2db94f0ec1
    から、足りないファイルは
    .NET2.0の「System.Runtime.Remoting.dll」です。

    http://gyazo.com/e448ab8cf7da68b0dd1f0c7c94cff5c1
    から、
    .NET Compact Framework 2.0はインストールされてそうですが、
    Compact Frameworkは機能縮小版の.NET Frameworkで、
    「System.Runtime.Remoting.dll」は含まれません。

    Compact Frameworkではない通常版の.NET Frameworkをインストールされてみることをおすすめします。

    https://www.microsoft.com/ja-JP/download/details.aspx?id=22
    こちらでMicrosoft .NET Framework 3.5をインストールすると
    .NET Framework 2.0、3.0、3.5のアプリケーションが動きます。

    (ちなみに.NET frameworkを消すツールは使わないほうがいいです。コントロールパネルからのアンインストールができないときなどの最終手段用です。また、もともとOSにくっついて配布される.NET frameworkは削除できないようなので注意が必要です。)

    • お返事有り難うございます!
      インストールすることができ、棒読みちゃんを起動することが出来ました!
      .netFramework2.0の一部が破損ってあるんですね…

      安易にクリーンアップツールをシないよう気をつけます。

      本当にありがとうございました!!

  12. VS2019でトライしてみたところ、
    プラグインロード失敗:
    System.BadImageFormatException: ファイルまたはアセンブリ ‘file:///C:\BouyomiChan_0_1_11_0_Beta16\Plugin_Sample.dll’、またはその依存関係の 1 つが読み込めませんでした。このアセンブリは現在読み込まれているランタイムより新しいランタイムでビルドされているため、読み込むことができません。

    というエラーが起きてしまいます。
    解決方法あったりしますか?

  13. ロフトくん

    >かんかんさん
    こんにちは。
    棒読みちゃん本体は古いフレームワーク(.NET Framework2.0)で作られているので、
    プラグインを最近のフレームワーク(.NET Framework4系など)で作るとこのようなエラーが出るようです。

    取り急ぎ、プロジェクトのフレームワークを.NET Framework3.5まで下げてみるとうまく動作します。

    • ご回答ありがとうございます。
      Frameworkの変更ができないと思っていたら、クラスライブラリを「.NET Framework」ではなく、「.NET Standard」で作っていました。

      また3.5でプラグインを正常に読み込めました。
      ありがとうございまいた。

      • ロフトくん

        >かんかんさん

        よかったです。
        見返してみるとこの記事の内容もだいぶ古くなりましたね。
        コメントありがとうございました。

  14. ピンバック:棒読みちゃん – Site-Builder.wiki

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です