努力したWiki

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

ユーザ用ツール

サイト用ツール


サイドバー

メニュー

インデックス

documents:windows:windows-023

VOICEROID+EXをコマンドラインからしゃべらせる

2017/08/16

2016/09/14

  • 自分の理解用に作成。色々な方が公開しているソフトウエアのソースを参考に、自分なりの理解をしつつ作ったもの。
    デフォルトは VOICEROID+ 京町セイカEX です。

概要

起動しているVOICEROIDにウインドウメッセージでテキストを送り、発声させます。
先人や先駆者が提供しているような、ニコ動のコメントを読み上げしたり、ツイッターのツイートやスカイプのメッセージを読み上げたりするものではありません。
プログラム名は、echo コマンドで文字列表示のかわりにセイカさんに喋らせるから echoseika です。そのまま名前にしました。

自分の理解のためのプログラムで、後々Windowsのメッセージを飛ばすようなプログラムを作るときの参照コードとしてソース公開をしています。
※ATR503全文の読み上げをさせるのにVOICEROIDを使うかー、と決めたら出来上がってました。何か強いきっかけが無いとなかなか動けないですよねぇ。

2017/08/11公開版で音声効果パラメタ指定を追加するきっかけとなったのは、SoLA2さんという方のブログ記事です。
説明とExcelシートのキャプチャ画像見て「あ、音声効果指定できないばかりに申し訳ないなー」と思ってしまったのが今回の強いきっかけですね。※喜んで頂けた様でなにより

ダウンロード

VOICEROID+/VOICEROID+EXをコマンドラインからしゃべらせるコマンド 2017/08/17公開 DLLリビルドバージョン
VOICEROID+/VOICEROID+EXをコマンドラインからしゃべらせるコマンド 2017/08/11公開版

アーカイブに含まれる echoSeikAPI.dll と echoseika.exe を同じ場所に配置してください。
2017/08/11公開版は echoseika.exe のみです。

対応 VOICEROID の説明

現時点では Windows10 64bit版上で 京町セイカ(SEIKA)、民安ともえ(TAMMY)、結月ゆかり(YUKARI)、東北ずん子(ZUNKO)、鷹の爪 吉田くん(YOSHIDA)、琴葉茜/葵(AKANE/AOI) の6製品でしか確認が取れていません。

購入していない製品については、メーカーサイトのスクリーンキャプチャを見て、VOICEROID+ 京町セイカ EXのUIに類似のものなら動くだろうという判断で処理を追加しただけです。

VOICEROID 起動方法(起動例) 音声効果 備考
VOICEROID+ 京町セイカ EX echoseika.exe おはようございます。涼しい朝ですね。 動作確認した
VOICEROID+ 東北ずん子 echoseika.exe -cv ZUNKO おはようございます。涼しい朝ですね。 動作確認した
VOICEROID+ 民安ともえ echoseika.exe -cv TAMMY おはようございます。涼しい朝ですね。 × 動作確認した
VOICEROID+ 結月ゆかり echoseika.exe -cv YUKARI おはようございます。涼しい朝ですね。 × 動作確認した
VOICEROID+ 鷹の爪吉田くん echoseika.exe -cv YOSHIDA おはようございます。涼しい朝ですね。 × 動作確認した
VOICEROID+ 琴葉 茜・葵 echoseika.exe -cv AKANE おはようございます。涼しい朝ですね。 動作した報告あり。
http://sola2-tech.hatenablog.com/entry/2017/08/06/233218
echoseika.exe -cv AOI おはようございます。涼しい朝ですね。
VOICEROID+ 民安ともえ EX echoseika.exe -cv TAMMY_EX おはようございます。涼しい朝ですね。 製品を持ってないので試していない
VOICEROID+ 結月ゆかり EX echoseika.exe -cv YUKARI_EX おはようございます。涼しい朝ですね。 製品を持ってないので試していない
VOICEROID+ 東北ずん子 EX echoseika.exe -cv ZUNKO_EX おはようございます。涼しい朝ですね。 製品を持ってないので試していない
VOICEROID+ 東北きりたん EX echoseika.exe -cv KIRITAN おはようございます。涼しい朝ですね。 製品を持ってないので試していない
VOICEROID+ 鷹の爪 吉田くん EX echoseika.exe -cv YOSHIDA_EX おはようございます。涼しい朝ですね。 製品を持ってないので試していない
VOICEROID+ 月読アイ EX echoseika.exe -cv AI_EX おはようございます。涼しい朝ですね。 製品を持ってないので試していない
VOICEROID+ 月読ショウタ EX echoseika.exe -cv SHOUTA_EX おはようございます。涼しい朝ですね。 製品を持ってないので試していない
VOICEROID+ 水奈瀬コウ EX echoseika.exe -cv MINASE おはようございます。涼しい朝ですね。 製品を持ってないので試していない

音声効果パラメタの指定は、VOICEROID+ 東北ずん子 と 琴葉姉妹、VOICEROID+EX のシリーズのみ有効(な筈)です。

プログラムの説明

