SoLA2-TechBlog

退屈な作業はプログラムに任せましょう!日々の作業に少し工夫を足すだけであなたの時間はもっとクリエイティブになる。

今さらTwitterボットを開発してみた。【part 1】

認証について

ボット用のアカウントに接続する方法はいくつかありますが、ドットインストールでは「TwitterOAuth」というパッケージを用いて認証を行っていましたので、今回はこちらを利用したいと思います。

composerを利用してTwitterOAuthをインストールする

まずはcomposerの公式サイトにアクセスし、「Getting Started」ボタンからページ中段にあるコマンドをPHPがインストールされているローカル開発環境の作業ディレクトリで実行します。

php composer-setup.php --install-dir=bin --filename=composer

composerをダウンロードが完了しましたら、いよいよ「TwitterOAuth」をインストールしていきます。TwitterOAuthの公式サイトにアクセスし、Installationに記述された文をローカル開発環境で実行します。

ちなみにこのcomposerでインストールできるpackageの一覧についてはPackagistというサイトで確認することが出来るそうです。

定型文を呟かせてみる

実装

さてTwitterOAuthのインストールが完了しましたら、まずは簡単なモックを作成してみましょう。プログラムから固定文をボットアカウントにつぶやくだけの仕組みを作ってみたいと思います。

<?php

require_once(__DIR__ . '/twitteroauth/autoload.php');
define('CONSUMER_KEY', '*');
define('CONSUMER_SECRET', '*');
define('ACCESS_TOKEN', '*');
define('ACCESS_TOKEN_SECRET', '*');

アカウント情報はプログラム内で頻繁に利用するため、定義しておきます。こういった定義は、後々増えていきますので、定義用のファイルとして本体から切り離しておきます。

<?php

require_once(__DIR__ . '/config.php');

use Abraham\TwitterOAuth\TwitterOAuth;

//接続
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

$res = $connection->post("statuses/update", [
    'status' => 'さんぷる'
]);

if ($connection->getLastHttpCode() === 200) {
    echo '成功!' . PHP_EOL;
} else {
    echo '失敗!' . $res->errors[0]->message . PHP_EOL;
}

純粋にTwitterへ接続し、サンプルメッセージ「さんぷる」を投稿するだけのシンプルなプログラムですね。ではこれを実行してみましょう。

動作検証

f:id:gootor3030:20170814131224p:plain

コマンドライン上では成功!と表示されました。

f:id:gootor3030:20170814131341p:plain

実際のTwitterでも「さんぷる」と呟かれていますね。

次回予告

今回はとりあえず動くことを目標にコーディングしてきました。次回はこれらのコードをクラス化し今後の機能拡張に向けた準備を整えます。お楽しみに!

AWS上にWEBサービスを公開してみる【part1】

EC2のインスタンスを作成する

私の勝手なイメージだったのですが、この手のクラウド系サービスはコンソールが全て英語だと思ってました。ところが、ログインしてみてびっくり!普通に日本語なのですね。これなら割りとスムーズに事を運ぶことが出来そうです。

まずは仮想マシンの起動を選択してEC2のインスタンスを作成していきます。実はある程度予習してきたので、ここらへんの操作で迷うことはない・・・はずです。

f:id:gootor3030:20170813183308p:plain

仮想マシンのオプション選択

続いてなにやら仮想マシンのオプションを選択する画面です。なんということでしょう。このような画面、私が予習した内容にありません!とはいえとりあえずEC2のインスタンスを立ち上げたいのであればおそらく左側が正解でしょう。

f:id:gootor3030:20170813183449p:plain

インスタンス名の入力

運命の選択を終えると、インスタンス名を入力する画面が表示されました。これは予習した範囲内です。特にこだわりも無かったので、「SampleInstance」と入力して「この名前を使用する」ボタンを押下します。

f:id:gootor3030:20170813183649p:plain

OSとディストリビューションの選択

なにやらOSを選択する画面が表示されました。色々なサイトでAWSについて調査してみたところ、「Amazon Linux AMI」が何かと便利でお勧めだそうなので、とりあえずこれを選択します。ちなみに、Amazon LinuxはRed Hatが元になったそうです。

f:id:gootor3030:20170813183840p:plain

スペックの選択

