Archives

AITalk WebAPIを使ってwavを生成してs3に保存するaws lambda

LINE BOT AWARDSのハッカソンに参加した。ぷ◯きゅあがタスクの終了や寝る時間などを通知すると同時に音声合成でしゃべってくれる、という(いちおう)親子向けのBOTを作った。

LINE apiはeventに応じてwebhookが飛んでくる仕様になっているため、serverlessのアーキテクチャでシステムを作った。つまりlambda、step functionsをはじめとしたaws漬けだったのだが簡単に優れた設計のアプリが作れて僕スゴいじゃなくてawsマジすごい。

そのソースコードも公開する予定なのだが、スポンサー企業でもあったAITalkさんのAPIを呼んで音声合成したWAVEファイルをs3に保存するところは汎用性が高そうなのでgithubにrepositoryを作った。

https://github.com/Drunkar/aitalk_webapi_wav_generator_lambda

中身もいちおうここに貼っておく。めんどくさかったのは、jsのaws-sdkにはs3にファイルをアップロードする方法がなかった(rubyにはあるみたい)ので、jsのオブジェクトとしてメモリに保持した状態でputObject()することでI got Kotonaki. たぶんstreamを理解している人ならば一時ファイルとして/tmp以下に保存することなくs3にアップロードするコードが書けると思う。


var http = require("http");
var fs = require("fs");
var aws = require("aws-sdk");

var api_url = "http://webapi.aitalk.jp/webapi/v2/ttsget.php";

exports.handler = function(event, context) {
    var request_url = api_url +
        "?username=" + encodeURI(event.aitalk_username) +
        "&password=" + encodeURI(event.aitalk_password) +
        "&text=" + encodeURI(event.text) +
        "&speaker_name=" + encodeURI(event.aitalk_speaker_name) +
        "&volume=" + encodeURI(event.aitalk_volume) +
        "&speed=" + encodeURI(event.aitalk_speed) +
        "&pitch=" + encodeURI(event.aitalk_pitch) +
        "&range=" + encodeURI(event.aitalk_range) +
        "&ext=wav&use_wdic=1";

    var outFile = fs.createWriteStream("/tmp/" + event.filename);
    // start download
    http.get(request_url, function(res) {

        // output as a file
        res.pipe(outFile);

        // download end
        res.on("end", function() {
            outFile.close();

            // open the wav file as a js object and putObject to S3
            var s3 = new aws.S3();
            fs.readFile("/tmp/" + event.filename, function(err, data) {
                if (err) {
                    return console.log(err);
                }
                var params = {
                    Bucket: event.bucket,
                    Key: event.filename,
                    Body: data,
                    ContentType: "audio/wav",
                    ACL: "public-read"
                };
                s3.putObject(params, function(err, data) {
                    console.log(err, data);
                });
            });

        });
    }).on("error", function(e) {
        context.done("error", e);
    });
};

テストイベントを以下のように飛ばせばおk。


{
  "aitalk_username": "",
  "aitalk_password": "",
  "aitalk_speaker_name": "nozomi_emo",
  "aitalk_volume": "2.00",
  "aitalk_speed": "1.20",
  "aitalk_pitch": "0.90",
  "aitalk_range": "2.00",
  "text": "戦争に負けたから堕ちるのではないのだ。人間だから堕ちるのであり、生きているから堕ちるだけだ。",
  "filename": "voice.wav",
  "bucket": ""
}

ec2上のRedmineでプロジェクトを管理しよう!人生という名のp(ry

前回はBitNamiのインストーラを使いましたが、今回は普通にインストールします。

※2013-10-23追記:このやり方だとredmineのdevバージョンがインストールされるみたいなので、svn利用に変更しました。あと2.3.3でも大丈夫っぽいのでそっち使ってます。

インストールしたいのは、

  • Ruby
  • Redmineと必要なbundle
  • redmine_backlogs: v1.0.5    ←    ruby: 1.9.3, Redmine: 2.2.4 or 2.3.2が必要
  • nginx
  • MySQL

です。バージョンの指定がハマりどころですが、言われたら直すの繰り返しでもなんとかなります。

ec2を立ち上げてsshで接続するまではドットインストールのAmazon Web Services入門の#5までを参考に。

まずはいろいろ必要なものと、nginx、MySQLをインストールします。ec2でルートになるには”sudo su”でオッケーです。

$ sudo su
// 注: #はコメントアウトされてしまうので代わりに?を用いてます。
? yum -y groupinstall "Development Tools"
? yum -y install openssl-devel readline-devel zlib-devel curl-devel
? yum -y install mysql-server mysql-devel
? /etc/init.d/mysqld start
? yum install -y nginx
? service nginx start

Ruby 1.9.3のインストールはここを参考にしました。

? yum -y install libxml2-devel
? yum -y install libxslt-devel
? cd /tmp
? wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
? tar zxvf yaml-0.1.4.tar.gz
? cd yaml-0.1.4
? ./configure
? make
? make install

? cd ../
? wget ftp://core.ring.gr.jp/pub/lang/ruby/1.9/ruby-1.9.3-p392.tar.gz
tar xzf  ruby-1.9.3-p392.tar.gz
? ./configure --with-opt-dir=/usr/local --enable-shared --enable-option-checking
? make
? make install

/usr/local/bin/にインストールされてしまったので/usr/bin/にシンボリックリンクを張ります

? mv /usr/bin/ruby /usr/bin/ruby18
? ln -s /usr/local/bin/ruby /usr/bin/ruby
? ruby -v
    ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]