コマンドプロンプトから、テキストをVOICEROID+/VOICEROID+EXに送り、音声再生/音声保存させるプログラム(コマンド)、echoseika.exe です。

使用に際しては、先に使いたいVOICEROID+/VOICEROID+EXを起動しておく必要があります。

“-h” オプションでヘルプを表示できます。

H:\seikaspeak>echoseika -h
usage: echoseika [[[option1] option2] ... optionN] TalkText

options:
-cv voiceroid   : use voiceroid name. default is SEIKA
       SEIKA      VOICEROID+ 京町セイカ EX
       YOSHIDA_EX VOICEROID+ 鷹の爪 吉田くん EX
       AI_EX      VOICEROID+ 月読アイ EX
       SHOUTA_EX  VOICEROID+ 月読ショウタ EX
       MINASE     VOICEROID+ 水奈瀬コウ EX
       KIRITAN    VOICEROID+ 東北きりたん EX
       ZUNKO      VOICEROID+ 東北ずん子
       ZUNKO_EX   VOICEROID+ 東北ずん子 EX
       TAMMY_EX   VOICEROID+ 民安ともえ EX
       YUKARI_EX  VOICEROID+ 結月ゆかり EX
       AKANE      VOICEROID+ 琴葉茜
       AOI        VOICEROID+ 琴葉葵
       TAMMY      VOICEROID+ 民安ともえ
       YUKARI     VOICEROID+ 結月ゆかり
       YOSHIDA    VOICEROID+ 鷹の爪 吉田くん
-wav wavefile   : save the voice data to wavefile.wav
-volume P       : volume of voice effetct.     P= 0.00 - 2.00
-speed P        : speed of voice effetct.      P= 0.50 - 4.00
-pitch P        : pitch of voice effetct.      P= 0.50 - 2.00
-intonation P   : intonation of voice effetct. P= 0.00 - 2.00
TalkText        : send the "TalkText" to VOICEROID

H:\seikaspeak>

デフォルトは京町セイカになっています。

音声再生

例えば VOICEROID+ 京町セイカ EX を起動してから、コマンドプロンプトを開き echoseika.exe を実行します。

H:\echosaika>echoseika おはようございます。涼しい朝ですね。

音声が再生されたと思います。

すでにVOICEROIDが音声再生中だった場合、プログラムは最大3分待ちます。

使用するVOICEROIDの指定

VOICEROID+ 民安ともえを使う場合は -cv tammy オプションで指定します。

H:\echosaika>echoseika -cv tammy おはようございます。涼しい朝ですね。

琴葉姉妹を使用する際には目的のキャラクターへ切り替えておく必要があります。 あれ?琴葉姉妹って、クライアントがそれぞれ用にあるのね。同時に存在できるの http://sola2-tech.hatenablog.com/entry/2017/08/11/234340 見るまで知らなかった。恥ずかしい。

音声保存

-wav オプションを指定する事で音声データ(Waveファイル)を保存できます。

H:\echoseika>echoseika -wav goodmorning おはようございます。希望の朝です!

H:\echoseika>DIR GOOD*
 H:\echoseika のディレクトリ

2016/09/17  22:17                34 goodmorning.txt
2016/09/17  22:17           127,682 goodmorning.wav
               2 個のファイル             127,716 バイト
               0 個のディレクトリ  1,768,407,678,976 バイトの空き領域

H:\echoseika>

オプション -wav goodmorning を指定した結果、音声ファイル goodmorning.wav、発声したテキストが goodmorning.txt、に保存されます。

なお、ファイル上書きはサポートしていません。同じ名前で保存する場合は、面倒ですが必ずファイルを消してください。

音声効果パラメタ指定

音量、話速、高さ、抑揚のパラメタをオプションで指定します。
事前にVOICEROID+/VOICEROID+EXの音声効果ウインドウ(音声効果タブ)を表示しておかないと適用されません。
大丈夫な設定

以下の画面のままだと、コマンドラインで指定した音声効果パラメタが適用されません。 駄目な設定

オプション -volume P で音量を指定します。
オプション -speed P、-pitch P、-intonation P、でそれぞれ話速、高さ、抑揚を指定します。

指定なし
H:\>echoseika 夜ふかししていると、余計に歳を取っちゃいますよ


-speed
H:\>echoseika -speed 1.3 夜ふかししていると、余計に歳を取っちゃいますよ


-speed, -intonation
H:\>echoseika -speed 1.3 -intonation 1.4 夜ふかししていると、余計に歳を取っちゃいますよ


-speed, -intonation, -pitch
H:\>echoseika -speed 1.3 -intonation 1.4 -pitch 1.25 夜ふかししていると、余計に歳を取っちゃ いますよ


ソース

2017/08/14以降の公開版からVOICEROID制御部分をDLLに分離しました。VOICEROID制御ロジックの含まれるDLL側ソースはVOICEROID+EXを制御するDLLを参照してください。

echoseika.cs
using System;
using System.Collections.Generic;
using System.IO;
using echoSeikaAPI;
 
