努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


documents:voiceroid:assistantseika:assistantseika-091

AssistantSeikaの関係コード2

WCFサービスアクセス用クラス

WCFサービスアクセス用DLL要望が一定数あるので、C#記述のWCFアクセス用クラス WCFClient のコードを公開します。
このコードをコンパイルしてDLLをつくるなり、クラスをそのまま自身のコードに取り込むなりして利用してください。
公開するクラスのコードに関して私は権利を主張しません。
このコードを利用することで起こる問題や事象に関して当方は一切関知しませんし、何か対応を約束することもしません。

COMとして利用する場合

Dictionary<>がジェネリック型なのでCOMではつかえないそうです。残念。

DLLとする場合、COMとして利用可能にできるそうなので、見様見真似で設定を追記しました。Excel VBAとかで利用できるかもしれません。なお、私はExcelを持っていないので試しておりません。

ソースコード

コードは公開するので、自分でコンパイルしてください。

WCFClient.cs
using System.Collections.Generic;
using System.IO;
using System.ServiceModel;
using System.Threading;
 
namespace AssistantSeika
{
    public interface IWCFClient
    {
        string Version();
 
        Dictionary<int, string> GetAvatorList();
 
        Dictionary<int, Dictionary<string, string>> GetAvatorList2();
 
        Dictionary<string, Dictionary<string, Dictionary<string, decimal>>> GetDefaultParams2(int cid);
 
        Dictionary<string, Dictionary<string, Dictionary<string, decimal>>> GetCurrentParams2(int cid);
 
        double Talk(int cid, string talktext, string filepath, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions);
 
        double Talk(int cid, string talktext, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions);
 
        double Talk(int cid, string[] talktexts, string filepath, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions);
 
        double Talk(int cid, string[] talktexts, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions);
 
        void TalkAsync(int cid, string talktext, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions);
 
        void TalkAsync(int cid, string[] talktexts, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions);
    }
 
    [ServiceContract(SessionMode = SessionMode.Required)]
    interface IScAPIs
    {
        [OperationContract]
        string Verson();
 
        [OperationContract]
        Dictionary<int, string> AvatorList();
 
        [OperationContract]
        Dictionary<int, Dictionary<string, string>> AvatorList2();
 
        [OperationContract]
        Dictionary<string, Dictionary<string, Dictionary<string, decimal>>> GetDefaultParams2(int cid);
 
        [OperationContract]
        Dictionary<string, Dictionary<string, Dictionary<string, decimal>>> GetCurrentParams2(int cid);
 
        [OperationContract]
        double Talk(int cid, string talktext, string filepath, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions);
 
        [OperationContract]
        double Talk2(int cid, string[] talktexts, string filepath, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions);
 
        [OperationContract]
        void TalkAsync(int cid, string talktext, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions);
 
        [OperationContract]
        void TalkAsync2(int cid, string[] talktexts, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions);
 
    }
 
    public class WCFClient : IWCFClient
    {
        IScAPIs Api;
        ChannelFactory<IScAPIs> ScChannel;
 
        string BaseAddr = "net.pipe://localhost/EchoSeika/CentralGate/ApiEntry";
 
        public WCFClient()
        {
            ScChannel = new ChannelFactory<IScAPIs>(new NetNamedPipeBinding(), new EndpointAddress(BaseAddr));
            Api = ScChannel.CreateChannel();
 
            while (ScChannel.State != CommunicationState.Opened)
            {
                Thread.Sleep(100);
            }
        }
 
        public string Version()
        {
            return Api.Verson();
        }
 
        public Dictionary<int, string> GetAvatorList()
        {
            return Api.AvatorList();
        }
 
        public Dictionary<int, Dictionary<string, string>> GetAvatorList2()
        {
            return Api.AvatorList2();
        }
 
        public Dictionary<string, Dictionary<string, Dictionary<string, decimal>>> GetDefaultParams2(int cid)
        {
            return Api.GetDefaultParams2(cid);
        }
 