OSを選択すると、インスタンスタイプの選択と書かれた画面が表示されました。要はスペックを決めてくださいよ、ってことなのでしょう。AWSは従量課金制で、EC2に関してはスペックによって単価が変わるので必要最低限のものを選択したいところです。

ただし、このEC2には無料利用枠(月720時間)という制度が設けられています。今回は常時稼動させないので、無料枠の範囲内で充分ということになります。したがってこの無料枠が適応されるt2.microを選択します。

f:id:gootor3030:20170813184350p:plain

秘密鍵のダウンロード

ここで秘密鍵の登場です。後でSSH接続する際に必要になるので、探しやすい場所に保存しておきます。

f:id:gootor3030:20170813184755p:plain

入力確認

さてここまで入力するともう入力確認のようです。割とあっけなかったですね。ドットインストールで見ていた画面はもっとたくさん入力項目があったのですが、改良されたということですかね。入力項目に間違いが無いことを確認し、このインスタンスを作成ボタンを押下します。

f:id:gootor3030:20170813185053p:plain

インスタンス作成

するとインスタンスを生成中です画面が表示され・・・

f:id:gootor3030:20170813192531p:plain

2,3分ほど待つと

f:id:gootor3030:20170813192548p:plain

インスタンス作成が完了しました!なんということでしょう、ここまで簡単とは。AWS恐るべし・・・

次回予告

さて今回はEC2のインスタンスを作成しました。画像を貼り付けていたら記事が長くなってしまったので、WEBサーバ構築は次回にしたいと思います。お楽しみに!

今さらTwitterボットを開発してみた。【part 0】

定期的にランダムな内容を発言するボットを開発します

薄々と感じる違和感

事の発端は、1ヶ月くらい前でした。元々は動画の企画で、パーソナリティのボットを作成しようというありきたりなモノでした。

でも、ただボットを作成するだけではつまらないので、発言内容を募集することになったんです。募集方法は主に動画のコメントか、募集サイトを開設してそこに視聴者が投稿する方式を採用しました。

この時既に薄々感じていました。ある違和感に・・・。とはいえものづくりは準備段階が楽しいもので、あれやこれやとたくさんアイデアが出てくるものです。それを前にしてもなお、そのような違和感を気にかけられる程、私は玄人ではありませんでした。

違和感の正体

企画の方向性もある程度決まり、そろそろ開発にも着手し始める頃、その違和感は確信に変わっていくのです。

「自動でつぶやく設定とかどこでするんだろう?」

そう、Twitter初心者だった私は愚かにもボット機能は公式で提供している機能だと思い込んでいたのです。見つかるはずのないその機能を探すこと1時間余り・・・私は認めざるを得ませんでした。その非情と向き合う覚悟をすると共に、心の中でこうつぶやくのです。

Twitterが公式で提供しているボット機能なんてなかったんや・・・)

対応策はエンジニアらしく

という訳で!公式で提供されていない以上、対応策は「一般のBOT作成サービスを利用する」か、「Twitterが提供しているAPIを利用して自分で作る」の2択なわけです。今後の事を考えると、呟く内容はDBから取得できるようにしたいので「自分で作る」事にします。

実はAPIとか初めてなんです

お恥ずかしい話なのですが、私はWEBサービスが提供するAPIを利用して開発した経験が無いため、下記の教材を利用しながら開発を進めていきます。言語はPHP(教材が殆どこの言語だったので)、エディタはPHP Stormを使います。

書籍

Amazonでそれっぽい古本を購入しました。合計400円(送料込み)は非常に安いと思うんです!

動画

以前から利用している動画サイト。幅広い知識を手軽に吸収できるので重宝してます。

  • ドットインストール
  • paizaラーニング

開発環境

今回はVagrantでローカル開発環境を立ててそこでデバッグしながら開発していきます。主にドットインストールで学んだ手法です。最終的には今契約しているロリポップのcronに設定しようと思います。

※ちなみにこちらがボットアカウントです。
twitter.com

nicotalkを自分用にカスタマイズしてみよう! 【part4】

音声プレビュー機能の改良

nicotalkを自分用にカスタマイズしてみよう! 【Part 2】 - SoLA2-TechBlogにて「echoseika」と連携し、音声プレビュー機能を作成した事を覚えていますか?その時に音声公開パラメータを適応する課題が残ってましたが、なんとこの度「echoseika」の作者様が自らその機能を追加してくれました!