rubygemsとbundleのインストール

? wget http://rubyforge.org/frs/download.php/76729/rubygems-1.8.25.tgz
? tar xzvf rubygems-1.8.25.tgz
? cd rubygems-1.8.25
? ruby setup.rb
? gem -v
    1.8.25
? yum -y install ruby-irb
? gem install rdoc
? gem install bundler

やっとredmineのインストールです。場所はBitNamiを真似て/opt/に置きます。

? cd /opt/
? svn co http://svn.redmine.org/redmine/branches/2.3-stable redmine-2.3
? mv /opt/redmine-2.3 /opt/redmine
? bundle install --path vendor/bundle --without development test rmagick postgresql sqlite

以降のMySQLとかnginxとかの設定は下のページのまま行えばよいかと思います。

さくらVPSで nginx + MySQL + Unicorn + Redmine の運用 | コードを舐める日々

そんで、僕の場合は既にRedmineを使っていたデータがあるので、公式情報を参考にしてそれのリカバリをします。filesディレクトリを置き換えて、DBにバックアップしてたdumpをブッ込めば完成です。

backlogsのインストールはredmineのインストール後、公式の通りにやればできます。

Redmine Backlogs :: Installation

あと、Redmineはそのままだと限りなくダサいので、テーマをインストールすると良いと思います。だいたい見た感じではredminecrmのテーマがかなりいいデザインです。crm用のプラグインも提供されてますが、必要ないのでテーマだけもらいます。

http://redminecrm.com/pages/redminecrm-theme

ダウンロードしたzipを/opt/redmine/public/themesに展開して、管理> 設定> 表示> テーマで変更できます。

backlogsの使い方やその心は@ITの連載がいい感じです。

かんばん!~もし女子高生がRedmineで「スクラム」開発をしたら

これからredmine上でいろんなサービスとの連携とかできたら楽しそうだな―と思います。

amazon ec2でRedmine(BitNami編)

あープロジェクト管理してーわー
そんなお前 見込みアリ

というわけでRedmineを使いたいです。でも余分なパソコンはありません。

でも実は誰でも1台だけ無料で使えます。そう、amazon ec2のマイクロインスタンスならね。

しかしRedmineのインストールはRubyのバージョン指定とかなんやらでやたらと面倒臭いです。以前試行錯誤の果てにec2上でnginx+unicornで動かしていたのですが、もうちょっと設定の過程をすっきりさせたくて再インストールしようかなというところでさっそうと現れたのがBitNamiです。

http://bitnami.com/

なんでもワンクリックでRedmineやwordpressやjenkins等々をec2上に構築してくれるというではないですか。

このページの”Cloud Server”のとこをクリックするだけの簡単な構築作業です。

とはいえこれだけだと余りにも過程が不透明なので、インストーラーを使ってインストールしてみます。

まずec2のマイクロインスタンスを立ち上げてsshで接続するところまではドットインストールのAmazon Web Services入門の#5までを参考に。

マイクロインスタンスのメモリは613MBしかなく、RedmineのBitNamiインストーラを使うには2GBぐらい要るよと言われるので、まずはスワップ領域を確保します。

$ sudo dd if=/dev/zero of=~/swap.0 bs=1024 count=1048576
    1048576+0 records in
    1048576+0 records out
    1073741824 bytes (1.1 GB) copied, 28.9288 s, 37.1 MB/s
$ sudo mkswap ~/swap.0
    スワップ空間バージョン1を設定します、サイズ = 1048572 KiB
    ラベルはありません, UUID=c54b30ec-1727-423e-8f55-ce585a2cffe9
$ sudo swapon ~/swap.0

スワップ領域を1GB確保しました。インストールにはこれで充分でした。確保できていることを確認します。

$ sudo swapon -s
    Filename				Type		Size	Used	Priority
    /home/ec2-user/swap.0                   file		1048572	0	-1

そしたらインストーラをとってきて実行するだけです。超簡単。

$ wget http://bitnami.com/redirect/to/24967/bitnami-redmine-2.3.3-1-linux-x64-installer.run
$ chmod 755 bitnami-redmine-2.3.3-1-linux-x64-installer.run
$ sudo ./bitnami-redmine-2.3.3-1-linux-x64-installer.run

設定に関していろいろ聞かれますが、”English”と”Y”で答えとけば問題ないでしょう。Redmineの通知用のメールアドレスを登録したい場合はインストール中にできます。

これでインストールは終了です。簡単すぎて涙が出ます。

redmineのルートは/opt/redmine-2.3.3-1/になります。MySQLとか必要なものは全部この下にインストールされます。なのでデータベースにアクセスするには、

$ sudo mysql -uroot -p -S /opt/redmine-2.3.3-1/mysql/tmp/mysql.sock mysql

みたいな感じになります。面倒ですね。

普通に使う分にはこれで問題ないのですが、こういうローカルなインストールはなんか気持ち悪くて、バージョンの変更とかいうときに非常に面倒じゃないかと思って、結局またnginx+unicornを使うことにしました。それに関しては次の記事で。