Hatena::ブログ(Diary)

ザリガニが見ていた...。 このページをアンテナに追加 RSSフィード

2009-05-19

saykanjiコマンドを定義して漢字仮名混じり文を読み上げる

saykanaコマンドという素晴らしいコマンドが紹介されていた。コマンドに続けて入力した、ひらがな・かたかな・英数字を日本語で読み上げてくれるのだ。こういうのを見つけると、とりあえず試してみたくなる。

$ saykana にほんごをはなそう
$ saykana 123
$ saykana ABC
  • 調子良く読み上げてくれた!面白い!

  • ところが、意地悪く漢字混じりの文章を試すと...
$ saykana 日本語を話そう
ERR:(105) invalid kana string. 日本語を話そう
  • コマンド名が sayかな なのだから当然の仕様だ。

環境

mecabの利用

  • mecabコマンドは日本語の達人で、以下のような形態素解析をしてくれる。
$ echo 日本語を解析する|mecab >&1;
日本語	名詞,一般,*,*,*,*,日本語,ニホンゴ,ニホンゴ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
解析	名詞,サ変接続,*,*,*,*,解析,カイセキ,カイセキ
する	動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
EOS
  • オプションを指定することで、以下のような出力も可能。
$ echo 日本語を解析する|mecab -O wakati >&1;
日本語 を 解析 する 
$ echo 日本語を解析する|mecab -O yomi >&1;
ニホンゴヲカイセキスル

  • -O yomiオプション、素晴らしい!
  • この結果をsaykanaに渡せば、saykanji(say漢字)になるはず。
$ echo 日本語を解析する|mecab -O yomi|saykana
  • 大成功!!

saykanjiコマンド

  • ワンライナーと言えども、毎回入力するのは面倒だし、多分、そのうち忘れてしまう...。
  • そうだ!saykanjiコマンドを定義しよう!
$ cd /usr/local/bin
$ vi saykanji.sh
  • エディタでsaykanji.shを以下のように編集してみた。
saykanji()
{
  echo $1|/usr/local/bin/mecab -O yomi|/usr/local/bin/saykana;
}

vi ~/.bash_profile
  • saykanji関数定義を有効にするため、~/.bash_profile(最終の行)に以下のコマンドを追記した。
. /usr/local/bin/saykanji.sh

  • 新しいターミナルウィンドウを開いて試してみた。
$ saykanji 日本語を話そう
  • 「にほんごをはなそう」と読んでくれた!
  • saykanjiコマンド出来上がり。

AppleScriptからの利用

  • AppleScriptからは以下のようにすると利用できた。

 do shell script ". /usr/local/bin/saykanji.sh;saykanji '日本語を話そう'"


  • もうちょっと頑張って、以下のようにしてみると...

  --操作対象のアプリを最前面に設定する(スクリプトメニューから実行する場合必要)
 set current_app to short name of (info for (path to frontmost application))
 activate application current_app --tell application "System Events"ブロック内ではエラーになる
 
 tell application "System Events"
   delay 0.5
   keystroke "c" using command down
   delay 0.5
   do shell script ". /usr/local/bin/saykanji.sh;saykanji " & "'" & (the clipboard as string) & "'"
 end tell

  • このスクリプトをSayKANJI.scptとして、ユーザースクリプトフォルダに保存した。
  • これでテキストを選択して、スクリプトメニューから SayKANJI を実行すると、日本語で読み上げてくれた!

Quicksilverからの利用

自分の場合、スクリプトは最終的にQuicksilverに登録して、ショートカット一発で実行してしまう。(command-option-control-Y を割り当ててみた。)

  • Quicksilverでは、操作対象のアプリを最前面に設定するスクリプトが邪魔になるので、コメントアウトした。

 (*
 --操作対象のアプリを最前面に設定する(スクリプトメニューから実行する場合必要)
 set current_app to short name of (info for (path to frontmost application))
 activate application current_app --tell application "System Events"ブロック内ではエラーになる
 *)
 
 tell application "System Events"
   delay 0.5
   keystroke "c" using command down
   delay 0.5
   do shell script ". /usr/local/bin/saykanji.sh;saykanji " & "'" & (the clipboard as string) & "'"
 end tell