namespace echoseika
{
    class echoseika
    {
        /// <summary>
        /// VOICEROID発声処理
        /// </summary>
        static void Main(string[] args)
        {
            vRoidController vRoidControl = new vRoidController();
 
            getopt opts = new getopt(args);
 
            if (opts.isUsable)
            {
                vRoidControl.Register_vRoid(opts.cv);
                vRoidControl.SetTalkText(opts.cv, opts.talkText);
                vRoidControl.SetWavFilePath(opts.cv, opts.wavFilePath);
                vRoidControl.SetVoiceEffectParam(opts.cv, vRoidVoiceEffectParam.intonation, opts.intonation);
                vRoidControl.SetVoiceEffectParam(opts.cv, vRoidVoiceEffectParam.pitch, opts.pitch);
                vRoidControl.SetVoiceEffectParam(opts.cv, vRoidVoiceEffectParam.speed, opts.speed);
                vRoidControl.SetVoiceEffectParam(opts.cv, vRoidVoiceEffectParam.volume, opts.volume);
 
                if (opts.wavFilePath == "")
                {
                    vRoidControl.Play(opts.cv);
                }
                else
                {
                    vRoidControl.PlayWithSave(opts.cv);
                }
            }
 
            return;
        }
    }
 
    /// <summary>
    /// やっつけオプション解析
    /// </summary>
    class getopt
    {
        public vRoidAvator cv { get; }
        public string talkText { get; }
        public string wavFilePath { get; }
        public decimal volume { get; }
        public decimal pitch { get; }
        public decimal intonation { get; }
        public decimal speed { get; }
        public bool isUsable { get; }
 
        private Dictionary<string, int> optfmt = new Dictionary<string, int>() {
            {"-h",0 },
            {"-cv",1},
            {"-wav",1},
            {"-volume",1},
            {"-pitch",1},
            {"-speed",1},
            {"-intonation",1},
        };
 
        public getopt(string[] args)
        {
            cv = vRoidAvator.SEIKA;
            talkText = "";
            wavFilePath = "";
            volume = 1.00m;
            pitch = 1.00m;
            intonation = 1.00m;
            speed = 1.00m;
            isUsable = true;
 
            int i = 0;
            while (i < args.Length)
            {
                string opt = args[i];
                int optargcount = optfmt.ContainsKey(opt) ? optfmt[opt] : 0;
 
                string optargStr = "";
 
                if (i == (args.Length - 1))
                {
                    if (opt.Substring(0, 1) != "-")
                    {
                        talkText = opt;
                        break;
                    }
                }
 
                if ((optargcount != 0) && ((i + optargcount) < args.Length))
                {
                    if (args[i + 1].Substring(0, 1) != "-")
                    {
                        optargStr = args[i + 1];
                        i++;
                    }
                }
 
                try
                {
                    switch (opt)
                    {
                        case "-h":
                            Console.WriteLine("usage: echoseika [[[option1] option2] ... optionN] TalkText");
                            Console.WriteLine("");
                            Console.WriteLine("options:");
                            Console.WriteLine("-cv voiceroid   : use voiceroid name. default is {0}", vRoidAvator.SEIKA.ToString());
                            foreach (vRoidAvator avator in Enum.GetValues(typeof(vRoidAvator)))
                            {
                                Console.WriteLine("       {0,-10} {1}", avator.ToString(), avator.ProdName());
                            }
                            Console.WriteLine("-wav wavefile   : save the voice data to wavefile.wav");
                            Console.WriteLine("-volume P       : volume of voice effetct.     P= 0.00 - 2.00");
                            Console.WriteLine("-speed P        : speed of voice effetct.      P= 0.50 - 4.00");
                            Console.WriteLine("-pitch P        : pitch of voice effetct.      P= 0.50 - 2.00");
                            Console.WriteLine("-intonation P   : intonation of voice effetct. P= 0.00 - 2.00");
                            Console.WriteLine("TalkText        : send the \"TalkText\" to VOICEROID");
 
                            i = args.Length;
 
                            break;
 
                        case "-cv":
                            cv = (vRoidAvator)Enum.Parse(typeof(vRoidAvator), optargStr.ToUpper());
                            break;
 
                        case "-wav":
                            wavFilePath = Path.GetFullPath(optargStr);
                            if (wavFilePath == "") throw new Exception("wave file path invalid.");
                            break;
 
                        case "-volume":
                            volume = decimal.Parse(optargStr);
                            break;
 
                        case "-pitch":
                            pitch = decimal.Parse(optargStr);
                            break;
 
                        case "-speed":
                            speed = decimal.Parse(optargStr);
                            break;
 
                        case "-intonation":
                            intonation = decimal.Parse(optargStr);
                            break;
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("{0} error. {1}", opt, e.Message);
                    isUsable = false;
                    i = args.Length;
                }
                i++;
            }
        }
    }
}

コメント

コメントを入力. Wiki文法が有効です:
画像の文字が読めなければ、文字を読んだ.wavファイルをダウンロードして下さい。
 
documents/windows/windows-023.txt · 最終更新: 2017/08/17 00:43 by k896951