Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Vimから音声入力でパソコン操作するプラグインを作った

$
0
0

airjulius.vim

airjulius.vim

Vimから音声入力でパソコン操作するプラグインです。

解説

まずは、画像から見てもらったほうが分かりやすいです。キー入力していないのに、様々なコマンドが実行されています。これは、音声によるパソコン操作になります。

トリガーとなる音声(発音)は以下の通りに設定しました。

こんにちは

ボリュームの大きさを変更します
$ osascript -e 'set Volume 1'

テスト

MacVimを起動します
$ open -a MacVim

N

端末にフォーカスを戻します
$ open -a iTerm

Y

Chromeを起動します
$ open -a Google Chrome

必要なもの

julius

この音声認識エンジンは、コマンドが実行できる状態にしておいてください。また、辞書データも必要となります。参考

VimShell

airjulius.vim

~/.vimrc
NeoBundle 'Shougo/vimshell.vim'
NeoBundle 'syui/airjulius.vim'

通知には、Growlなどを使います。詳しくは、こちらの記事を参考にしてください。

LinuxでもWindowsでも多分動作すると思います。ただし、Macのみしか動作確認していませんので、本体コードを適時ご参照ください。関連のある箇所は、主に以下のコマンドです。

plugin/airjulius.vim
call feedkeys("julius -C `brew --prefix julius-dictation-kit`/share/main.jconf -C `brew --prefix julius-dictation-kit`/share/am-gmm.jconf -quiet -nostrip | awk '/pass1_best/ {print $2}'\<CR>\<Esc>")

使い方

:AirJuliusVimShellを実行すると、VimShellが起動し、juliusコマンドが実行されます。

仕組みは簡単で、juliusコマンドの出力を読み取り、出力内容によって指定したコマンドを実行するというものです。

設定

~/.vimrc
"" Setting {{{" キーバインド
nm <C-l><C-l><Plug>(AirJuliusVimShell)" 通知をONにするletg:airjulius_julius_growlnotify_on =1" 音声ガイドをONにするletg:airjulius_julius_audio_on =1"" }}}"" 個人設定 {{{" 音声キーワードletg:airjulius_julius_sample_word_1 ="こんにちは"letg:airjulius_julius_sample_word_2 ="テスト"letg:airjulius_julius_sample_word_3 ="N"letg:airjulius_julius_sample_word_4 ="Y"" 音声入力の実行コマンドletg:airjulius_julius_sample_command_1 ="osascript -e 'set Volume 1'"letg:airjulius_julius_sample_command_2 ="open -a 'Google Chrome'"letg:airjulius_julius_sample_command_3 ="open -a MacVim"letg:airjulius_julius_sample_command_4 ="open -a iTerm"" 音声ガイドの実行コマンドletg:airjulius_julius_sample_audio_1 ="say 音声入力を確認。コマンドを実行しました"letg:airjulius_julius_sample_audio_2 ="say クロームを起動します"letg:airjulius_julius_sample_audio_3 ="say ヴイムゥ"letg:airjulius_julius_sample_audio_4 ="say フォーカスを端末に戻します"" }}}

設定を定義している箇所は、主に以下の箇所です。

plugin/airjulius.vim
""" 1 (ノーマルバージョン)"" 個人設定1 {{{" 音声キーワードif!exists("g:airjulius_julius_sample_word_1")letg:airjulius_julius_sample_word_1 ="こんにちは"en" 音声入力の実行コマンドif!exists("g:airjulius_julius_sample_command_1")letg:airjulius_julius_sample_command_1 ="osascript -e 'set Volume 1'"en" 音声ガイドの実行コマンドif!exists("g:airjulius_julius_sample_audio_1")letg:airjulius_julius_sample_audio_1 ="say 音声入力を確認。コマンドを実行しました"en" }}}" 入力音声と音声キーワードが一致した場合、コマンドを実行する処理 {{{if getline(s:airjulius_julius_getline_1)==g:airjulius_julius_sample_word_1
" 音声コマンドと実行コマンドを通知するcall system("growlnotify --image " . g:airjulius_julius_dir_icon . " -t " . g:airjulius_julius_sample_word_1 . ' -m "' . g:airjulius_julius_sample_command_1 . '"')" 音声ガイドを流すcall system(g:airjulius_julius_sample_audio_1)" コマンドの実行call system(g:airjulius_julius_sample_command_1)" 実行したコマンドは、一応、Vimのコマンドプロンプトに表示する
  echo g:airjulius_julius_sample_command_1
en" }}}""" 2 (簡易バージョン)"" 個人設定2 {{{if!exists("g:airjulius_julius_sample_word_2")letg:airjulius_julius_sample_word_2 ="テスト"enif!exists("g:airjulius_julius_sample_command_2")letg:airjulius_julius_sample_command_2 ="open -a MacVim"enif!exists("g:airjulius_julius_sample_word_3")letg:airjulius_julius_sample_word_3 ="Y"enif!exists("g:airjulius_julius_sample_command_3")letg:airjulius_julius_sample_command_3 ="open -a 'Google Chrome'"enif!exists("g:airjulius_julius_sample_word_4")letg:airjulius_julius_sample_word_4 ="N"enif!exists("g:airjulius_julius_sample_command_4")letg:airjulius_julius_sample_command_4 ="open -a iTerm"en"" }}}" コマンドの実行のみの簡易形態(通知なし、音声ガイドなし) {{{if getline(s:airjulius_julius_getline_1)==g:airjulius_julius_sample_word_2
  call system(g:airjulius_julius_sample_command_2)
  echo g:airjulius_julius_sample_command_2
enif getline(s:airjulius_julius_getline_1)==g:airjulius_julius_sample_word_3
  call system(g:airjulius_julius_sample_command_3)
  echo g:airjulius_julius_sample_command_3
enif getline(s:airjulius_julius_getline_1)==g:airjulius_julius_sample_word_4
  call system(g:airjulius_julius_sample_command_4)
  echo g:airjulius_julius_sample_command_4
en" }}}

適時コマンドを追加しても良いです。

plugin/airjulius.vim
if getline(s:airjulius_julius_getline_1)==g:airjulius_julius_sample_word_2
  call system(g:airjulius_julius_sample_command_2)
  echo g:airjulius_julius_sample_command_2
  ShellCommand...1
  ShellCommand...2
  VimCommand...1
  VimCommand...2en

あと、音声キーワードを増やすことができますが、こちらに関しても、各自追記していく方向で。

感想

あまり、精度良くないです。辞書を作成し、それを使えば認識率高くなるみたいですが。

あと、sayの音量を大きくしておけば、ここから音声を読み取って、コマンドを連携実行できそうです。ある程度簡単なやりとりなら作れそう。認識精度悪いのでやりませんが。

pecoとかと連携して、up,downのスタート、ストップとか設定してみたい...。

追記

Linuxでも動作確認しました。少しコードを変更しました。LinuxとWindowsの場合は、julius-kitをダウンロード、解凍してそれを使うことにしました。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>