かなりすごいブログ

「このVim…しゃべるぞ!」Shaberu.vimをリリースしました

Vim Advent Calendar 2012 67日目の記事になります。

昨日、66日目の記事は@yomi322さんの「Vimで突然の死に備える」でした。みなさん備えてますか?

Shaberu.vimをリリースしました

Vimとおしゃべりできたら素敵だと思いませんか?私は思います。

Sho…某暗黒美夢王ことダークビムマスターさんはこんなものを導入せずともVimの声を聞けてそうですが、まだまだ自分はその域に達していないので、リアルタイム音声合成ライブラリの力を借りることにします。

というわけで、Vimにしゃべってもらうためのプラグイン「Shaberu.vim」を公開しました。

https://github.com/supermomonga/shaberu.vim

Shaberu.vimは、Vimからリアルタイム音声合成ライブラリを操作するためのラッパープラグインです。

動作画面

動作画面を載せておきますね。録画ソフトが重いせいで喋りだすまでタイムラグがありますが、実際には命令があればほぼタイムラグなしで喋ってくれます。

Macの標準コマンド「say」に付属しているKyokoさんの声です。KyokoさんはiOSに搭載されているエージェントSiriの声でもありますね。 [vim]let g:shaberu_user_define_say_command = ‘say -v Kyoko “%%TEXT%%”‘[/vim]

Open JTalkを利用すれば、よりカワイイ感じの声にもできます。カワイー [vim]let g:shaberu_user_define_say_command = ‘say-openjtalk “%%TEXT%%”‘[/vim]

say-openjtalkコマンドはこんな感じです。

インストール方法

NeoBundleとかでいい感じにインストールします。Shaberu.vimはvimprocに依存していますので、vimprocも合わせてインストールします。vimprocは非同期に色々できるやばいやつです。同期的に喋らせると、Vimがしゃべっている間は操作を一切受け付けてくれなくなってしまうので、vimprocを使い非同期に喋らせています。

NeoBundle 'Shougo/vimproc', {
  \ 'build' : {
  \   'windows' : 'make -f make_mingw32.mak',
  \   'cygwin' : 'make -f make_cygwin.mak',
  \   'mac' : 'make -f make_mac.mak',
  \   'unix' : 'make -f make_unix.mak',
  \ },
  \ }
NeoBundle 'supermomonga/shaberu.vim'

設定

Mac OS Xであれば標準でsayというコマンドがインストールされているので、特に設定は必要ないです。日本語を喋らせたい場合は、OS Xのスピーチ設定画面からKyokoさんとかの日本語の音声を別途インストールする必要があります。

WindowsやLinuxでは、標準のリアルタイム音声合成ライブラリがあるかどうかがわからなかったので、残念ですがデフォルトでは動作しません。Windowsなどで良い感じのライブラリがあれば教えて下さい。

(02/06追記:Windows対応しました

上記サンプルのように、g:shaberu_user_define_say_commandを定義して任意のコマンドを実行できるようにすることができます。

しゃべらせる

「:ShaberuSay 喋らせたいテキスト」というコマンドでしゃべります。:ShaberuMuteOnするとミュートになります。出社中とかはおもむろにMuteにしましょう。Mute解除は:ShaberuMuteOffです。:ShaberuMuteToggleでトグルもできます。 g:shaberu_echo_when_muteが1の場合は、Mute時に:ShaberuSayコマンドを実行した際、echoエリアにテキストが表示されます。

HookやAutocmdでVimとイチャイチャする

" Vim core
autocmd MyAutoCmd VimEnter * ShaberuSay 'ビムにようこそ'
autocmd MyAutoCmd VimLeave * ShaberuSay 'さようなら'

" VimShell
autocmd FileType vimshell
\ call vimshell#hook#add('chpwd' , 'my_vimshell_chpwd' , 'g:my_vimshell_chpwd')
\| call vimshell#hook#add('emptycmd', 'my_vimshell_emptycmd', 'g:my_vimshell_emptycmd')
\| call vimshell#hook#add('notfound', 'my_vimshell_notfound', 'g:my_vimshell_notfound')

function! g:my_vimshell_chpwd(args, context)
  ShaberuSay 'よっこいしょ'
endfunction
function! g:my_vimshell_emptycmd(cmdline, context)
  :ShaberuSay 'コマンドを入力してください'
  return a:cmdline
endfunction
function! g:my_vimshell_notfound(cmdline, context)
  :ShaberuSay 'コマンドが見つかりません'
  return a:cmdline
endfunction
" .vimrc保存時に自動的にsource
autocmd MyAutoCmd BufWritePost .vimrc nested source $MYVIMRC | ShaberuSay 'ビムアールシーを読み込みました'
" 開発用ディレクトリ内.vimファイルに関して、ファイル保存時に自動でsourceする
execute 'autocmd MyAutoCmd BufWritePost,FileWritePost' s:local_bundle_dir . '*.vim' 'source | echo "sourced : " . bufname("%") | ShaberuSay "ソースしました"

こんなかんじで。TweetVimで新規MentionやDMがあった時に通知したりできれば便利な気がするけど、Hookなかった気がする…

Vim Advent Calendar 2012 68日目

Vim Advent Calendar 2012 68日目は@scheakurさんです。もうすぐ70日ですか。すごくアドベントな感じですね。