        public Dictionary<string, Dictionary<string, Dictionary<string, decimal>>> GetCurrentParams2(int cid)
        {
            return Api.GetCurrentParams2(cid);
        }
 
        public double Talk(int cid, string talktext, string filepath, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)
        {
            return Api.Talk(cid, talktext, filepath == "" ? "" : MakeFullPath(filepath), effects, emotions);
        }
 
        public double Talk(int cid, string talktext, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)
        {
            return Api.Talk(cid, talktext, "", effects, emotions);
        }
 
        public double Talk(int cid, string[] talktexts, string filepath, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)
        {
            return Api.Talk2(cid, talktexts, filepath == "" ? "" : MakeFullPath(filepath), effects, emotions);
        }
 
        public double Talk(int cid, string[] talktexts, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)
        {
            return Api.Talk2(cid, talktexts, "", effects, emotions);
        }
 
        public void TalkAsync(int cid, string talktext, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)
        {
            Api.TalkAsync(cid, talktext, effects, emotions);
        }
 
        public void TalkAsync(int cid, string[] talktexts, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)
        {
            Api.TalkAsync2(cid, talktexts, effects, emotions);
        }
 
        private string MakeFullPath(string filepath)
        {
            return Path.GetFullPath(filepath);
        }
    }
 
}

メソッド

GetAvatorList()

従来形式(SeikaCenter形式)話者一覧。

  • Dictionary<int, string> GetAvatorList()

GetAvatorList2()

もう少し詳細な話者一覧。

  • Dictionary<int, Dictionary<string, string» GetAvatorList2()

GetDefaultParams2()

cidで指定する話者のデフォルトパラメタ情報取得。

  • WCFClient.GetDefaultParams2(int cid)

GetCurrentParams2()

cidで指定する話者の現在のパラメタ情報取得。

  • WCFClient.GetCurrentParams2(int cid)

Talk()

発声。発声終了まで戻らない。

  • double Talk(int cid, string talktext, string filepath, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)
  • double Talk(int cid, string[] talktexts, string filepath, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)
  • double Talk(int cid, string talktext, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)
  • double Talk(int cid, string[] talktexts, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)

引数talktextsでテキストの配列、もしくは引数talktextでテキストを指定する。
引数filepathを““もしくは省略した場合WCFClient.Talk()は発声のみ。
引数effects、引数emotions、がnullでも構わない。
引数filepathを指定した場合WCFClient.Talk()は発声内容のWAV形式データを指定ファイル名で保存する。

TalkAsync()

非同期で発声。発声終了を待たない。

  • void TalkAsync(int cid, string talktext, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)
  • void TalkAsync(int cid, string[] talktexts, Dictionary<string, decimal> effects, Dictionary<string, decimal> emotions)

引数talktextsでテキストの配列、もしくは引数talktextでテキストを指定する。
引数effects、引数emotions、がnullでも構わない。

エフェクトパラメタ

GetDefaultParams2()で取得したDictionaryのキー”effect”に対応するValueに格納されているパラメタをこの辞書に登録する。空(要素数ゼロ)でも構わない。

  • Dictionary<string, decimal> effects

感情パラメタ

GetDefaultParams2()で取得したDictionaryのキー“emotion”に対応するValueに格納されているパラメタをこの辞書に登録する。空(要素数ゼロ)でも構わない。

  • Dictionary<string, decimal> emotions

再生時間

Talk()で返る時間/長さは、同じ文面を再生/保存させても毎回異なる。
これは、製品の機能を使わず発声の終了を自前で監視しているため、PCの状態やタイミング等の問題で変動する。 音声保存時は一度保存した音声ファイルから算出させている。

エラーがあった場合、時間/長さにマイナスの値が返る。

documents/voiceroid/assistantseika/assistantseika-091.txt · 最終更新: 2020/11/23 05:48 by k896951

ページ用ツール