なので、こちら側もその機能を活用できるように対応しました。ではではこの機能が一体どのくらい便利なのか、実際に動いてるところを見てもらいましょう。

きっとnicotalkを使ったことがある人ならこの便利さを分かってもらえるはずっ!

カスタマイズ内容

さて、新バージョンの機能を利用するに当たり、ソースを以下のように修正しました。

  • 受け渡しパラメータの追加
  • パラメータ受け渡し前後にウェイトを追加
Public Sub previewVoice() '(Ctrl&Shift&V)
    Dim objShell
    Set objShell = CreateObject("WScript.Shell")
    Dim activeRow As Integer
    activeRow = ActiveCell.Row
    
    Dim speed As Integer
    Dim volume As Integer
    Dim pitch As Integer
    Dim intonation As Integer
        
    Dim tgtText As String
    Dim tgtActor As String
    Dim cmdStr As String
    tgtText = ActiveSheet.Cells(activeRow, 7).Value
    tgtActor = ActiveSheet.Cells(activeRow, 17).Value
    speed = ActiveSheet.Cells(activeRow, 11).Value
    volume = ActiveSheet.Cells(activeRow, 12).Value
    pitch = ActiveSheet.Cells(activeRow, 13).Value
    intonation = ActiveSheet.Cells(activeRow, 14).Value
    
    cmdStr = "★\echoseika.exe -cv " & tgtActor & " -volume " & Format(volume / 100, "0.00") & _
    " -speed " & Format(speed / 100, "0.00") & " -pitch " & Format(pitch / 100, "0.00") & " -intonation " & Format(intonation / 100, "0.00") & " " & tgtText
    
    Application.Wait Now + TimeValue("00:00:01")
    
    objShell.Run cmdStr, 1, True

    Application.Wait Now + TimeValue("00:00:01")

    'MsgBox tgtActor & " " & tgtText
    MsgBox cmdStr
    
End Sub

AWS上にWEBサービスを公開してみる【part0】

今更ながらAWSの勉強をします

クラウドなんて言葉とは無縁だった私の所属する部署でも、ついにAWSで稼動するサービスの企画を検討することになりました。さてそうするとクラウドに対する私の知識が乏しい点が若干気になります。

果たして今を生きるSEとしてそれはどうなんだという声が聞こえてきますが、残念ながらどんなに嘆いたところで、AWSの知識はからっきしなのが現状です。という事でまずはAWSの勉強をしていきたいと思います。

目標としてはWEBサービスをAWS上に立ち上げるところまで目指したいです。今回はあくまでAWSの勉強ですので、WEBサービス自体は簡単なものにします。

スケジュール感

企画の話を上司から聞いたとき、うちの部署がクラウドに手を出すこと以上に驚いたことがあります。現在オンプレ環境で動作しているWEBサービスを、9月にはクラウドに上げるという正気を疑う計画だったのです。100歩譲って実績があるなら、もしくはクラウド系の知識に強い人材がいるなら、まだいくらか可愛げがあったのですが・・・

企画もまだ通っていない段階で、しかもAWSのAの字も分からない人たちの集まりで、もちろん実績もない部隊で、9月リリースですか。これだからSEはやめられないんですよ。まったく面白くなってきました!

というわけで、個人的に実施する勉強自体もかなり駆け足で進める必要がありそうです。

勉強の方針

まず、AWSの入門部分の知識については、以前入会した「ドットインストール」と「paizaラーニング」を利用して頭に叩き込むことにします。その次の段階としては、書物でじっくりと学習していきたいところなのですが、前述の通り時間が無いので実践形式でAWSを学んでいきたいと思います。

幸いAWSが提供するサービスを要約してくれた記事を見つけたのでこれを利用しようと思います。8月20日を目処にWEBサービスをAWS上に立ち上げたいと思います。サーバについてはLAMP環境を考えていますが、お財布と相談して業務で利用するWindows Serverを選択することになるかもしれません。

資料作成について

勉強した内容については、おそらく今後の業務で資料作成等に必要となることばかりだと思うので、あらかじめこのブログ(以降の記事)に要点をまとめておこうと思います。

次回予告

次回は早速AWSのアカウントを取得してEC2のインスタンスを立ち上げていきたいと思います。可能であればWEBサーバも立ち上げてブラウザからアクセスするところまで確認します。お楽しみに!

nicotalkを自分用にカスタマイズしてみよう! 【Part 3】

