2014年4月6日日曜日

UnityとPerceptualSDKで音声認識

UnityとOculusでVR世界へ入り浸っていると、手元が見えないし、慣れてないコントローラ渡された時はボタン位置がわからなくて苦労します。

音声認識でボイスコマンドを活用すれば、VR世界の没入感も上がるし、キャラクターが声に反応してくれたらプレゼンスも上がっていいのではと思って、音声認識方法を探してみました。

Intel PerceptualSDKというのがあって、こちらがUnity対応しているので導入が楽そうです。
http://software.intel.com/en-us/vcsource/tools/perceptual-computing-sdk
元はIntelが出すカメラデバイスのためのSDKですが、カメラがなくても音声認識部分は使えます。

参考にさせていただいたサイト
http://izm-11.hatenablog.com/entry/2014/04/03/223114

intelのカメラデバイス以外のマイクを使うために、dllを作り直す必要があります。
VisualStudioExpressでやると、afxres.hがないというのでエラーが出ますが、リソースファイルを開いて
#include "afxres.h"→#include "winres.h" に変えると回避できるとか。
VisualStudioOnlineでProfessionalの体験版を取ってきてもいいです。

サイトを参考にして、自分の環境でdll作りなおして、サンプル持ってきて、音声認識をしても動きませんでした。
原因としては、録音デバイスが2つあると、動かないみたいです。
録音デバイスを使用するマイクだけにしたら音声認識するようになりました。
下記状態です。
コントロールパネル→サウンド→録音

音声認識のマイクで、品質が悪いと結構誤認識して変な言葉で帰ってきます。
自分はPS4付属マイク使っていましたが、ちゃんとしたのに変えたら結構認識が良くなりました。
SONY エレクトレットコンデンサーマイクロホン PC60 ECM-PC60

ガンダムSEEDの世界でラミアス艦長ごっことか、765プロの事務所でアイドル呼んでコミニュケーションとか、夢が広がりますね。

2014年1月4日土曜日

Unityでtwitterに投稿する方法(API1.1)

あけましておめでとうございます!
元日いかがお過ごしでしたか?

お雑煮ですか?

お年玉貰い/あげましたか?

嫁はまだか?

私の元旦といえば・・・

ハッカソン!

大晦日ハッカソンの続きで萌えシタン暴きを何とかすべくプログラミングしていました。

twitterのAPI1.1に変わった部分で、ずいぶん変わったのにググったらAPI1.0の頃の情報が多くヒットして調べるのも手間でした。
しっかり書いて残しておこうと思います。
今回のコード全部はgithubにあげてあります。(絶賛リファクタリング中)
https://github.com/zi-su/unitwit

1.twitterに開発者登録する
まずはAPIを利用するために開発者登録する必要があります。
開発者サイトにアクセスして、右上のアイコンにマウスを持っていきMyApplicationを開きます。
するとCreate a new Applicationという表示が見えるので、それをクリックします。
こういう画面が開くはずです。
必要な項目は
Name アプリケーション名。何でもいいです。
Description アプリケーションの説明。何でもいいです。
Webside アプリケーションがあるサイトのURLのようです。何でも良さそうです。

後は規約にチェック入れて、Captureの数字入力して、Create your applicationをクリックして作成完了です。

2.ツイッターに投稿するためにアプリケーション設定変更
重要
ApplicationType デフォではRead設定ですが、ツイートするにはRead and Writeに変更しなければなりません。
続いて、OAuthToolタブを選択肢て表示されるConsumerKeyとConsumerSecretをメモっておきます。
後でOAuth認証する際に必要になります。

以上でtwitter Application作成の手順は完了です。
実際にUnity上で使用するためのプログラムを書きましょう。

3.Unityからtwitterに画像付きツイートするには
手順の概要としては
twitterにOauth認証のリクエストを送る→アクセストークンが返ってくるので保存する→そのアクセストークンを使用してツイッターにデータを送る。
ねっ簡単でしょ?

