ゆかりねっとの棒読みちゃん連携プラグイン~~を作り直した~~はHTTP連携

ゆかりねっとに同梱されている「棒読みちゃん」プラグインが動作しないため、~~作り直しました。~~調査した結果、私が使っている棒読みちゃんのバージョンが古かったのです。

# 結論

* 棒読みちゃんを最新版へ
* 棒読みちゃんのHTTP連携を有効にする
* ポートはデフォルトの50080固定

# 既存のプラグインがなぜ動かないのか

## コード

```cs
using System;
using System.Net;

namespace Yukarinette.Plugin.Other
{
	public class SeyanaroidPlugin : IYukarinetteInterface
	{
		public override string Name
		{
			get
			{
				return "棒読みちゃん";
			}
		}

		public override void Speech(string text)
		{
			YukarinetteLogger.get_Instance().Debug("start.");
			text.Replace("#", "＃");
			text.Replace("%", "％");
			text.Replace("&", "＆");
			string address = "http://localhost:50080/talk?text=" + text;
			new WebClient().OpenRead(address).Close();
			YukarinetteLogger.get_Instance().Debug("end.");
		}
	}
}
```

このプラグインは`http://localhost:50080`にGETして連携しようとしているが、
~~棒読みちゃんにはHTTPサーバーになる機能はデフォルトではないはずだし、軽く触った限りではゆかりねっと標準機能でも用意されていない。
このプラグイン用の50080に立てる別のアプリがあるのかと考えたが、情報不足のため見つからず。~~

この棒読みちゃんのHTTP連携機能はおよそ**Ver0.1.11.0 Beta7**から実装されている。

[ReadMe.txt](https://chi.usamimi.info/Program/Application/BouyomiChan/ReadMe.txt)
>Ver0.1.11.0 Beta7～11 (Ver0.1.11.0正式版では変更になる可能性があります)
　・Skypeプラグインの修正（多重起動時の問題）
　・HTTPサーバ機能追加/連携機能拡充(未完成)
　※他にも何か色々やってた気もするんですが思い出せません・・

私が使っていたのは**Ver0.1.11.0 Beta6**であり、長らく更新を確認していなかった[^1]ため、設定項目にもなく働きもせずどういうプラグインかもデコンパイルするまで予想できなかった。
(加えてポート50080もアプリの設定画面か同梱のサンプルソースにしか含まれておらずネットからたどれなかった)




[^1]: 失礼ながら今も更新されていると思っていなかった

~~そこで、棒読みちゃんのサンプルコードを使い、ソケット通信で直接棒読みちゃんに送ることにした。~~

それに気づかず以前からあるTCP通信で送信するプラグインを作成したのが以下である。

# コード

```cs
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace Yukarinette.Plugin.Other
{
    public class NewBouyomichanPlugin : IYukarinetteInterface
    {

        public override string Name
        {
            get
            {
                return "New棒読みちゃん";
            }
        }

        public override void Speech(string text)
        {
            byte   bCode    = 0;
            Int16  iVoice   = 1;
            Int16  iVolume  = -1;
            Int16  iSpeed   = -1;
            Int16  iTone    = -1;
            Int16  iCommand = 0x0001;

            // ストリームを閉じるとclientも閉じられるのでプロパティにはしない
            string host = "127.0.0.1";
            int    port = 50001;
            TcpClient client = null;
            try {
                client = new TcpClient(host, port);
            } catch (Exception e) {
                YukarinetteConsoleMessage.Instance.WriteMessage("[" + Name + "] 接続失敗");
                throw (YukarinetteException) e;
            }

            if (client == null ) {
                return;
            }


            Byte[] bMessage = System.Text.Encoding.UTF8.GetBytes(text);

            using (NetworkStream ns = client.GetStream()) 
            using (BinaryWriter bw = new BinaryWriter(ns)) {
                bw.Write(iCommand); //コマンド（ 0:メッセージ読み上げ）
                bw.Write(iSpeed);   //速度    （-1:棒読みちゃん画面上の設定）
                bw.Write(iTone);    //音程    （-1:棒読みちゃん画面上の設定）
                bw.Write(iVolume);  //音量    （-1:棒読みちゃん画面上の設定）
                bw.Write(iVoice);   //声質    （ 0:棒読みちゃん画面上の設定、1:女性1、2:女性2、3:男性1、4:男性2、5:中性、6:ロボット、7:機械1、8:機械2、10001～:SAPI5）
                bw.Write(bCode);    //文字列のbyte配列の文字コード(0:UTF-8, 1:Unicode, 2:Shift-JIS)
                bw.Write(bMessage.Length);  //文字列のbyte配列の長さ
                bw.Write(bMessage); //文字列のbyte配列
            }
            client.Close();
        }
    }
}
```

棒読みちゃん更新に伴いほぼ不要になったのでDLLも上げずにコードのみ供養。
どうしても50080が空いていない人が使えばいいかもしれませんが、それなら元のプラグインのポートを変えてコンパイルすればいいですね。

HTTPへのGETで読み上げ出来るのは大変手軽なのでこの更新の発見はありがたいものでした。

***

棒読みちゃんの更新は各辞書ファイルとconfigファイルだけ新棒読みちゃんに上書きすることで対応しました。