追加機能②「プレビュー機能の追加」

前回は台詞以外のパラメータ「音声効果」や「間」が適応されない版の「音声プレビュー」を追加しましたね。活用の場は限られますが、入力した内容をVOICEROIDが正しく読み上げてくれるかを手早く確認する点では役立ちます。ただし、「音声効果」や「間」を含めて確認したい場合は別の仕組みが必要となります。

そこで、本記事では「音声効果」や「間」も含めて確認できる「簡易プレビュー」機能を作っていきたいと思います。といってもこの機能の為に特別なカスタマイズはしません。今ある仕組みを活用して実現していきます。

簡易プレビュー機能の意義

台本シートのある部分をすばやく確認したい時に、この機能は役に立ちます。従来であれば、台本を出力して「step2」「step3」を実行して、aviutlにて確認していました。この方法だと台本が長くなった場合「step2」で地味に時間がかかるため、ちょこちょこ確認するとタイムロスが大きくなります。

簡易プレビュー機能を使って該当箇所を確認する場合も、実は台本を出力してaviutl上で内容を確認するまでの手順は従来と一緒です。ただし確認に必要な時間を短くする事が出来ます。というのも、この機能を利用することで「step2」の実行時間を短縮する事が可能で、更にaviutlでは選択範囲しか再生されなくなります。

ここまで言うと「簡易プレビュー」がどのような機能なのかを想像できる方もいるかも知れませんね。

簡易プレビュー機能の概要

いよいよ機能の概要について説明します。冒頭でも述べたとおり今回の機能は殆ど既存の機能を利用します。というのもこの「簡易プレビュー」機能は出力する台本の範囲を指定する機能なのです。既存の台本出力機能は台本シートに書かれた全ての台詞を出力しますが、この機能では指定した行だけを出力する事になります。

そもそもstep2は差分のみ処理を行うようになっているのですが、その差分を取るために時間がかかっている節があります。そのため処理対象のファイル数が処理時間のボトルネックになっていたので、ならいっそファイルを削ってあげることで、時間を更に短縮しましょうよというのがこの機能のコンセプトです。

簡易プレビュー機能を作る

では実際にカスタマイズ作業に入りましょう。まずは台本シートに範囲選択用のセルを2つ(出力開始行、出力終了行)用意しましょう。そしてその隣に簡易プレビュー用のボタンも用意します。
f:id:gootor3030:20170808231941p:plain

用意したボタンに紐づくマクロの内容は「台本の出力」ボタンに紐づくマクロをコピーして利用します。後はコピーしたマクロのループ箇所を検索して開始と終了の判定を、先ほど追加したセルの値から取得するように変更すればカスタマイズは完了です。

あまりにもカスタマイズの箇所が少なく、これをそのまま公開するのは若干どうかと思ったので、とりあえず修正箇所だけ紹介します。コピーしたメソッドは「DaihonOutput」です。まずは追加した範囲選択用セルから値を変数に代入する処理を追加します。その後全6箇所のループ(whileループが4箇所、doループが2箇所)の範囲を先ほどの変数を使って調整します。以上です。

非常に簡易的な処置ですがこれで出力範囲を限定した台本を生成することが出来るようになります。

nicotalkのカスタマイズまとめ

さてここまで全4回の記事にわたってnicotalkをカスタマイズしてきましたが、いかがでしたか?今回追加した機能の使用感については追って報告したいと思います。また機会がありましたら今度はuwsファイルのカスタマイズにも手を出してみたいと思っています。

nicotalkを自分用にカスタマイズしてみよう! 【Part 2】

追加機能②「プレビュー機能の追加」

前回までの記事で、nicotalkの前半部分のカスタマイズを実施してきました。この記事では後半部分「プレビュー機能」の追加をしていきたいと思います。プレビュー機能と言っても色々な種類があると思います。取り急ぎ必要になるのは、台詞をその場でVOICEROIDに読んでもらう機能ですね。

音声プレビュー機能を作る

実はろくな技術検証もせずに作ります!なんて記事にしてしまったので、大いに後悔しています。というのもVOICEROIDを外部アプリケーションから操作することは割りと難しいのです。詳しくはVOICEROID+でSkypeメッセージ喋らせる(1) - 謎言語使いの徒然を参照してください。

という訳で作るのは諦めます!