3.0
まず単純にtwitterにツイートのみ投稿するためには、AssetStoreを見るとLet's tweet in Unityというアセットが見つかります。
が、このスクリプトはAPI1.0の頃のままなので、現在では使用できません
しかしoauth認証の部分は大丈夫なので、うまくそこだけ頂いてきましょう。

3.1Unityで画像付きツイートするには
Unityで通信するにはWWWクラスを基本的に使うのですが、画像付きツイートしたい場合には使えません。自前でTCP通信でデータを送ります。
WWWForm使っても出来ます。そっちのが楽です。

画像付きツイートするためのURLはこちら
https://dev.twitter.com/docs/api/1.1/post/statuses/update_with_media
なのですが、ExampleRequestのヘッダー情報を見ると
mutipart/form-dataとあります。
この形式に対応できないためWWWやWWWFormを使用した方法ではうまくいきません。
なので自前でTCP通信でデータを送ります。

WWWFormの場合
PNGのバイト列をWWWForm.AddBinaryDataに追加します。
form.headerを取得し、OAuth認証の文字列を設定します。
WWW www = new WWWにformとheaderを渡すことでmultipart/form-dataのヘッダーとして送信されます。

TCPクライアントの場合
TCPクライアントでapi.twitter.comにポート80で接続します。
TCPクライアントのストリームを取得し、StreamWriteを作成して
Exampleのとおりにヘッダー情報を書き込んでいきます。
最後にFlushしてデータを送るとツイッターに画像付きツイートが投稿されるはずです。
注意
  • 12行目には送りたいツイート文字、17行目には画像のバイト文字列を書き込みます。
  • 画像のバイト文字列をBase64に変換した場合は"Content-Transfer-Encoding: base64\r\n";を14行目の後に追加します。
  • Oauth認証に必要なパラメータに"status"は含みません。
  • Content-Length の値は9行目からのヘッダーのbody部分になります。UTF-8のバイト文字列データの長さを指定します。バイト文字列データの長さにせず、文字列データの長さのまま渡していると日本語文字を含んでるとツイートされません。


以上です。
自分がハマった箇所としては
ただのツイートをする分にはWWWとWWWFormを使用することができるのですが、multipart/form-dataには対応できないため自前でTCP通信をする必要がある。
ヘッダーのボディ部分を文字列でつなげて作成して、文字列のLengthでは日本語文字が入るとツイートできない。
そもそもTCP通信もWebプログラミングでAPI使用する考え方が初だった。
ググっても出てくる情報がAPI1.0だったり、PHPやrubyのライブラリを使用していて、本当に必要なヘッダーのデータ形式がわからなかった。
ってところです。
あと、unity twitterとかで調べてもiOSやAndroidでのツイート投稿ばかりヒットして、Standaloneの情報がなかった。
これらのハマりのたび、twitter上で多くの人にアドバイスを頂き、実装できました。
アドバイスを下さった皆さん、本当にありがとうございました。

みなさんのゲームでも画像付きツイート機能を実装して
楽しいゲーム体験を創りましょう!

-----------------ここから個人的oauth認証手順メモ---------------------
・リクエストトークンを受け取る
まずリクエストトークンをリクエストします。
リクエストを送るためのAPIはこちら。
https://dev.twitter.com/docs/api/1/post/oauth/request_token
注意点として、oauth_signatureという認証用コードを作成するために、oauth_signature以外のデータが入った状態の文字列でHMAC-SHA1のキーを生成します。
返ってくるResponceにリクエストトークンと秘密鍵があるのでそれを使って認証用ページを開きます。
http://api.twitter.com/oauth/authorize?oauth_token=ここにリクエストトークン
すると認証するとpincodeが表示されているので、それをプログラムに保存しておきます。

・アクセストークンを受け取る
さきほど入手したpincodeを使って、アクセストークンを受け取ります。
データを送るAPIはこちら
https://dev.twitter.com/docs/api/1/post/oauth/access_token
リクエストトークンの時のデータに加えて
oauth_tokenにリクエストトークン、oauth_verifierにpincodeをそれぞれ入れます。
そしてsignatureの文字列を生成しておきます。
APIに送るヘッダーにするために整形します。
OAuth oauth_consumer_key="...",oauth_nonce="...",oauth_signature="...",oauth_signature_method="HMAC-SHA1",oauth_timestamp="...",oauth_token="...",oauth_version="1.0"
「...」の部分は各自で入れる部分です。
で返ってくるresponceにアクセストークンと秘密鍵とユーザーIDとスクリーンネームがあります。
-----------------ここまで個人的oauth認証メモ---------------------



