Emacs で書いている英語の文を Siri の声で読み上げる

OSX の say コマンドを利用して英語を読んでもらう。TeX書類を想定して、完全ではないけど、読み上げる必要がない部分を適当に取り除いてみた。

Alex の発音も良いけど、Siri の声を入れるとさらに流暢な英語で読んでくれる。システム環境設定のスピーチ→テキスト読み上げ→システムの声→カスタマイズから、「英語(アメリカ合衆国)女性」の所にある Samantha にチェックを入れてダウンロードすれば選べる。Tomやイギリス英語のDaniel なども良い感じ。

領域を選択している場合はその領域を、していない場合は行頭%から行頭%の間にあるテキストを読み上げる。(自分は文毎に%を置いているので、領域を選択することなく、カーソルのある文を読んでくれる。%が見つからないと失敗するけど、その対処はしていない。)
ショートカットは ⌘R にしてみた。

解説

  • スピーチが再生されていればそのプロセスを削除して終了。
  • 領域を選択している状態(mark-active が t)なら、その領域の始まりと終わりの位置を b と e に。
  • 領域を選択していないなら、% で始まる行を後方、前方に検索して、それぞれの位置を b と e に記録。
  • b から e までを文字列 s にする。
  • s の中に \% があれば、コメントと認識されないように percent に置換。
  • s の中に %に続いて改行文字以外の文字が続いている部分(コメント部)を""に置換(削除)。
  • TeX のコマンドで、section型(\hoge{にマッチ)を削除(" " に置換)。
  • $,\,_,^,~,(,),{,},`といった記号や改行文字を削除(" " に置換)
  • 空白が続くところを1つの空白に置換。
  • 結果の文字列 s を表示
  • シェルから引数 s で say コマンドを実行。

領域を選択していないときにスピーチする文章を自動的に区切る部分は、自分のスタイルに合わせて書き換えれば良いと思う。
re-search-backward/forward で、後方、前方へ正規表現でマッチする文字列を探している。"\\|" が or で、"^" は行頭を意味している。つまり、"^\\ *%" は行頭から0個以上のスペースの後に%があるという意味で、"^\\ *\n" は行頭から0個以上のスペースの後改行がある(つまり何もない行)という意味で、そのどちらかにマッチすればそれが区切りになる。Emacs の文字列はエスケープ文字(バックスラッシュ)のために、バックスラッシュが必要みたいで、慣れないと読み難い(自分も慣れていない。)

追記: say コマンドはファイルに書き出せる。iTunes にはファイルをコピーするだけで自動的に iTunes にインポートする機能がある。上を少し書き換えれば、Emacs のメモを iPodiPhone で聞くような機能が作れる。

$ say Hello, World -o ~/Music/iTunes/iTunes\ Music/iTunes\ に自動的に追加/foo.aiff