/// <summary> /// VOICEROID識別IDに対応する TItem インスタンスを設定する。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <param name="item">TItem インスタンス。</param> protected void SetItem(VoiceroidId id, TItem item) { if (item == null) { throw new ArgumentNullException(nameof(item)); } if (item.VoiceroidId != id) { throw new ArgumentException( nameof(id) + @" != " + nameof(item) + @"." + nameof(VoiceroidId)); } int index = this.Table.IndexOf(id); if (index < 0) { // 有効なIDか? if (!this.VoiceroidIds.Contains(id)) { throw new InvalidEnumArgumentException( nameof(item) + @"." + nameof(VoiceroidId), (int)id, id.GetType()); } // 新規追加 this.Table.Add(item); } else { // 更新 this.Table[index] = item; } }
/// <summary> /// VOICEROID識別IDに対応する TItem インスタンスを取得する。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <returns>TItem インスタンス。</returns> protected TItem GetItem(VoiceroidId id) { TItem item; int index = this.Table.IndexOf(id); if (index < 0) { // 有効なIDか? if (!this.VoiceroidIds.Contains(id)) { throw new InvalidEnumArgumentException( nameof(id), (int)id, id.GetType()); } // アイテムを作成して追加 item = (TItem)Activator.CreateInstance(typeof(TItem), id); this.Table.Add(item); } else { // 取得 item = this.Table[index]; } return(item); }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> public ExoCharaStyle(VoiceroidId voiceroidId) : base(voiceroidId) { // イベントハンドラ追加のためにプロパティ経由で設定 this.Render = new RenderComponent(); this.Text = new TextComponent(); this.Play = new PlayComponent(); this.PlaySpeed = new MovableValue <AudioFileComponent.PlaySpeedConst>(); }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> public ExoCharaStyle(VoiceroidId voiceroidId) : base(voiceroidId) { // イベントハンドラ追加のためにプロパティ経由で設定 this.Render = new RenderComponent(); this.Text = new TextComponent(); this.Play = new PlayComponent(); this.PlaySpeed = new MovableValue<AudioFileComponent.PlaySpeedConst>(); }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <param name="name">VOICEROID名。</param> /// <param name="product">プロダクト名。</param> /// <param name="displayProduct"> /// 表示プロダクト名。プロダクト名と同一ならば null を指定してよい。 /// </param> internal VoiceroidInfo( VoiceroidId id, string name, string product, string displayProduct = null) { this.Id = id; this.Name = name; this.Product = product; this.DisplayProduct = displayProduct ?? product; }
/// <summary> /// 指定したVOICEROID識別IDを持つ要素のインデックスを取得する。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <returns>インデックス。見つからなければ -1 。</returns> public int IndexOf(VoiceroidId id) { for (int i = 0; i < this.Count; ++i) { if (this[i].VoiceroidId == id) { return(i); } } return(-1); }
/// <summary> /// コンストラクタ> /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <param name="canSaveBlankText">空白文の音声保存を行えるならば true 。</param> public ImplBase(VoiceroidId id, bool canSaveBlankText) { if (!Enum.IsDefined(id.GetType(), id)) { throw new InvalidEnumArgumentException( nameof(id), (int)id, id.GetType()); } this.Id = id; this.CanSaveBlankText = canSaveBlankText; }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <param name="controllable">操作対象として選択可能ならば true 。</param> /// <param name="name">VOICEROID名。</param> /// <param name="keywords"> /// VOICEROIDを識別するためのキーワード列挙。キーワード不要ならば null 。 /// </param> /// <param name="appProcessName">アプリプロセス名。</param> /// <param name="product">プロダクト名。</param> /// <param name="displayProduct"> /// 表示プロダクト名。プロダクト名と同一ならば null を指定してよい。 /// </param> internal VoiceroidInfo( VoiceroidId id, bool controllable, string name, IEnumerable <string> keywords, string appProcessName, string product, string displayProduct = null) { this.Id = id; this.IsControllable = controllable; this.Name = name ?? throw new ArgumentNullException(nameof(name)); this.Keywords = new ReadOnlyCollection <string>((keywords ?? new string[0]).ToList()); this.AppProcessName = appProcessName ?? throw new ArgumentNullException(nameof(appProcessName)); this.Product = product ?? throw new ArgumentNullException(nameof(product)); this.DisplayProduct = displayProduct ?? product; }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> /// <param name="visible">表示するならば true 。</param> public VoiceroidVisibility(VoiceroidId voiceroidId, bool visible) : base(voiceroidId) { this.IsVisible = visible; }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> public VoiceroidVisibility(VoiceroidId voiceroidId) : this(voiceroidId, true) { }
/// <summary> /// 指定したVOICEROID識別IDを持つ要素が存在するか否かを取得する。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <returns></returns> public bool Contains(VoiceroidId id) => this.Any(item => item.VoiceroidId == id);
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> /// <param name="path">実行ファイルパス。</param> public VoiceroidExecutablePath(VoiceroidId voiceroidId, string path) : base(voiceroidId) { this.Path = path; }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> public YmmCharaRelation(VoiceroidId voiceroidId) : this(voiceroidId, null) { }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> public VoiceroidItemBase(VoiceroidId voiceroidId) { this.VoiceroidId = voiceroidId; }
/// <summary> /// コンストラクタ> /// </summary> /// <param name="id">VOICEROID識別ID。</param> public Voiceroid2ImplBase(VoiceroidId id) : base(id, true) { }
/// <summary> /// VOICEROID識別IDがVOICEROID2ライクなソフトウェアを示しているか否かを取得する。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <returns> /// VOICEROID2ライクなソフトウェアを示しているならば true 。 /// そうでなければ false 。 /// </returns> /// <remarks> /// VoiceroidId.V2Akari 等、ソフトウェア内キャラクターを表すIDは含めない。 /// </remarks> public static bool IsVoiceroid2LikeSoftware(this VoiceroidId id) => (id == VoiceroidId.Voiceroid2 || id == VoiceroidId.GynoidTalk);
/// <summary> /// VOICEROID識別IDに紐付く情報を取得する。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <returns>VOICEROID情報。</returns> public static VoiceroidInfo GetInfo(this VoiceroidId id) => Infos.TryGetValue(id, out var info) ? info : null;
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> /// <param name="layer"> /// レイヤー番号。範囲外ならばVOICEROID識別IDから決定する。 /// </param> public AviUtlDropLayer(VoiceroidId voiceroidId, int layer) : base(voiceroidId) => this.Layer =
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> public AviUtlDropLayer(VoiceroidId voiceroidId) : this(voiceroidId, MinLayer - 1) { }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> public VoiceroidItemBase(VoiceroidId voiceroidId) => this.VoiceroidId = voiceroidId;
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> public PlusExImpl(VoiceroidId id) : base(id, false) { }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> /// <param name="visible">表示するならば true 。</param> public VoiceroidVisibility(VoiceroidId voiceroidId, bool visible) : base(voiceroidId) => this.IsVisible = visible;
/// <summary> /// 設定を基にAviUtl拡張編集ファイル関連の処理を行う。 /// </summary> /// <param name="filePath">WAVEファイルパス。</param> /// <param name="voiceroidId">VOICEROID識別ID。</param> /// <param name="text">テキスト。</param> /// <param name="appConfig">アプリ設定。</param> /// <param name="exoConfig">AviUtl拡張編集ファイル用設定。</param> /// <param name="aviUtlFileDropService"> /// AviUtl拡張編集ファイルドロップサービス。 /// </param> /// <returns>処理結果とエラー文字列のタプル。</returns> private static async Task <Tuple <ExoOperationResult, string> > DoOperateExo( string filePath, VoiceroidId voiceroidId, string text, AppConfig appConfig, ExoConfig exoConfig, IAviUtlFileDropService aviUtlFileDropService) { if (appConfig.IsExoFileMaking) { var exoFilePath = Path.ChangeExtension(filePath, @".exo"); // 共通設定更新 ExoCommonConfig common = null; var gcmzResult = GcmzDrops.FileDrop.Result.Success; if ( appConfig.IsSavedExoFileToAviUtl && appConfig.IsExoFileParamReplacedByAviUtl) { common = exoConfig.Common.Clone(); gcmzResult = UpdateExoCommonConfigByAviUtl(ref common); } // ファイル保存 var exo = await DoOperateExoSave( exoFilePath, filePath, text, common ?? exoConfig.Common, exoConfig.CharaStyles[voiceroidId]); if (exo == null) { return (Tuple.Create( ExoOperationResult.SaveFail, @".exo ファイルを保存できませんでした。")); } // ファイルドロップ if (appConfig.IsSavedExoFileToAviUtl) { // UpdateExoCommonConfigByAviUtl で失敗しているなら実施しない var failMessage = (gcmzResult != GcmzDrops.FileDrop.Result.Success) ? MakeFailMessageFromExoDropResult(gcmzResult) : await DoOperateExoDrop( exoFilePath, exo.Length, appConfig.AviUtlDropLayers[voiceroidId].Layer, aviUtlFileDropService); // 処理失敗時、そもそも AviUtl が起動していないなら成功扱い if (failMessage != null && Process.GetProcessesByName(@"aviutl").Length > 0) { return(Tuple.Create(ExoOperationResult.DropFail, failMessage)); } } } return(Tuple.Create(ExoOperationResult.Success, (string)null)); }
/// <summary> /// VOICEROIDプロセスを取得する。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <returns>プロセス。</returns> public IProcess Get(VoiceroidId id) => this.Processes.First(p => p.Id == id);
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> public VoiceroidExecutablePath(VoiceroidId voiceroidId) : this(voiceroidId, null) { }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> /// <param name="ymmCharaName"> /// 『ゆっくりMovieMaker』のキャラ名。 null ならばVOICEROID識別IDから決定する。 /// </param> public YmmCharaRelation(VoiceroidId voiceroidId, string ymmCharaName) : base(voiceroidId) { this.YmmCharaName = ymmCharaName ?? voiceroidId.GetInfo()?.Name ?? ""; }
/// <summary> /// VOICEROID識別IDに対応するアイテムを取得するインデクサ。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> public TItem this[VoiceroidId id] => this.GetItem(id);
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voiceroidId">VOICEROID識別ID。</param> /// <param name="layer"> /// レイヤー番号。範囲外ならばVOICEROID識別IDから決定する。 /// </param> public AviUtlDropLayer(VoiceroidId voiceroidId, int layer) : base(voiceroidId) { this.Layer = (layer <MinLayer || layer> MaxLayer) ? ((int)voiceroidId * 2 + 10) : layer; }
/// <summary> /// プロセスを取得する。 /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <returns>プロセス。</returns> public IProcess Get(VoiceroidId id) { return this.Processes.First(p => p.Id == id); }
/// <summary> /// コンストラクタ> /// </summary> /// <param name="id">VOICEROID識別ID。</param> /// <param name="canSaveBlankText">空白文の音声保存を行えるならば true 。</param> public Voiceroid2ImplBase(VoiceroidId id, bool canSaveBlankText) : base(id, canSaveBlankText) { }