2014年1月1日水曜日

大晦日はお楽しみでしたね

あけましておめでとうございます!
今年もよろしくお願いします!Oculusをよろしくお願いします!

さて、皆さん大晦日どう過ごしました?

ガキ使?

紅白?

いいや・・・大晦日といえば・・・

ハッカソン!

朝10時ごろに起きてから、大晦日ハッカソンをやっていました。
その模様は #大晦日ハッカソン でも見てください。
特に制限なく各自が自宅で緩くやるハッカソンです。

Oculusゲーム4本ぐらい作ろうとやっていました。
できあがったものを紹介していきます。


一つ目!ジャンピング!

ダウンロード先
カーソルキーで移動、白板に乗ると自動でジャンプ。
oculus被って視線変更。360パッド対応。

oculus被って頂上目指してジャンプしていくよくあるゲーム。
二時間ほどで出来ました!
ジャンプ処理でちょっと勘違いしたとこで、OnTriggerEnterの瞬間に
rigidbody.AddForce(force, ForceMode.Impulse);
とするのを、めり込んでたり直前の落下速度が残っていたりでジャンプ力が一定にならなかった。
AddForce前に座標を修正、rigidbody.velocity = Vector3.zeroで初期化して一定になる。
数あるOculusゲームでもジャンプの浮遊感と落下感による緊張が、大変よいものになります。これは真剣に作りこんでいけばかなり化ける予感がします。




二つ目!萌えシタン暴き!
oculus被ってミクさん見つめてる時、じっと胸見たり、パンツ覗こうとしたりを検知して
その瞬間をスクショとともにツイッター投稿する悪魔の所業





完成しませんでした!!!!
twitter投稿の機能実装が思ったより理解が進まなくて、元旦ハッカソンで挽回したい。

俺達のハッカソンは始まったばかりだ!!!

2013年12月25日水曜日

Unity Advent Calendar 25日目

この記事は Unity Advent Calendar 25日目の記事です

メリークリスマス!

Unity Advent Calendar 25日目の担当@Zi_suです。
ネタ何にしようかな、自作してきたスクリプトとかゲームとか色々まとめて記事を書こうかなとか思っていましたが
突如現れたこのキャラについて書くしかないと天の声がしました。


そう!オープンソース系ヒロインのユニティちゃんです!

ユニティちゃん基本情報
ゲームエンジンunityが贈るオープンソース系ヒロイン!
本名:大鳥こはる
声優:角元明日香(かくもとあすか)さん
誕生日:8/13
キャラデザ:ntnyさん









オープンソース系ヒロインのユニティちゃんでどんなゲームを作っていこうかと、想像が膨らみますね。
イラストと3Dモデルからどんなゲームで活躍してくれそうか想像していきましょう。

力強い目!
これはもうアクションや格ゲーの目ですね
立派な中段蹴り!揺れ物も無いので軽そう!左手が蹴りの勢いに任せて逃げてるのが女の子っぽい。脇も空いている。

かわいい。3Dアドベンチャーもいけます。ラブデスとか。エロはunity仮面が釘刺してましたね。








バスケットボール?が似合う。スポーツゲームもいけます。

オープンソース系なだけあって結構色々活躍してくれそうですね。

プログラミング初めて、ゲーム作ろうってなって始めはコマンドプロンプトに文字出してダンジョンRPG創るのも楽しいのですが、
頭のなかで拡がる世界を作ろうと画像を出して、3Dモデルを出して、スキンアニメーション入れて、エフェクト考えてってしていくと、ゲームルール考える以外のところに労力割かれて、しかもそれら専門分野化してるしひたすらハードルが上がっていきます。
サンプルで出るモデルが可愛く無いとやる気も上がらないでしょう。嫁への愛にまさるやる気はないんです。
MMD4Mecanim+Unity+Oculusで嫁召喚してキャッキャしながら楽しく学習ができる時代がきてます。MMDモデルだと様々な権利が絡んでくるとこですが、ユニティちゃんならオープンソース系を謳っているし、もっと気軽に使えるでしょう。
3Dモデルで配布されて、モーション、フェイシャルも自由に作れるのか気になるところ。

