tmuxからスクリプト越しにAssistantSeikaを使うことで、VOICEROIDに読み上げをしてもらいます。
前提
- AssistantSeikaが対応する読み上げソフトをインストールします
- 自分はVOICEROID2 結月ゆかりを使っています
- AssistantSeikaをインストールする
- SeikaSay2.exeから読み上げができるようセットアップします
$ neofetch distro kernel
distro: Arch Linux on Windows 10 x86_64
kernel: 5.10.60.1-microsoft-standard-WSL2
$ tmux -V
tmux 3.2a
スクリプトの用意
まず、以下のスクリプトを用意しました。seikaという名前をつけています。
# !/bin/bash
_TMP=$(mktemp -t seika.XXXXXX)
trap 'rm ${_TMP}* 2>/dev/null' EXIT
perl -0pe 's#\n##g' <"${1:-/dev/stdin}" >>"${_TMP}"
SEIKASAY2_DIR=/mnt/c/Apps/AssistantSeikaUtils
CID=2003
${SEIKASAY2_DIR}/SeikaSay2.exe -cid ${CID} -f "${_TMP}" >/dev/null
seikaは標準入力(または引数で指定したファイル)から改行文字を取り除いて、一時ファイルに保存します。
VOICEROIDは改行文字を空白と捉えていて、文章の途中に改行が含まれると、そこで一瞬読み上げを止めてしまいます。
ターミナルでは(というかテキストファイルでは)文章の折返しに改行文字を使うことがままあるので、このスクリプトではそれを取り除いています。
そして、一時ファイルを入力に、AssistantSeikaのCLIであるSeikaSay2.exeを実行することで、読み上げをしてもらいます。
tmuxの設定
.tmux.confに以下の行を追加します。
bind -T copy-mode M-s send-keys -X copy-selection\; run-shell -b 'tmux show-buffer | seika'
コピーモードにAlt-S
のキーバインドを設定します。
ここでは2つのtmuxコマンドを実行しています。send-keys -X copy-selection
で選択した範囲の文字をtmuxローカルのセレクションに保存します。
次にrun-shell -b 'tmux show-buffer | seika'
でUNIXシェル向けにコマンドを実行します。-b
はバックグラウンド実行です。これがないと、読み上げが終わるまでtmuxが止まります。tmux show-buffer | seika
がシェルコマンドです。tmux show-buffer
は先程保存したセレクションの内容を標準出力に流します。seika
は前節で紹介したスクリプトですね。パイプ経由でセレクションの内容を受け取り、SeikaSay2.exeを起動します。
まとめ
以上の簡単な手順で、tmuxのコピーモードで文字列を選択し、Alt-S
を押下すると、読み上げをしてくれるようになりました。
コピーモードはこれまでターミナルの内容をクリップボードに保存するためだけに使っていましたが、ターミナル上の範囲を選択して、外部のコマンドに流し込んで、処理することが簡単にできるとわかったので、少し夢が広がったような気がします
AssistantSeikaのおかげで、スクリプトと設定による繋ぎこみだけで、text-to-speechができました。作者さんにはこの場を借りて、お礼申し上げます。ありがとうございました。