機械音声の動画を作成するにあたり、原稿を読み上げたらどうなるのかを 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で指定できるとよい。