まだまだユニティの勢いは止まりませんし、ゲーム外で使われるケースも増えてます。
色んなデバイスの対応が容易ってのも大きいです。Noviant Falconの正しい使い方とか、超音波収束装置とか。KickStarterで出てくる色んなデバイスとかもunity対応してくるでしょう。
fuzeなんてイベントもありますね。

やりたいなと思ったら、個人で即実装して人に見せて、どんどんスピード上げてリアル充実させましょう。

------------------------終わり----------------------

ユニティちゃん想像ばっかりしてても仕方ないので、unity2Dの機能使ってスプライトのスクリプト調べがてら、ここ一年ぐらいゲーム作ってなかったし五時間ぐらいかかってしまってユニティちゃんで2Dゲームやってみたのがこちら。
画像クリックで別ウィンドウで開きます。
操作方法:←→キーで移動、↑キーでジャンプ
CommingSoonのロゴマークを集めましょう。

使用したアセット類
NGUIは説明不要として、RotorzTileSystemは、unityエディター上でタイルマップ作るのに便利なアセットです。

こんな画面でブラシでタイルを選択して、なぞるだけでマップが出来ます。
タノシイ!✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

2013年12月14日土曜日

初めてのOculusアプリ開発

久しぶりの更新です。
Oculus Rift Advent Calender 2013の14日目を担当します。@Zi_suです。
今回、初めてのOculusRiftアプリ開発して感じたことを書いていきます。

Oculusを買って開発しようとなったのは第一回Oculus Game Jamがきっかけです。unityの対応がとても手軽、テレビ画面を見るのとは違う体験ができる。目の前に3D美少女が現れる。未来のゲームきたぞ!と熱くなりました。共に参加していた皆様ありがとうございました。

開発キットが届いてから何を作ろうかと想像をふくらませ、いっしょにトレーニングを参考に筋トレのやる気を引き出すものにしようと至りました。
プログラマーって座りっぱなしでおやつに飲み物自由なのが多いせいかお腹まわりがどんどんマシュマロ男子になっていくので、たるんだお腹を鍛える腹筋トレーニングを目指しました。たるんだお腹何とかするなら有酸素運動ですけど。

そして出来上がったものがこちら。
MikuMikuHukkin-α

1.開発経緯
 実は腹筋ではなくダンベル持ち上げるアームカールを、ミクさんをお姫様抱っこしてるように見せよう!と開発開始しました。kinect使用してみて、部屋が狭すぎてろくにキャプれない。何とかキャプれてもアームカールの動きと相性が悪いのか飛びまくる。お姫様抱っこなんて幸せな気分にもなれず。鉄ダンベルの感触がとても気分を盛り下げる。
 LeapMotionも考えたが、力尽きて落とした時とかに危険。恐らく手の認識が出来ない。kinectを使わず、素直にヘッドトラッキングを利用した腹筋トレーニングへ変更。
 思ったよりも、腹筋の動作で首を持ち上げるのと起き上がる動作に違和感を感じなかったので続行。あれこれモーフ入れたり、喋らせようとしたり調べながら一週間ほどでα版として出来ました。

2.開発してみて
 oculus側のスクリプトとか設定とかホント何もせずにprefab放り込んで、MainCamera消したら、もう画面がoculus用になったので導入とても楽でした。
ただ、何かoculus付けて画面を確認すると、両目で違和感がある。左目カメラと右目カメラの配置とミクさんの配置の関係で視界に差がありそう。
 腹筋回数のHUDとか出そうかと思ったけど、ゲームゲームしてないほうが体験として良くなるかなと思って入れませんでした。実際ないほうがミクさんに集中できていいですね。
 ヘッドトラッキング方向にレイを飛ばして、ミクさんの顔周りとあたったら、照れモーフをPlayMakerから設定。これも遷移図でみるとわかりやすくていい。
 メガネかけてるとoculus被るときメガネ外して、またつけてってのがとても面倒う。
