目次
ログファイルを読み上げするコマンドLogWatchWanko
2023/03/12
unixコマンドの tail -f ライクな出力 + VOICEVOX等の音声合成製品による読み上げ、を実行するコマンドを作った。
概要
何かのログやゲームのチャットログを読ませてVOICEVOXやCOEIROINK、SHAREVOX、LMROID, ITVOICE でそのテキストを発声させるコマンドプロンプト用プログラム LogWatchWanko.exe を公開する。
これはWindows用で、現時点ではWindows11(64bit)、Windows10(64bit)での動作が確認されている。
発声自体は同梱している voxsayコマンドかsapitalkコマンドをバックグラウンドで実行している。
- sapitalkコマンド ※64bit版を同梱している
※いずれも私が公開しているソフトウエアです。
LogWatcher から LogWatchWanko に改名された。
ダウンロード
logwatchwanko-20230314-1.zip - 2023-03-14 公開。SAPIも使えるようにしてみた。
使い方
使用する音声合成製品を起動する
SAPIを使う時は何か起動する必要なし。
SAPIを使わなければ以下のいずれかを起動。
- VOICEVOX https://voicevox.hiroshiba.jp/
- COEIROINK https://coeiroink.com/
- SHAREVOX https://www.sharevox.app/
- ITVOICE http://itvoice.starfree.jp/
使用する音声合成製品の話者index番号を確認
voxsayコマンド
アーカイブ同梱のvoxsay.exe を以下のコマンドラインで実行。
voxsay -prod <音声合成製品> -list
利用する話者のindex番号を控える。
指定する音声合成製品
- VOICEVOX → voicevox
- SHAREVOX → sharevox
- COEIROINK → coeiroink
- LMROID → lmroid
- ITVOICE → itvoice
VOICEVOX を使う場合のコマンドは以下となる。
voxsay -prod voicevox -list
sapitalkコマンド
アーカイブ同梱のsapitalk.exe を以下のコマンドラインで実行。
sapitalk -l
利用する話者の話者番号(index番号)を控える。
全ての話者が使える訳ではないようなので事前にsapitalkで発声可能か調べておく。
LogWatcheWanko.exe.configを変更する
LogWatcheWanko.exe.configを変更する。
LogWatcher.exe.config を持っていれば LogWatchWanko.exe.config にリネームして利用できる。
< LogWatcher.Properties.Settings ></ LogWatcher.Properties.Settings > の間のパラメタを自分の環境に合わせる。
パラメタ | 説明 |
---|---|
TtsCommand | voxsay か sapitalk を指定。 |
TargetPath | 対象ファイルの格納されるフォルダの指定。サブフォルダの検出はしない。 |
TargetFile | 対象ファイルの名称。ファイル実体の名称でもいいし、 Chat*.txt のようなワイルドカード指定でもいい。 |
CodePage | テキストファイルのコードページ。※932 がSJIS、65001 がUTF8、1200 がUTF-16LE |
FileFetchCycleMS | ファイルの更新を監視する間隔。ミリ秒を指定。※デフォルト : 2000 |
ProductID | 音声合成製品の指定。※voxsay使用時 |
SpeakerIndex | 話者のindex番号の指定。 |
SpekaerParameter | 話者へ与えるオプションの指定。 |
FilterPattern | 読上げ対象行の選択に使う正規表現。使わない場合は編集不要。※デフォルト : なし |
ChangeSpeakerPattern1 | 読上げ対象行がこの正規表現に一致する時に話者のindex番号とオプションの指定を変更する。使わない場合は編集不要。※デフォルト : なし |
ChangeSpeakerIndex1 | 正規表現ChangeSpeakerPattern1に合致した際に適用する話者のindex番号の指定。 |
ChangeSpekaerParameter1 | 正規表現ChangeSpeakerPattern1に合致した際に適用する話者へ与えるオプションの指定。 |
ChangeSpeakerPattern2 | ChangeSpeakerPattern1の正規表現に一致せず、この正規表現に一致する時に話者のindex番号とオプションの指定を変更する。使わない場合は編集不要。※デフォルト : なし |
ChangeSpeakerIndex2 | 正規表現ChangeSpeakerPattern2に合致した際に適用する話者のindex番号の指定。 |
ChangeSpekaerParameter2 | 正規表現ChangeSpeakerPattern2に合致した際に適用する話者へ与えるオプションの指定。 |
SearchPattarn | 読上げ対象行の文字列置換を行うための正規表現(置換前)。使わない場合は編集不要。※デフォルト : なし |
ReplacePattarn | 読上げ対象行の文字列置換を行うための正規表現(置換後)。使わない場合は編集不要。※デフォルト : なし |
コードページ
https://learn.microsoft.com/ja-jp/windows/win32/intl/code-page-identifiers?source=recommendations
LogWatcheWanko.exe を実行
旨くいったならファイルの追記が行われると読上げる筈。
色々説明
動作順
読み出すファイルの選択
- TargetFileにファイル名を設定していた場合はそのファイルだけが対象になる。
- TargetFileにワイルドカード指定を設定していた場合はTargetPathで指定するフォルダ内でタイムスタンプ的に新しい、ワイルドカードに合致するファイルが対象になる。
フォルダ内で新規にファイルが作成されると対象ファイルも変更されそのファイルの内容を読上げる。
※既存のファイルを更新すると、対象ファイルがそちらに変更されて頭から全内容を読上げるので注意。
差分が取れないので(更新が行われる前のサイズを取れない)どうしようもない。 - 選択されたファイルはCodePageで示す文字コードページを持つファイルとして取り扱われる。
読上げる追記行の選択
必要な追記行だけを読上げるため、FilterPatternに選択条件となる正規表現を設定する。
- FilterPatternに何も設定が無ければ全ての追記行が読上げ対象になる。
- FilterPatternに正規表現が指定されていればその正規表現に合致する追記行が読上げ対象になる。
読上げる話者の選択
選択された追記行を次の順に検証して話者を決める。
- 追記行がChangeSpeakerPattern1の正規表現に合致する場合、ChangeSpeakerIndex1が話者のindex番号になり、ChangeSpekaerParameter1が話者に与えるオプションになる。
ChangeSpeakerPattern1に設定が無いもしくはChangeSpeakerPattern1に追記行が合致しない場合、次の検証2へ移る - 追記行がChangeSpeakerPattern2の正規表現に合致する場合、ChangeSpeakerIndex2が話者のindex番号になり、ChangeSpekaerParameter2が話者に与えるオプションになる。
ChangeSpeakerPattern2に設定が無いもしくはChangeSpeakerPattern2に追記行が合致しない場合、次の検証3へ移る - 検証1・検証2に合致しないので、SpeakerIndexを話者のindex番号となり、SpekaerParameterが話者に与えるオプションになる。
読上げる追記行の置換処理
必要な場合に選択された追記行に置換を行う。
- SearchPattarnに何も設定が無いもしくは入力した追記行が正規表現に合致しない場合、置換処理は行わない。
- SearchPattarnに正規表現が設定されていればReplacePattarnで示す定義で置換する。
読上げ処理
バックグラウンドで音声合成製品による読上げを行う。
読上げ対象行のフィルタリング
FilterPatternで正規表現を指定できる。
以下にERRORもしくはFAILERが含まれている追記行のみを読上げる正規表現を示す。
FilterPattern : (ERROR|FAILER)
読上げ対象行の編集
そのままだと冗長な追記行を正規表現で編集できる。
以下にとあるゲーム(なんとかNGS?)のログに対応した記述を示す。
SearchPattarn : ^([^\t]+\t){4}([^\t]+)[\t" a-z0-9\/]+([^\t]+)$ ReplacePattarn : $2 $3
このゲームのログは以下のような書式になっている。
タイムスタンプ<タブ>シーケンスNo<タブ>発言範囲<タブ>ID<タブ>ユーザ名<タブ>発言テキスト
UTF-16LEのエンコーディングでタブ区切りで6項目を持つファイルになっている。 この例では、追記行のテキストをユーザ名と発言テキストのみに置換している。
SearchPattarn
“^” → 行の先頭から、の意
“([^\t]+\t){4}“ → “タイムスタンプ<タブ>シーケンスNo<タブ>発言範囲<タブ>ID<タブ>” の範囲に対応
”([^\t]+)“ → “ユーザ名” の範囲に対応。$2のラベルが付与される
”[\t” a-z0-9\/]+“ → ”<タブ>発言テキスト“ の先頭にあるコマンド指定等の文字列
”([^\t]+)“ → ”<発言テキスト“ の先頭にあるコマンド指定等の文字列以降。$3のラベルが付与される
“$” → 行の最後、の意
ReplacePattarn
“$2” → $2のラベルが付与された範囲の文字列に置換える
” “ → 空白に置換える
“$3” → $3のラベルが付与された範囲の文字列に置換える
この設定の結果は
ユーザ名 発言テキスト(先頭のコマンド指定部分を除く)
となる。
なおこの指定だと数字・英小文字だけの発言はSearchPattarnにより消し込まれるので注意。
パターンの適用順