これでテキストを選択して、command-option-control-Yで日本語の音読が始まるようになった!

諸々

  • 選択したテキストの中に「'」が含まれていると正常に実行できない...。
    • AppleScriptでコマンドを生成する時、「'」を利用しているため。
  • 表計算ソフトで数字の読み合わせをする時、かなり便利かもしれない!
    • セル選択すると、左から右へ、上から下にの順で読み上げてくれた。
    • カンマはひと呼吸置いてくれる。
    • セルを移動する時にもひと呼吸置いてくれるように工夫すれば、かなり聞き取り易くなりそう。
  • saykanaの定義方法については、他にもっと素晴らしいやり方があるかもしれない。
    • cシェル系ならaliasコマンドで引数も利用できるらしい、ので。

参考ページ

素晴らしいコマンドに感謝です!


素晴らしい情報に感謝です!


とても参考になりました。感謝です!


素晴らしいプラグインが公開されていました!

schriftschrift 2009/05/21 03:39 AppleScript から利用するだけの場合、↓のようなスクリプトの方が単純で良いのではないでしょうか。
※文中の「/path/to/」は書き換える必要があります。

tell application "System Events"
delay 0.5
keystroke "c" using command down
delay 0.5
do shell script "echo " & "'" & (the clipboard as string) & "'" & " | /path/to/mecab -O yomi | /path/to/SayKana"
end tell

zariganitoshzariganitosh 2009/05/21 13:53 はじめまして、schriftさん。
saykanjiを定義するまでもなく、その定義内容をそのままdo shell scriptで実行してしまうということですね。
おっしゃる通り、そもそもワンライナーで理解できるシンプルなスクリプトなので、上記で十分だと思います。

ただ、この時、機能拡張を考えていた訳ではないですが、
この後、英単語のカタカナ読み機能を追加する時に、自分の場合は、シェルスクリプトを利用しました。
AppleScriptで頑張るか悩みましたが、(あまり詳しくない)シェルスクリプトの勉強も兼ねて。
その時、先にsaykanjiコマンドを定義しておいて良かったと思いました。(alias定義にしなくて良かった、とも思いました。)

でも、ソフトウェアの配布を考えると、all AppleScriptの方が簡単ですね。
インストール場所も選ばず、ダウンロード・解凍して、即利用できるので。
開発はシェルスクリプトで、配布はAppleScriptのdo shell scriptに詰め込み、が良いかもしれません。

schriftschrift 2009/05/22 06:55 なるほど。たしかに、英単語のカタカナ読みなど間に別のスクリプトをかませる場合など、より複雑な処理を行う場合には、間にシェルスクリプトを置くのがかえって分かりやすいかもと思いました。
いずれにせよ、すばらしい情報をありがとうございました。Macでこんなことができるのが楽しくて仕方ありません。

GururiGururi 2009/05/23 00:44 AppleScriptの中で、クリップボードの中身をシェルに渡したい場合はquoted form of を使うと簡単に書けます。例えば
do shell script "echo " & quoted form of (the clipboard as string)
のように。quoted form of (the clipboard as string)を'や"で囲む必要はありません。クリップボードにかぎらずstringを渡せますので大変便利です。

zariganitoshzariganitosh 2009/05/23 06:24 はじめまして、Gururiさん。
おおっー、これ、大変便利です!
quoted form of "abc" → "'abc'"
結果を見る限り「'」で囲まれるようですが、意地悪く「'」を混ぜてもOKでした。(素晴らしい!)
do shell script "/usr/local/bin/saykana " & quoted form of "'abc"
美しくない、間違い易い、"'" & 文字列 & "'"の書き方に、うんざりしていたところです。
これから使いまくります!
ありがとうございました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証