これはもうレーシックとか裸眼視力上げるしかない。コンタクトにするか。
 アドベントカレンダー初日の@hecomiさんのリップシンク記事を見て、ミクさんにしゃべってもらうのも、スクリプト入れて、Talkメソッドを一回呼ぶとOKで凄い。@hecomiさんありがとうございます。

3.まとめ
 初めてのoculusアプリ開発でしたが、ほとんど困ることはなく、やりたいなと思ったことはググったり、ツイッたりしたらoculusクラスタの皆さんが書いていたことが多くてとても助かりました。コミニュティの力って凄いです。
 oculusでVR世界に入ってる感動が強いので、それなりに景観を作らないと割りと冷めた気分になってしまいがちでした。背景ブルースクリーンとか、ベッドとミクさんだけとかだと慣れると冷めます。異空間とか異世界感とかピクサー感を出していくとより楽しめそうに思います。
 Oculusで拡がる新しい体験を目指して、今後も開発していきます。kinect2と広い部屋でOcueamClubがやりたいですね^^

明日は@Wizapplyさんです。よろしくお願いします。
 



2013年8月27日火曜日

Redmineインストールメモ

自分でRedmine使用するために参考にしたサイト

Redmine本家
http://redmine.jp/guide/RedmineInstall/

MySQL入れる手順。mysql56が最新のようでそっちに変えてインストールした。 http://d.hatena.ne.jp/heavenshell/20120814/1344952129

Redmine立ち上げる手順。rakeとか何とか色々。 http://qiita.com/janus_wel/items/06dae0dec1ff1a886d54

2013年7月25日木曜日

LeapMotion+Unity ジェスチャー閾値の設定

一部で話題にLeapMotionが発売開始されました。
手や指、道具(鉛筆など細長い物)を認識して位置や方向を高精度で取得できるデバイスです。
kinectの手指限定版みたいなものです。
大いに期待して開発者登録を済ませDevKitの頃から触っていくなかで、PVのようにスラスラと思うがままに操作ができる夢のデバイスかという、その幻想はぶち殺されたわけでした。

製品版が日本にも届きはじめてアレコレと各所で記事が上がって賑わっているのを見て、私も参加させろと記事を書くことにしました。

導入記事などはあちこちで書かれていますので、今回はドキュメントから見つけたジェスチャーの閾値設定の変更方法をご紹介します。
C#版のAPIReferenceでUnity上で動作を確認しています。
ドキュメントの場所は
docs/Languages/CSharpandUnity/API/class_leap_1_1_config.html

スワイプジェスチャーを試していて、かなり早く動かさないと認識してくれない。NUIとしてつかれてしまって話にならない。閾値の設定変更があります。
Leap.ControllerクラスのConfigプロパティから毎フレーム基準値を変更します。
基準値変更関数
Config.SetFloat(string key, float value);
変更した基準値をセーブする。
Config.Save();

実際のコードにするとこのようになります。

private Leap.Controller controller;
//初期化時
public void Start(){
    controller = new Leap.Controller()
}

//毎フレーム更新処理
public void Update(){
    controller.Config.SetFloat("Gesture.Swipe.MinLength", 0.0f);
    controller.Config.SetFloat("Gesture.Swipe.MinVelocity", 10.0f);
    controller.Config.Save();
}

どうやら毎フレーム設定する必要があるようです。そこに気をつけてください。

スワイプジェスチャーの場合の設定だけですが、ドキュメントには全部の設定可能なパラメータが載っています。納得いく認識になってない方は、色々調整してみてはいかがでしょうか。


プロモーションビデオに出てるようなスラスラと思うがままに動かすには、パラメータの調整やアルゴリズムの最適化などソフトウェア側で工夫する必要がありそうですね。



このガジェットでエラーが発生しました