機械音声の動画を作成するにあたり、原稿を読み上げたらどうなるのかをEmacs上で確認できるように拡張を書いた。読み上げのツールとしてはOpenJTalkを用いている。macOSの場合 brew install open_jtalk
でインストールできる。
以下の関数を評価して使えるようにしたら、読み上げたい文字列をリージョン選択して M-x voice
と入力するとリージョン内の文字列が読み上げられる。
(defun voice ()
(interactive)
(call-process-region (region-beginning) (region-end)
"/usr/local/bin/open_jtalk"
nil "*OPEN JTALK*" t
"-x" "/usr/local/Cellar/open-jtalk/1.11/dic"
"-m" "/usr/local/Cellar/open-jtalk/1.11/voice/mei/mei_normal.htsvoice"
"-ow" "/tmp/sample.wav")
(call-process "afplay" nil nil nil "/tmp/sample.wav"))
call-processを使っているので音声生成及び再生中はEmacsが停止してしまうが、今の所短い文章しか読み上げさせないのでそれほど困ってはいない。start-processを使えば固まることもなくなる。また改行が入ってしまうとそこまでしか読み上げられないので、改行などはopen_jtalkの標準入力にわたす前に予め除去したほうが良さそう。これらは必要に迫られたらそのうち対応しようと思う。
外部ツールを積極的に頼るというEmacsの方針は本当に好みだ。すぐにこういう拡張をできてしまう。
org-babelで読み上げの文章を書いて C-c C-c
をすると読み上げてくれるというのも実装したい。出力先のファイル名などオプションもorg-babelで指定できるとよい。
追記1 voicevoxの音声合成を試すではvoicevoxを用いて読み上げのEmacs Lispを実装した。
追記2 マークダウン等のマークアップ言語で書いた文章を読み上げ機能でより良く推敲するではmacOSのsayコマンドを用いて読み上げのEmacs Lispを実装した。