MacがsayするCGI
Mac上で、Apache+CGIを動かして、外部から特定のURLにアクセスが来たら、そこで渡された文字列をsayコマンドに渡してMacから音声を出す、そんなことがやりたくて、作ってみた。まあ作ったってほどじゃない。
以下の「nacookan」のところは各自のOS Xユーザ名に置き換えてね。
sayコマンドの用意
上記に書いたけど、あらためてMountain Lionに合わせて言うと、
- システム環境設定
- 音声入力と読み上げ
- テキスト読み上げ
- システムの声
- カスタマイズ
- 「日本語(日本)」のところにある「Kyoko」を選択
- 「インストールしますか?」と聞かれたらインストールする
- システムの声
- 「Kyoko」を選択
CGIスクリプトの用意
ここからはターミナルの作業。
$ mkdir ~/Sites $ touch ~/Sites/.localized $ mkdir ~/Sites/say $ vi ~/Sites/say/say.cgi
viで以下を記述。
#! /usr/bin/env ruby require "cgi" cgi = CGI.new message = cgi['message'].gsub(/'/, '') system "say '#{message}'" cgi.out("text/plain"){ message }
viを終了させて、以下。
$ chmod +x ~/Sites/say/say.cgi
おわり。
Apacheの用意と起動
$ sudo vi /etc/apache2/users/nacookan.conf
viで以下を記述。
<Directory "/Users/nacookan/Sites/say/">
AddHandler cgi-script cgi
Options MultiViews ExecCGI
AllowOverride none
Order allow,deny
Allow from all
</Directory>
$ sudo apachectl start
Lionまでは、システム環境設定→共有→Web共有で内蔵Apacheの設定ができたんだけど、Mountain Lionでは項目が消えたのでターミナルからやってるわけだ。Apache自体が消えたわけではないんだけどね。
使ってみる
ブラウザのアドレスバーに、「http://(MacのIP)/~nacookan/say/say.cgi?message=テストです」と入れてみる。
Kyokoさんの声(日本語版Siriでおなじみの声)で「テストです」って読み上げられるはず。
どう使うか
自分は、サーバー用途で稼働しているMac mini上でこのCGIを動かしている。別なLinuxサーバーで動いてるJenkinsが、svnへのコミットを検知して自動でビルド&テスト環境デプロイをするようになっていて、それが終わったタイミングでこのURLを叩いてMac miniから音声で通知されるようにしている。
他にも、まあ何か通知が必要なことがLAN内で発生したときに、このURLにメッセージを渡すだけで音声でお知らせしてくれるので、いろいろ使えると思う。
ログとかを監視して何か見つけたときにお知らせとか。天気予報や時報とか。
心配なこと
OSコマンドインジェクションの脆弱性大丈夫なのかな?シングルクォートは消したけど、これだけでいいのかよくわからない。いいやり方あるなら教えて欲しい。
まあ用途的に、広くインターネット上に公開しても仕方ないと思うので、どうせLAN内だけで使うことになると思う。