でも音声プレビュー機能が必要なことに変わりは無いので、別の手段を用いて用意しましょう。上記でも述べたとおり、VOICEROIDを外部アプリケーションから操作する事は割りと難しいのです。ですが割りと不可能でもないのです。

私達の考える事は、大体先人の猛者達が挑戦してたりします。その全てが完全な形で見つかる事は無くとも、寄せ集め、組み合わせることでなんらかのヒントが得られる事もあります!

現に、ちょっと調べれば・・・VOICEROID+EXをコマンドラインからしゃべらせる [努力したWiki]のような素晴らしい試みをしているサイトが見つかるのです。こちらで開発されたアプリケーションは、コマンドラインからVOICEROIDの基本的な操作を可能にするそうです。

であれば、我々が作るべきは、エクセル(VBA)からコマンドラインを経由してこのアプリケーションを利用する部分だけで良い訳です。これらの仕組みを1から構築するとなると相当時間が必要になったでしょう。いやぁ非常に助かりました。

では!実際に作ってみましょうか。先ほどのサイトを確認すると、どうやら引数としてキャラ名(大文字のローマ字)と台詞を一緒に渡してあげることで、音声が返ってくるそうです。各キャラクタのサンプルコードがありますね。とても親切設計です。

ちなみに私が所有しているVOICEROIDは茜ちゃんと葵ちゃんなので、動作未検証だそうです。恐るおそるサンプルのコマンドを実行すると・・・正常に音声が返ってきました。素晴らしい。これで音声プレビューは9割完成したと言っていいでしょう。

ではExcelからこのソフトを呼び出すスクリプトを書いていきます。
ついでに現在選択中の行にある台詞及び台詞主名(大文字ローマ字)を渡すようにしました。台詞主名の大文字ローマ字に関しては後ほど台詞シートにて追加していきます。

Public Sub previewVoice() '(Ctrl&Shift&V)
    Dim objShell
    Set objShell = CreateObject("WScript.Shell")
    Dim activeRow As Integer
    activeRow = ActiveCell.Row
    
    Dim tgtText As String
    Dim tgtActor As String
    Dim cmdStr As String
    tgtText = ActiveSheet.Cells(activeRow, 7).Value
    tgtActor = ActiveSheet.Cells(activeRow, 17).Value
    cmdStr = "★\echoseika.exe -cv " & tgtActor & " " & tgtText '★にはパスを記入
    
    objShell.Run cmdStr, 0, True
    MsgBox tgtActor & " " & tgtText
End Sub

こんな感じです。エラー処理とかまったく考えていませんがとりあえず処理が終わったら、台詞の内容がダイアログに表示されるようにしました。またExcel機能で今書いたスクリプトを実行するショートカットを「Ctrl+Shift+V」に割り当てました。

では先ほど後回しにした台詞主名の大文字ローマ字についてですが、あまりいい案が思いつかないので力技です。まずは「調整シート」の適当なところにキャラ名と台詞主(大文字ローマ字)が対応するように表を作ります。
f:id:gootor3030:20170806230601p:plain

続いて「台詞シート」のQ列に、キャラ名(E列)に対応する台詞主(大文字ローマ字)を表示するようにします。
例)IF(ISERROR(VLOOKUP(E5,調整シート!$S$3:$T$4,2,FALSE)),"",VLOOKUP(E5,調整シート!$S$3:$T$4,2,FALSE))

これで準備は完了です。後は対応するVOICEROIDをあらかじめ起動し、音声プレビューを聞きたい行を選択して「Ctrl+Shift+V」を押すと、幸せになれます。おめでとう私、ありがとう私。

f:id:gootor3030:20170806231459p:plain

とはいえ改善の余地はまだまだあります。例えば、音声効果パラメータはプレビューに適応されないのです。こちらはもう少し時間のあるときにどうにかしたいとは思っていますが、台詞が想定した読み方で読まれるのかを確認するためには必要充分な機能になったので一旦完成とします。

次回に続く

プレビュー機能ですが、もう一つ作りたいと思います。「簡易プレビュー」機能です。動画編集ソフトを使ったことがある方にとっては、「範囲選択型の事前レンダリング機能」と言い換えた方がイメージ付き易いかもしれません。この機能は、音声効果パラメータ及び「間」も再現された状態で確認出来るようにします。

私にとっては、今後かなりの頻度で利用することになる機能なのでお楽しみに!